如何创buildExcel VBA中的string数组并将其传递给子?
VBA数组对我来说是新的,似乎有多种方式来创buildstring数组。
- 我相信我需要创build一个dynamic数组
- 但我找不到任何示例如何将dynamic数组传递给子例程
我知道有多less项需要在用户范围的数量(所以也许我不需要dynamic数组?)。 我无法将数组传递给另一个子例程。
思考过程如下:
- 遍历用户名列表
- 为每个创build一个工作表
- 在迭代时将每个用户名保存在一个数组中
- 在另一个子程序中,select我创build的所有图纸并保存为PDF
以下是我的代码。 我得到运行时错误9 – 下标超出范围(引用数组对象)
我感谢任何帮助! 谢谢!
Sub CreateAllDashboards(StartDate As Date, EndDate As Date) 'Used to iterate through the list of users and call the Sub to create Dashboards Dim UserNameRangeStart As Range Set UserNameRangeStart = Range("UserName") Dim SheetNames() As String 'Cyle through users For i = 1 To GetUserNameRange().CounT 'Some code ReDim Preserve SheetNames(i) SheetNames(i) = UserNameRangeStart.Offset(i, 0).Value Next i Call CreatePDF(EndDate, SheetNames) 'Also tried SheetNames() End Sub
Sub CreatePDF(FileDate As Date, ByRef SheetNames As Variant) Dim FilePath As String, FileName As String FilePath = Application.ActiveWorkbook.Path FileName = "Production Dashboards - " & Format(FileDate, "mmddyy") & ".pdf" ThisWorkbook.Sheets(SheetNames).Select ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:= _ FileName, Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=True End Sub
数组参数不是正确传递给方法CreatePDF(...)
。 参数types可以更改为SheetNames() As String
, SheetNames As Variant
也可以。
然后Run-time error 9 - Subscript out of range
在此处引发ThisWorkbook.Sheets(SheetNames).Select
因为数组SheetNames
包含无效的工作表名称,这是第一个项目。 此项目为空string,空string作为工作表名称无效。
在For Next
循环中,索引从数值1
开始,但数组从0
开始。 所以数组SheetNames
第一项保持不变,最后是一个空string。 为了解决这个问题,把ReDim
的下界设置为1
。 HTH
(注意:如果你省略下限,那么使用Option Base
,如果没有指定Option Base
则使用0
。
'Cyle through users For i = 1 To GetUserNameRange().Count 'Some code ReDim Preserve SheetNames(1 To i) SheetNames(i) = UserNameRangeStart.Offset(i, 0).value Next i
我会改变这一点:
Sub CreatePDF(FileDate As Date, ByRef SheetNames As Variant)
对此:
Sub CreatePDF(FileDate As Date, SheetNames() As String)
但是你的问题在这一行:
ThisWorkbook.Sheets(SheetNames).Select
从dee的评论编辑:您可以在.Sheets()
但没有空行放置一个表名称数组。 所以在你的子“CreateAllDashboards”中这样做:
ReDim Preserve SheetNames(i - 1) SheetNames(i - 1) = UserNameRangeStart.Offset(i, 0).Value
你可以阅读有关VBA中的数组。
我已经使用名为“用户”范围和另一个名为“FileDate”的单个工作簿testing了以下内容。 它做你的问题。
Run-time error 9 - Subscript out of range
的原因Run-time error 9 - Subscript out of range
错误是您必须引用数组元素。 ThisWorkbook.Sheets(SheetNames).Select
将抛出一个错误,但ThisWorkbook.Sheets(SheetNames(x)).Select
将不会(只要x被初始化,并在数组的边界内)
Sub PopulateArray() Dim user As Range Dim SheetNames As Variant ReDim SheetNames(1 To 1) 'Initialise the array For Each user In [Users] ThisWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count) With Worksheets(Worksheets.Count) .Name = user.Value2 .[A1] = user.Value2 'you can't print a blank sheet! End With SheetNames(UBound(SheetNames)) = user.Value2 ReDim Preserve SheetNames(1 To UBound(SheetNames) + 1) Next user ReDim Preserve SheetNames(1 To UBound(SheetNames) - 1) 'Delete the last element Call CreatePDF([FileDate], SheetNames) End Sub Sub CreatePDF(FileDate As Date, ByRef SheetNames As Variant) Dim FilePath As String, FileName As String Dim x As Long FilePath = Application.ActiveWorkbook.Path & "\" 'Note backslash added to path. FileName = "Amtec Production Dashboards - " & Format(FileDate, "mmddyy") For x = 1 To UBound(SheetNames) ThisWorkbook.Sheets(SheetNames(x)).ExportAsFixedFormat Type:=xlTypePDF, FileName:= _ FileName & SheetNames(x) & ".pdf", Quality:=xlQualityStandard, IncludeDocProperties:=True, _ IgnorePrintAreas:=False, OpenAfterPublish:=True Next x End Sub
上面演示了如何根据请求将数组parsing为另一个子数组,但是您也可以很容易地将CreatePDF代码轻松地集成到调用子中。