打开已关闭的工作簿并运行宏

时间:2016-02-16 18:03:30

标签: excel vba excel-vba

我正在尝试打开不同的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

任何人对此错误有任何解决方案/建议吗?谢谢!

1 个答案:

答案 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文件。