Excel VBA:在“For Each”块中合并迭代组

我发现两个数组的连接/附加对于我的例子来说太麻烦了。 但是如何在单个块中使用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 

你总是可以你的小数组组合成一个超级数组。 例如:

 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 

只是要投入另一个解决scheme:

 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. 连接函数将数组的所有元素合并为一个长string。
  2. Split函数与您最初使用的数组函数非常相似。 然而,数组要求您将项目列在用逗号分隔的单独的string中。 拆分期望一个长string,其中select一个字符来分隔所有元素。

小心:在分隔列表中明智地select字符来分隔列表中的所有元素,并确保在列表的任何元素中都找不到该字符。 我select了/字符,因为它不能用于表单的名称。 替代字符可以是\*或像ChrW(12484)那样非常奇特的东西。

这当然不是像@ Garys-Student提供的其他解决scheme那样简单(因此可能“视觉上吸引人”)。 然而,这个解决scheme避免了Arraysfunction,因此我们可以绕过typesvariables的variantFor Each...循环同样适用。 它还需要typesvariantobjectvariables。 所以,我用For ... Next循环replace了这个。

我不知道我是否会使用这种结构或其他解决scheme。 也许这个答案在速度和开销方面更好。 然而,另一种解决scheme肯定是更快的编码,更容易阅读。 这真的是值得的潜在好处?

更新:

总之,下面的sub是重写你原来的post,完全一样。 然而,它没有使用variablesvariables(这减less了开销,因此是有利的)。

 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