分类的VBA数组迭代困境

Private Sub Workbook_Open() Dim SourceList(0) As Workbook Dim PathList() As String Dim n As Integer PathList = Split("\data\WeaponInfo.csv", ",") ThisWorkbook.Activate Application.ActiveWindow.Visible = False Application.ScreenUpdating = False For n = 0 To Ubound(PathList) Workbooks.Open Filename:=ThisWorkbook.Path & PathList(n) Set SourceList(n) = ActiveWorkbook ActiveWindow.Visible = False Next Application.ScreenUpdating = True Workbooks.Open Filename:=ThisWorkbook.Path & "\HeroForge Anew 3.5 v7.4.0.1.xlsm", UpdateLinks:=3 ActiveWindow.Visible = True Application.DisplayAlerts = False For n = 0 To UBound(SourceList) SourceList(n).Close Next Application.DisplayAlerts = True End Sub 

For n = 0 to PathList.GetUpperBound(0)的行,当我尝试运行这个macros时抛出一个“编译错误(无效限定符)”,具体来说,它突出显示PathList是问题。

此外,如果我切出循环,只是运行一次(用"\data\WeaponInfo.csv"replacePathList(n) ),它会在SourceList(0) = ActiveWorkbook上抛出一个“Object Variable或With block variable not set”错误SourceList(0) = ActiveWorkbook行。 我究竟做错了什么?

我知道这个循环目前是毫无意义的。 这是futureproofing,因为我打算使用这个macros来打开多个数据引用。

编辑:由下面的@Jeremy所做的更改,现在得到SourceList(n).Close行上的“对象variables或块variables未设置”错误。

编辑2:修复循环,再次在@Jeremy的build议,通过将Dim SourceList(1) As Workbook更改为Dim SourceList(0) As Workbook

几个问题:

  1. 在VBA中,GetUpperBound方法不存在,仅用于.NET。 将其更改为Ubound函数。

  2. 您可能会遇到与Sourcelist(0)= ActiveWorkbook的问题。 分配对象引用时使用Set关键字。

  3. 来源没有在您的循环中定义。 总是把Option Explicit放在你的代码模块的顶部,强制你声明你的variables。 这将在未来挽救痛苦。

  4. 你想把这个string分开怎么办? 你会得到一个值,这是你传递的string。

     Private Sub Workbook_Open() Dim SourceList(1) As Workbook Dim PathList() As String Dim n as Integer PathList = Split("\data\WeaponInfo.csv", ",") ThisWorkbook.Activate Application.ActiveWindow.Visible = False Application.ScreenUpdating = False For n = 0 To Ubound(PathList) Workbooks.Open Filename:=ThisWorkbook.Path & PathList(n) Set SourceList(0) = ActiveWorkbook Next ActiveWindow.Visible = False Application.ScreenUpdating = True Workbooks.Open Filename:=ThisWorkbook.Path & "\HeroForge Anew 3.5 v7.4.0.1.xlsm", UpdateLinks:=3 ActiveWindow.Visible = True For Each Source In SourceList Source.Close Next End Sub