避免使用worksheet.activate来执行代码

时间:2019-05-29 09:20:24

标签: excel vba

这应该很容易。我想减少代码worksheets("Sheet1").activate的使用,因为它麻烦且经常出错,但是我尝试过的所有尝试都行不通。到目前为止,我已经使用了set worksheet选项和with worksheet选项,但是除非我严格使用Excel上的工作表1,否则代码不会执行。

我已经尝试了此链接中列出的某些选项,但没有一个起作用:How to avoid using Select in Excel VBA。我真的开始认为我需要一直使用激活。

例如,类似以下代码:

Sub test()
Dim Cols As integer
Cols = Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count
End sub

我希望即使我不在Sheet1上也可以执行此代码,因为我已经特别定义了必须在其中执行的工作表。但是,除非我在该工作表上,否则代码将无法正常工作。作为背景信息,我在VBA的“模块”部分的子例程下运行大多数代码。

2 个答案:

答案 0 :(得分:2)

您即将正确地做到这一点。

您需要记住要为每个范围对象引用WB和WS。否则,VBA将引用活动 WB和WS

Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count中,我计算了两个需要引用的Cells范围对象。
此外,没有为您要参考的工作表指定工作簿。如果在活动的工作簿中没有名为“ Sheet1”的工作表,则会出现下标超出范围错误。

为避免此类错误,优良作法是使用With...End With语句。这样,您只需先指定工作簿和-sheet,就可以防止代码混乱。

因此,应该是:

With Workbooks(REF).Sheets("Sheet1")
    .Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight)).Count
End With

答案 1 :(得分:1)

看看这是否有助于了解缺失的内容:

Option Explicit
Sub test()

    'Your code:
    Cols = Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count 'Cells inside the range are not qualified

    'Corrected code:
    Cols = Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(1, 1), Worksheets("Sheet1").Cells(1, 1).End(xlToRight)).Count

    'Above code is too long right?

    'Option 1        
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    Cols = ws.Range(ws.Cells(1, 1), ws.Cells(1, 1).End(xlToRight)).Count

    'Option 2
    With ThisWorkbook.Sheets("Sheet1")
        .Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight)).Count
    End With

    'Changing your code works with any option:
    With ThisWorkbook.Sheets("Sheet1")
        .Cells(1, .Columns.Count).End(xlToLeft).Column 'This option goes from right to left to find the last column with data
    End With

End Sub

此外,始终限定工作表和工作簿似乎足以满足工作表的要求,但是,如果您使用的工作簿超过1个,则仍然存在问题。