分类的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
几个问题:
-
在VBA中,GetUpperBound方法不存在,仅用于.NET。 将其更改为Ubound函数。
-
您可能会遇到与Sourcelist(0)= ActiveWorkbook的问题。 分配对象引用时使用Set关键字。
-
来源没有在您的循环中定义。 总是把Option Explicit放在你的代码模块的顶部,强制你声明你的variables。 这将在未来挽救痛苦。
-
你想把这个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