Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Excel VBA-创建工作表名称数组_Arrays_Excel_Vba - Fatal编程技术网

Arrays Excel VBA-创建工作表名称数组

Arrays Excel VBA-创建工作表名称数组,arrays,excel,vba,Arrays,Excel,Vba,我试图创建一个包含所有工作表名称的数组,从活动工作簿中的第四个工作表开始。当我尝试重新确定数组的尺寸时,第4行出现错误。我错过了什么?当前有6个工作表,第3个工作表是隐藏的(以防更改任何内容) 问题是数组sheetsToSkip在第一个循环周期中还没有上限。您可以检查sheetsToSkip是否是第一个循环中的数组,然后第一次对其进行尺寸标注或调整其大小 对守则的建议: Sub CreateSheetNameArray() Dim i As Integer 'Brakets ar

我试图创建一个包含所有工作表名称的数组,从活动工作簿中的第四个工作表开始。当我尝试重新确定数组的尺寸时,第4行出现错误。我错过了什么?当前有6个工作表,第3个工作表是隐藏的(以防更改任何内容)


问题是数组
sheetsToSkip
在第一个循环周期中还没有上限。您可以检查
sheetsToSkip
是否是第一个循环中的数组,然后第一次对其进行尺寸标注或调整其大小

对守则的建议:

Sub CreateSheetNameArray()
    Dim i As Integer
    'Brakets are removed
    Dim sheetsToSkip As Variant

    For i = 4 To Sheets.Count
        If IsEmpty(sheetsToSkip) Then
            ReDim sheetsToSkip(0 To 0)
        Else
            ReDim Preserve sheetsToSkip(UBound(sheetsToSkip) + 1)
        End If
        sheetsToSkip(UBound(sheetsToSkip)) = Sheets(i).Name
    Next i
End Sub

请注意,
ReDim Preserve
速度较慢。如果你有很多循环周期,你可以考虑只在循环之前对数组进行标注。

< p>这里有几个例子,如果你先对“有效的”表进行计数(如果你避免按名称括表),这会有帮助。

--版本1-不必费心检查(只需将所有工作表名称放入一个数组)

--版本2-检查名称,仅保存有效的 (使用Inst测试多张图纸的名称中是否有特殊字符串)

使用VBA,可能有不止几条途径可以获得相同的结果

对于最初的问题,如果您只是想跳过4,并且不担心它们可能会出现问题,请执行以下操作:


Sub ReallySimpleJustUseNumbers()

':: N.B.  Sheets are indexed starting at 1, arrays begin at 0 ..

Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String  ' Array of Sheet Names
Dim LP As Integer ' ( Generic Loop Variable )

Set MyWb = ActiveWorkbook

    ':: Are there greater than four sheets in this workbook ?
    If MyWb.Sheets.Count > 4 Then
        ':: Redim to workbook count
        ReDim SheetNameArray(MyWb.Sheets.Count - 4)
    Else
        ':: Polite Exit
        MsgBox "Too Few Sheets buddy"
        Exit Sub
    End If
    
    For LP = 4 To MyWb.Sheets.Count
        SheetNameArray(LP - 4) = MyWb.Sheets(LP).Name
    Next LP
    
    ':: Output array
    For LP = 0 To UBound(SheetNameArray)
        Debug.Print LP & " --- " & SheetNameArray(LP)
    Next LP

End Sub

这将简单地开始填充定义为图纸计数的数组-四张初始图纸,索引从0开始。

@BigBen在正确的轨道上。您只需重新拨号一次:

公共功能列表工作表()
Dim SheetsToSkip()作为字符串
将计数设置为整数
将索引设置为整数
Count=此工作簿.Worksheets.Count
ReDim SheetsToSkip(1到计数)
对于索引=1进行计数
SheetsToSkip(索引)=此工作簿。工作表((索引+3-1)模式计数+1)。名称
下一个
"核实。
对于索引=LBound(SheetsToSkip)到UBound(SheetsToSkip)
Debug.Print索引,SheetsToSkip(索引)
下一个
端函数

sheetsToSkip
在循环的第一次迭代中没有
Ubound
。为什么不创建一个数组或工作表集合呢?

Sub SheetNamesToArray()

Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String  ' Array of Sheet Names
Dim LP As Integer ' ( Generic Loop Variable )

Set MyWb = ActiveWorkbook

    ':: Redim to workbook count
    ReDim SheetNameArray(MyWb.Sheets.Count)
    
    ':: Check Array Size
    Debug.Print UBound(SheetNameArray) & " = " & MyWb.Sheets.Count

    ':: Set Array from Sheet Names
    For LP = 1 To MyWb.Sheets.Count
        SheetNameArray(LP) = Sheets(LP).Name
        Debug.Print SheetNameArray(LP) & " :" & Sheets(LP).Name
    Next LP


End Sub
Sub SheetNamesToArray_And_Ignore_Names()

Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String  ' Array of Sheet Names
Dim LP, LPx As Integer ' ( Generic Loop Variable(s) )
Dim MyValidSheetsCount As Integer  ' Array Size for only 'valid' sheets


    ':: Apply to active workbook
    Set MyWb = ActiveWorkbook

    For LP = 1 To MyWb.Sheets.Count
        ':: Skip over names to ignore..
        If InStr(1, Sheets(LP).Name, "Four", vbTextCompare) = 0 Then
            '::Iterate count of 'valid' sheets ::
            MyValidSheetsCount = MyValidSheetsCount + 1
        End If
    
    Next LP

    ':: Redim to workbook count
    ReDim SheetNameArray(MyValidSheetsCount)
    
    LPx = 0
    
    ':: Set Array from Sheet Names
    For LP = 1 To MyWb.Sheets.Count

        ':: Same test again, this time add to array, and iterate index variable ( LPX )
        If InStr(1, Sheets(LP).Name, "Four", vbTextCompare) = 0 Then
            SheetNameArray(LPx) = Sheets(LP).Name
            '::Iterate array index ::
            LPx = LPx + 1
        End If

    Next LP

    Debug.Print "Found " & LPx & " valid sheets" & vbNewLine
    
    ':: Check only the 'valid' sheets are recorded
    For LP = 0 To LPx - 1
      Debug.Print "(" & Format(LP, "000#") & ")  : " & SheetNameArray(LP)
    Next LP

End Sub

Sub ReallySimpleJustUseNumbers()

':: N.B.  Sheets are indexed starting at 1, arrays begin at 0 ..

Dim MyWb As Workbook
Dim MySheet As Worksheet
Dim SheetNameArray() As String  ' Array of Sheet Names
Dim LP As Integer ' ( Generic Loop Variable )

Set MyWb = ActiveWorkbook

    ':: Are there greater than four sheets in this workbook ?
    If MyWb.Sheets.Count > 4 Then
        ':: Redim to workbook count
        ReDim SheetNameArray(MyWb.Sheets.Count - 4)
    Else
        ':: Polite Exit
        MsgBox "Too Few Sheets buddy"
        Exit Sub
    End If
    
    For LP = 4 To MyWb.Sheets.Count
        SheetNameArray(LP - 4) = MyWb.Sheets(LP).Name
    Next LP
    
    ':: Output array
    For LP = 0 To UBound(SheetNameArray)
        Debug.Print LP & " --- " & SheetNameArray(LP)
    Next LP

End Sub