避免在具有可变范围的VBA Excelmacros中select

我在提问下如何避免使用在Excel VBAmacros中select ,但仍然得到“应用程序定义或对象定义的错误”。

我的macros假设检查行中的值,将其与设置值进行比较,如果值等于,则将行复制到另一个表。 我试图避免使用.Select命令,但无论我尝试我收到错误。

这是我的最后一个版本:

Counter2 = 17 For Counter1 = 12 To 150 Dim S As Worksheet Dim R As Worksheet Dim SL As Range Dim RL As Range Set R = Sheets("Front") Set S = Sheets("CHECK LIST") Set SL = S.Range(Cells(Counter1, 1), Cells(Counter1, 10)) Set RL = R.Range(Cells(Counter2, 1), Cells(Counter2, 10)) Set curCell = Worksheets("CHECK LIST").Cells(Counter1, 6) Set checkCell = Worksheets("Front").Cells(3, 5) If curCell.Value = checkCell.Value Then With S .SL.Copy End With With R .RL.PasteSpecial End With Counter2 = Counter2 + 1 End If Next Counter1 

这是在范围内使用variables(Counter1,Counter2)吗?

错误可能是由这段代码中的CopyPasteSpecial行引起的:

  With S .SL.Copy End With With R .RL.PasteSpecial End With 

一旦Set了范围variables,Excel就知道哪个工作表和哪个工作簿包含该范围variables。 如果你想对范围做些什么,那么你不需要包含工作表。 所以,在你的代码中,你只是使用

 SL.Copy RL. PasteSpecial 

想一想,如果你在一个应该在外面的循环里面有任何代码,总是一个好主意。 在你的代码中,你可以在循环中Set你的工作表variables,但是在循环之前应该这样做。 添加对你的文章的评论,你的代码应该改为:

 Dim S As Worksheet Dim R As Worksheet Set R = Sheets("Front") Set S = Sheets("CHECK LIST") Counter2 = 17 For Counter1 = 12 To 150 Dim SL As Range Dim RL As Range Set SL = S.Range(S.Cells(Counter1, 1), S.Cells(Counter1, 10)) Set RL = R.Range(R.Cells(Counter2, 1), R.Cells(Counter2, 10)) Set curCell = Worksheets("CHECK LIST").Cells(Counter1, 6) Set checkCell = Worksheets("Front").Cells(3, 5) If curCell.Value = checkCell.Value Then SL.Copy RL.PasteSpecial Counter2 = Counter2 + 1 End If Next Counter1 

PasteSpecial方法有几个参数:

 .PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, _ Transpose:=False 

如果你不使用这些,那么也许你可以做一个“正常”的复制和粘贴?

 SL.Copy RL