如何创buildExcel VBA中的string数组并将其传递给子?

VBA数组对我来说是新的,似乎有多种方式来创buildstring数组。

  • 我相信我需要创build一个dynamic数组
  • 但我找不到任何示例如何将dynamic数组传递给子例程

我知道有多less项需要在用户范围的数量(所以也许我不需要dynamic数组?)。 我无法将数组传递给另一个子例程。

思考过程如下:

  1. 遍历用户名列表
  2. 为每个创build一个工作表
  3. 在迭代时将每个用户名保存在一个数组中
  4. 在另一个子程序中,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 StringSheetNames 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代码轻松地集成到调用子中。