这应该很容易。我想减少代码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的“模块”部分的子例程下运行大多数代码。
答案 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个,则仍然存在问题。