【问题标题】:Excel VBA - Sheets(Arrary("Sheet2","Sheet3")) using a variable for sheet namesExcel VBA - Sheets(Array("Sheet2","Sheet3")) 使用工作表名称的变量
【发布时间】:2012-02-01 02:06:28
【问题描述】:

我想编写以下代码

Sheets(Arrary("Sheet2","Sheet3")).Select,通过为工作表名称创建一个变量来替换"Sheet2","Sheet3"。

Sub SelectMultipleSheets()

  Dim sSheets as String
  Dim intSheet As Integer

    sSheets = ""

    For intSheet = 1 To Sheets.count

        If Sheets(intSheet).Name <> "Sheet1" And intSheet <= Sheets.count Then

            Sheets(intSheet).Cells.Hyperlinks.Delete 'deleting hyperlinks

            sSheets = sSheets & Chr(34) & Sheets(intSheet).Name & Chr(34) & ","

        End If

    Next

    sSheets = Left(sSheets, Len(sSheets) - 1)
    Sheets(Array(sSheets)).Select

End Sub

我收到一条错误消息“下标不在范围内。我该如何解决这个问题?谢谢

【问题讨论】:

    标签: excel arraylist vba


    【解决方案1】:

    当你在这一行建立数组列表参数时

    sSheets = sSheets & Chr(34) & Sheets(intSheet).Name & Chr(34) & "," 
    

    您实际上是在创建一个以逗号分隔的字符串变量,而 Excel 无法知道您实际上是指以逗号分隔的字符串列表。

    你可以像这样直接创建数组来绕过它。

    Option Explicit
    
    Sub SelectMultipleSheets()
        Dim intSheet As Integer
        Dim arSheets() As String
        Dim intArrayIndex As Integer
    
        intArrayIndex = 0
    
        For intSheet = 1 To Sheets.Count
    
            If Sheets(intSheet).Name <> "Sheet1" Then
    
                Sheets(intSheet).Cells.Hyperlinks.Delete 'deleting hyperlinks
    
                ReDim Preserve arSheets(intArrayIndex)
                arSheets(intArrayIndex) = Sheets(intSheet).Name
                intArrayIndex = intArrayIndex + 1
            End If
        Next
    
        Sheets(arSheets).Select
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      不能那样做,即使看起来应该可以。相反,下面的代码利用 Select's Replace 参数添加到循环中的选择中。 boolNoSelectionYet 变量确保它不会添加到循环开始之前存在的选择中,例如,如果在例程开始时选择了 Sheet1,您不希望它保持选中状态。

      Sub SelectMultipleSheets()
      Dim intSheet As Integer
      Dim boolNoSelectionYet As Boolean
      
      boolNoSelectionYet = True
      For intSheet = 1 To Sheets.Count
          If Sheets(intSheet).Name <> "Sheet1" Then
              Sheets(intSheet).Cells.Hyperlinks.Delete
              Sheets(intSheet).Select (boolNoSelectionYet)
              boolNoSelectionYet = False
          End If
      Next
      End Sub
      

      请注意,我删除了您的 If 语句的第二部分,因为您的 For Next 循环确保 intSheet 永远不会超过工作表数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多