我刚刚开始使用VBA。
我有一个包含许多编号表(1,2,3,4等)的工作簿。
我现在已经阅读了符合以下条件的资格工作表:
Dim 1 As Worksheet: Set 1 = ThisWorkbook.Worksheets("1")
然后将其称为:
1.Range("B15").Value
比激活它更快(正如我所做的那样),例如。
Worksheets(1).Activate
我想通过循环动态访问我的工作表,如:
Worksheets(i).Activate
可以使用Qualifying方法吗?我被卡住了。
答案 0 :(得分:0)
我不会使用数字作为变量名。您可以通过两种方式遍历工作表集合 - 第一种方法更有效率我相信,但怀疑您会注意到差异。
正如您所说,很少需要实际激活工作表。
Sub x()
Dim ws As Worksheet, i As Long
'option 1
For Each ws In ActiveWorkbook.Worksheets
ws.Activate
ws.Range("A1") = 1 'no need to activate first
Next ws
'option 2
For i = 1 To ActiveWorkbook.Worksheets.Count
Worksheets(i).Activate
Next i
End Sub
答案 1 :(得分:0)
工作表有一个索引,它是它们当前在工作簿中的顺序。所以最左边的工作表是Worksheet(1)。这不一定与例如工作表(" Sheet1")或工作表(" 1")。
说我有床单" 2" ," 1"," 3",按工作簿中的顺序:
然后运行以下命令:
bit
你得到:
注意:您还可以在工作表集合上Option Explicit
Public Sub test()
Dim arr(), i As Long
arr = Array("1", "2", "3") '<== Sheet names
Debug.Print "Looping by name: "
For i = LBound(arr) To UBound(arr) '<== Looping by name
Debug.Print ThisWorkbook.Worksheets(arr(i)).Range("A1").Value
Next i
Debug.Print String(40, Chr$(61))
Debug.Print vbNewLine
Debug.Print "Looping by sheet index: "
For i = 1 To ThisWorkbook.Worksheets.Count '<== Looping by index (order from left to right)
Debug.Print ThisWorkbook.Worksheets(i).Range("A1").Value
Next i
End Sub
循环,其顺序与跳过任何图表工作表对象的索引相同。
答案 2 :(得分:0)
一切都很简单:
1)当您传递字符串(例如,&#34; 1&#34;)时,您指的是工作表的名称
2)当你传递号码(比如1)时,你指的是表格中的位置&#39;集合。
重要的是要了解什么是表&#39;集合 强>
有几种类型的工作表:工作表,图表工作表,对话框工作表(还有两种类型的宏工作表;您可以通过right-click sheet's tab -> Insert
查看所有五种工作表)。因此,了解使用哪个集合非常重要。
说,你有四张纸(从左到右):
因此,可以通过Sheets
集合枚举所有工作表。因此:
Sheets(1)
返回&#34; dialog1&#34;对话表Sheets(2)
返回&#34; sheet1&#34;工作表Sheets(3)
返回&#34; chart1&#34;图表Sheets(4)
返回&#34; sheet2&#34;工作表如果您只需要收集图表,请使用Charts
集合。在我们的例子中,图表(1)将返回&#34; chart1&#34;图表。
如果您只需要收集工作表,请使用Worksheets
集合。在我们的案例中,Worksheets(2)
将返回&#34; sheet2&#34;工作表。
对话框表也是如此 - 使用DialogSheets
集合(虽然它在IntelliSense中不可见,但您可以看到它:F2 -> Right-click -> Show Hidden Members
)。
最后但并非最不重要的是,每张工作表都有Index
属性。但要小心它,因为它返回Sheets
集合中索引的值。这意味着在我们的情况下Worksheets(2).Index
将返回4。