避免在具有可变范围的VBA Excel宏中选择

时间:2015-07-01 15:41:49

标签: excel vba excel-vba

我正在关注问题How to avoid using Select in Excel VBA macros下的建议,但仍然会收到“应用程序定义或对象定义的错误”。

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

这是我的上一个版本:

.gitmodules

这是否与Range中的变量(Counter1,Counter2)的使用有关?

1 个答案:

答案 0 :(得分:1)

错误可能是由此代码块中的CopyPasteSpecial行引起的:

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

一旦有Set范围变量,Excel就会知道哪个工作表和哪个工作簿包含该范围变量。如果您想对该范围执行某些操作,则无需包含工作表。因此,在您的代码中,您只需使用

SL.Copy
RL. PasteSpecial

如果你在循环中有任何应该在外面的代码,那么总是一个好主意。在您的代码中,您Set循环中的工作表变量,但这应该在循环之前完成一次。添加对帖子的评论,您的代码应更改为:

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