我正在尝试打开不同的Excel工作簿,运行各自的宏,保存并关闭。到目前为止,我有以下代码:
Sub AllFiles()
Application.Run "'L:\RESEARCH\Alternative Assets\Private Equity\PE Preqin Data\Preqin_Fundraising_Data_Macro.xlsm'!Get_File"
End Sub
这段代码的问题是虽然它打开了工作簿,但我仍然得到一个运行时错误'9'下标超出范围。我的猜测是宏无法在“活动”工作簿中找到某些工作表或变量。这是我得到错误的代码(另一个工作簿中的宏)
Public Sub Get_File()
Dim sFiletype As String 'Fund type reference
Dim sFilename As String 'File name (fund type + date of download), if "" then default
Dim sFolder As String 'Folder name (fund type), if "" then default
Dim bReplace As Boolean 'To replace the existing file or not
Dim sURL As String 'The URL to the location to extract information
Dim pURL As String
Dim Cell, Rng As Range
Dim Sheet As Worksheet
Dim oBrowser As InternetExplorer
Set oBrowser = New InternetExplorer
'Initialize variables
Set Rng = Range("I2:I15")
Set Sheet = ActiveWorkbook.Sheets("Macro_Button") 'POINT OF ERROR
For Each Cell In Rng
If Cell <> "" Then
sFiletype = Cell.Value
sFilename = sFiletype & "_" & Format(Date, "mmddyyyy")
sFolder = Application.WorksheetFunction.VLookup(Cell.Value, Sheet.Range("I2:Z15"), 2, False)
bReplace = True
sURL = "www.preqin.com"
pURL = Application.WorksheetFunction.VLookup(Cell.Value, Sheet.Range("I2:Z15"), 16, False)
'Download using the desired approach, XMLHTTP / IE
If Application.WorksheetFunction.VLookup(Cell.Value, Sheet.Range("I2:Z15"), 15, False) = 1 Then
Call Download_Use_IE(oBrowser, sURL, pURL, sFilename, sFolder, bReplace)
Else
Call Download_NoLogin_Use_IE(oBrowser, pURL, sFilename, sFolder, bReplace)
End If
Else: GoTo Exit_Sub
End If
Next
Exit_Sub:
'Close IE
oBrowser.Quit
End Sub
任何人对此错误有任何解决方案/建议吗?谢谢!
答案 0 :(得分:0)
使用ThisWorkbook而不是ActiveWorkbook。那么你应该可以运行远程宏。
Set Sheet = ThisWorkbook.Sheets("Macro_Button")
注意:我总是建议使用ThisWorkbook
代替ActiveWorkbook
,因为它更明确。您永远无法确定哪个是活动工作簿。但是ThisWorkbook
总是指持有宏的工作簿。
另一个注释(基于您的以下评论):上述代码不适用于多个工作簿。它不够明确。例如:
Set Rng = Range("I2:I15")
在这一行中,您并未说明您所指的是哪种工作表甚至工作簿。所以,VBA会为您做出决定。我猜VBA“决定”你不想要的东西。所以,你必须告诉VBA你想要什么,并明确说明。以下是有关如何更改上述行的一些可能示例。
Set Rng = ThisWorkbook.Sheets(1).Range("I2:I15") 'This will be a sheet in the remote Excel file
Set Rng = ActiveWorkbook.Sheets(1).Range("I2:I15") 'This will be a sheet in the file from which you were originally calling the external macro
Set Rng = Workbooks("someFile.xls").Sheets("someSheetInThatFile").Range("I2:I15") 'This would be a third Excel file: not the one calling the macro nor the Excel file hosting the macro
然而,这只是上述代码中的一行,您必须更改它以使其适用于多个Excel文件。