我发现两个数组的连接/追加对我的例子来说过于繁琐。但是如何在一个块中使用For Each迭代两个工作表数组(如何缩短以下代码)?
arr1 = Array("Sheet2", "Sheet3")
arr2 = Array("Sheet5", "Sheet6")
For Each sh In Sheets(arr1)
sh.Visible = True
Next sh
For Each sh In Sheets(arr2)
sh.Visible = True
Next sh
答案 0 :(得分:2)
您始终可以将小阵列组合成超级数组。例如:
Sub Klai()
arr1 = Array("Sheet2", "Sheet3")
arr2 = Array("Sheet5", "Sheet6")
arr3 = Array(arr1, arr2)
For Each a In arr3
For Each b In a
MsgBox Sheets(b).Name
Sheets(b).Visible = True
Next b
Next a
End Sub
答案 1 :(得分:2)
只是提出另一个解决方案:
Option Explicit
Sub tmpSO()
Dim lngItem As Long
Dim strArray() As String
Dim strOneLongList As String
Dim arr1 As Variant, arr2 As Variant
'Your starting point
arr1 = Array("Sheet2", "Sheet3")
arr2 = Array("Sheet5", "Sheet6")
'Bring all of them together into one long string containing all sheets
strOneLongList = Join(arr1, "/") & "/" & Join(arr2, "/")
MsgBox "This is what strOneLongList currently looks like:" & Chr(10) & Chr(10) & strOneLongList
'Convert the list into a string array with four elements
strArray = Split(Join(arr1, "/") & "/" & Join(arr2, "/"), "/")
For lngItem = 0 To UBound(strArray)
ThisWorkbook.Worksheets(strArray(lngItem)).Visible = True
Next lngItem
End Sub
说明:
警告:在拆分列表中明智地选择要使用的字符,以分隔该列表中的所有元素,并确保永远不会在列表的任何元素中找到此字符。我选择了/
字符,因为它不能用于表格的名称。替代字符可以是\
或*
,也可以是ChrW(12484)
之类的非常奇特的字符。
它肯定不像@Garys-Student提供的其他解决方案那样简单(因此可能“视觉上吸引人”)。然而,这个解决方案避免了Arrays
函数,因此我们可以绕过variant
类型的变量。这同样适用于For Each...
循环。它还需要variant
或object
类型的变量。所以,我用For ... Next
循环替换了这个。
我不确定我是否使用这种结构或其他解决方案。也许这个答案在速度和开销方面更好。然而,另一种解决方案肯定是编码更快,更容易阅读。这真的值得潜在的好处吗?
简而言之,以下子文章是对原始帖子的重写,并且完全相同。然而,它没有使用变量变量(这减少了开销,因此是有利的)。
Dim lngItem As Long
Dim strArray() As String
strArray = Split("Sheet2/Sheet3/Sheet5/Sheet6", "/")
For lngItem = LBound(strArray) To UBound(strArray)
ThisWorkbook.Worksheets(strArray(lngItem)).Visible = True
Next lngItem