将Excel VBA中的工作表名称添加到数组

3
我尝试使用以下代码将Excel VBA中的工作表名称添加到数组中。它只选择一个值(始终是最后一个工作表名称)。例如,如果我有2个工作表:List1和List2,则仅选择List2,并显示第一个工作表的空值。如果我添加4,则仅显示第4个,以此类推。我不确定为什么会得到空值。
Dim curSheet As Worksheet
Dim ArraySheets() As String
Dim x As Variant

For Each curSheet In ActiveWorkbook.Worksheets

    If curSheet.Name Like "*List*" Then

        ReDim ArraySheets(x)

        ArraySheets(x) = curSheet.Name

        x = x + 1

    End If

Next curSheet

5
ReDim ArraySheets(x)替换为ReDim Preserve ArraySheets(x)。这样做可以保留数组的现有元素并扩大数组的大小,而不会丢失任何数据。 - omegastripes
2个回答

7
你应该将ReDim ArraySheets(x) 改为 ReDim Preserve ArraySheets(x) 当你仅使用ReDim时,数组的内容不会被保留,这就是为什么您只能得到最后一个工作表名称。使用ReDim Preserve可以重新调整数组大小并保留内容。

有没有办法将数组定义(ReDim Preserve ArraySheets(x))放在For循环之外?当我将其放在循环之外时,会出现“下标超出范围”的错误。 - NDubonix

2

不使用循环

Sub GetNAmes()
Dim strIn As String
Dim X

strIn = Application.InputBox("Search string", "Enter string to find", "*List*", , , , , 2)
If strIn = "False" Then Exit Sub

ActiveWorkbook.Names.Add "shtNames", "=RIGHT(GET.WORKBOOK(1),LEN(GET.WORKBOOK(1))-FIND(""]"",GET.WORKBOOK(1)))"
X = Filter([index(shtNames,)], strIn, True, 1)

Select Case UBound(X)
    Case Is > 0
        strIn = Application.InputBox(Join(X, Chr(10)), "Multiple matches found - type position to select", , , , , 1)
        If strIn = "False" Then Exit Sub
        On Error Resume Next
        Sheets(CStr(X(strIn))).Activate
        On Error GoTo 0
    Case 0
        Sheets(X(0)).Activate
    Case Else
        MsgBox "No match"
End Select

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接