PasteSpecial两次使Excel VBA崩溃

人气:983 发布:2022-10-16 标签: excel copy copy-paste vba crash

问题描述

我一直在寻找在EXCEL VBA宏中多次使用.PasteSpecial的解决方案。 我的报告有时可能有数千行。在这些报告中有两列,我需要合并这些列,以便如果一列有空格,我想要第二列中的值;否则,只保留第一列中的值。我需要在两个不同的地方涂两次这个。这些都被塞进了一个更大的代码中。

我的解决方案是将.PasteSpecial用于跳过空白(&p;)。EXCEL处理起来很快,比逐行循环快得多。问题是代码总是使EXCEL崩溃。

调试后,以下是我目前了解到的情况: *第一个.PasteSpecial总是有效的,但当它到达第二个.PasteSpecial时,它总是失败。 *我尝试在第一个.PasteSpecial之后停止,然后单步执行代码,在单步执行第二个.PasteSpecial之后,代码运行得很好。 *如果我单步执行第二个.PasteSpecial,它就像没有任何错误一样工作-但如果我像正常一样运行代码,它就会崩溃。 *我在代码中交换了两个.PasteSpecials的顺序。当我这样做时,它不再崩溃在有问题的.PasteSpecial上,但它确实崩溃在原来工作的.PasteSpecial上。

基于此,我知道问题在于Excel不喜欢在代码中两次使用.PasteSpecial。还是找不到附近的工作。我试过清空剪贴板,但我不知道如何设置数组,更不用说这对这么多数据是否有效。有人知道解决方案或解决办法吗?

以下是我的.PasteSpecial代码:

MainSheet.Range("N:N").Copy
MainSheet.Range("P:P").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=True, Transpose:=False

MainSheet.Range("R:R").Copy
MainSheet.Range("Q:Q").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=True, Transpose:=False

推荐答案

编辑:

下面是一个比我最初找到的解决方案更可靠的更好的答案。这是从法内杜鲁的回答中得到的一些建议的改编。这种解决方案对资源的消耗更大;然而,就目前而言,它可靠地执行任务(而不会崩溃)。我希望有一个比行循环更好的答案;然而,这确实满足了我的操作。感谢您的帮助!

    Sub copyColumnsArray()
 Dim lastR As Long, arrCopy
 
 lastR = MainSheet.Range("N" & rows.count).End(xlUp).row
 arrCopy = MainSheet.Range("N1:N" & lastR).value 

Dim ArrayIndex as Variant
Dim RowCount as String
RowCount = 1

For Each ArrayIndex in arrCopy
  If ArrayIndex = "" then
    RowCount = RowCount +1
    'Skip Blank
   else
    MainSheet.Range("P"+RowCount).value = ArrayIndex
    RowCount = RowCount + 1
   end if
 Next
 

 lastR = MainSheet.Range("R" & rows.count).End(xlUp).row
 arrCopy = MainSheet.Range("R1:R" & lastR).value

RowCount = 1

For Each ArrayIndex in arrCopy
  If ArrayIndex = "" then
    RowCount = RowCount +1
    'Skip Blank
   else
    MainSheet.Range("Q"+RowCount).value = ArrayIndex
    RowCount = RowCount + 1
   end if
 Next

End Sub

408