【问题标题】:Can't pass string into array function : subscript out of range无法将字符串传递给数组函数:下标超出范围
【发布时间】:2016-10-12 12:54:35
【问题描述】:

我试图模仿将多张工作表复制到一个新工作簿,如果我在数组函数中使用工作表名称,这很好。

但是,如果我尝试将字符串变量传递到数组中,则会收到下标超出范围错误。

关注点是:

Wb.Sheets(Array(SheetsArray)).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count)

请看我下面的代码:

Sub CreateFiles()
    Application.ScreenUpdating = False
    Dim LastRow As Long
    Dim WKC As String: WKC = Replace(DateValue(DateAdd("ww", -1, Now() - (Weekday(Now(), vbMonday) - 1))), "/", ".")
    Dim FilePath As String: FilePath = "Z:\MI\Krishn\Retail"
    Dim BuyerLastRow As Long
    Dim Wb As Workbook: Set Wb = ActiveWorkbook
    Dim RegionWb As Workbook
    Dim RegionCount As Integer
    Dim RegionCounter As Integer
    Dim SheetsArray As String
        With BuyerList
            LastRow = .Range("G1048576").End(xlUp).Row
            BuyerLastRow = .Range("A1048576").End(xlUp).Row
            'Create WKC Dir

            If Dir(FilePath & "\" & WKC, vbDirectory) = "" Then
                MkDir FilePath & "\" & WKC
            End If

            'Create Create Files
            If CountFiles(FilePath & "\" & WKC) = 0 Then
                For i = 2 To LastRow
                    RegionCounter = 0
                    SheetsArray = ""
'                    Set RegionWb = Workbooks.Add
'                    'wb.SaveAs FilePath & "\" & WKC & "\" & .Cells(i, 7).Value
'                    RegionWb.SaveAs FilePath & "\" & WKC & "\" & "WKC " & WKC & " - " & .Cells(i, 7).Value & ".xlsb", 50

                        For j = 2 To BuyerLastRow
                            RegionCount = Application.WorksheetFunction.CountIf(.Range("C:C"), .Cells(i, 7).Value)
                            If .Cells(i, 7).Value = .Cells(j, 3).Value Then
                                SheetsArray = SheetsArray & """" & .Cells(j, 2).Value & ""","
                                RegionCounter = RegionCounter + 1
                                If RegionCounter = RegionCount Then
                                    Debug.Print Left(SheetsArray, Len(SheetsArray) - 1)
                                    Set RegionWb = Workbooks.Add
                                    RegionWb.SaveAs FilePath & "\" & WKC & "\" & "WKC " & WKC & " - " & .Cells(i, 7).Value & ".xlsb", 50
                                    'Wb.Sheets(Array(Left(SheetsArray, Len(SheetsArray) - 1))).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count)
                                    SheetsArray = Left(SheetsArray, Len(SheetsArray) - 1)
                                    Wb.Sheets(Array(SheetsArray)).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count)
                                    'Wb.Sheets(Array()).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count)
                                    RegionWb.Save
                                    RegionWb.Close
                                    Exit For
                                End If
'                                Wb.Sheets(Wb.Sheets("Buyer list").Range(Cells(j, 2).Address).Value).Copy After:=RegionWb.Sheets(RegionWb.Sheets.count)
                            End If
                        Next j
'
'

                Next i
            End If


        End With
    Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 你没有建立一个逗号分隔的字符串来传递给Array,这不是它的工作原理。事先声明一个数组并fill it,而不调用Array。
  • Array(SheetsArray) 创建一个包含一个条目的数组。在Sheets(X) 中,X 可以是数字或字符串,但不能是数组。试试MyArray = Array(SheetsArray) 和Sheets(MyArray(0))。警告。 MyArray 必须声明为 Variant 才能使用 Array 进行初始化。使用 Array 创建的数组的下限取决于Option Base。我更喜欢VBA.Array。
  • @TonyDallimore 在Sheets(X) X can be an array。
  • @GSerg。感谢您的链接。我会试试这个,虽然这对我来说没什么意义。 Sheets 是 Collection。我读过的关于集合的文档是元素只能通过索引或键访问。一般而言,Collection(X, Y,Z) 是什么意思?

标签: arrays vba excel


【解决方案1】:

你可以像这样将字符串拆分成一个数组:

Wb.Sheets(Split(SheetsArray, ",")).Copy After:=RegionWb.Sheets(RegionWb.Sheets.Count)

正如 GSerg 指出的那样:您需要删除工作表名称周围的引号。

SheetsArray = SheetsArray & .Cells(j, 2).Value & ","

与使用逗号相比,反斜杠是更安全的分隔符,因为工作表名称可以包含逗号,但不能包含反斜杠。

SheetsArray = SheetsArray & .Cells(j, 2).Value & "/"

Wb.Sheets(Split(SheetsArray, "/")).Copy After:=RegionWb.Sheets(RegionWb.Sheets.Count)

【讨论】:

  • 唯一的问题是 Excel 工作表名称通常包含逗号 ("Profits, monthly")...
  • @GSerg 已更新。再次感谢
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 2021-06-16
  • 2015-03-31
  • 2014-09-06
  • 1970-01-01
  • 2013-04-22
  • 2012-04-27
相关资源
最近更新 更多