Excel VBA:合并“For Each”块

时间:2016-07-17 12:01:13

标签: excel vba excel-vba foreach

我发现两个数组的连接/追加对我的例子来说过于繁琐。但是如何在一个块中使用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

2 个答案:

答案 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

说明:

  1. Join函数将数组的所有元素组合成一个长字符串。
  2. Split函数与您最初使用的array函数非常相似。但是,数组要求您将项目列在用逗号分隔的单独字符串中。 Split需要一个长字符串,其中选择一个字符来分隔所有元素。
  3. 警告:在拆分列表中明智地选择要使用的字符,以分隔该列表中的所有元素,并确保永远不会在列表的任何元素中找到此字符。我选择了/字符,因为它不能用于表格的名称。替代字符可以是\*,也可以是ChrW(12484)之类的非常奇特的字符。

    它肯定不像@Garys-Student提供的其他解决方案那样简单(因此可能“视觉上吸引人”)。然而,这个解决方案避免了Arrays函数,因此我们可以绕过variant类型的变量。这同样适用于For Each...循环。它还需要variantobject类型的变量。所以,我用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