从封闭的Excel FIle中获取范围

时间:2016-07-15 22:32:16

标签: excel vba excel-vba

我一直在尝试从已关闭的excel文件中获取数据,到目前为止,没有打开解决方案,但没有打开源工作簿。我尝试过使用ExecuteExcel4Macro命令,但不能使用它,因为我需要VLOOKUP的搜索功能。但是,使用VLOOKUP有其自身的问题。我不能简单地做一些事情:

cell.Value = "=VLOOKUP(<search item>, '<filepath>[<sourcename.xlsx>]<worksheet>'!<range>, <col>, FALSE)"

因为我需要在将源数据输入单元格之前对其进行一些处理。

我设法获得一个MWE,它打开源工作簿并运行

Application.VLookup(<search item>, <source range object>, <col>, FALSE)

成功获取数据,但我无法在后台安静地打开工作簿。其中一个工作簿包含链接,并出现一个弹出对话框,询问我是否要更新链接。我试图用

来取消对话框
Application.ScreenUpdate = FALSE
Application.EnableEvents = FALSE
Application.DisplayAlerts = FALSE
Workbooks.Open <source>
Set sourceRange = Workbooks(<sourcename>).Worksheets(<sheetname>).Range(<range>)

但是我没有成功抑制对话。

VLOOKUP需要一个范围作为第二个参数,它必须是一个范围。我一直在打开源文件以获取这些范围,但我正在寻找一种方法来获取这些范围对象而不必打开文件,因为我似乎无法安静地打开它们。

1 个答案:

答案 0 :(得分:2)

当您需要从已关闭的Excel文件中获取多个值时,请使用ADO。下面是一个示例,我使用ADO从封闭的Excel文件中获取特定范围。 I:\stackoverflow\Employees.xlsx[Sheet1$A1:F21]
有关更详细的示例,请在此处查看我的答案:Error 91 (Object Not Set) When Finding Data in Closed Workbook

Sub ADOGetRange()

    Dim lastRow As Long, x As Long

    Const adOpenKeyset = 1
    Const adLockOptimistic = 3
    Dim conn
    Dim EmployeeData

    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=I:\stackoverflow\Employees.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    conn.Open

   ' On Error GoTo CloseConnection

    Set EmployeeData = CreateObject("ADODB.Recordset")

    With EmployeeData
        .ActiveConnection = conn
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        .Source = "Select * FROM [Sheet1$A1:F21]"
        .Open
   '     On Error GoTo CloseRecordset

    End With

    With Worksheets("Sheet1")
        lastRow = .range("A" & Rows.Count).End(xlUp).Row
        For x = 2 To lastRow

            EmployeeData.Filter = "id=" & Cells(x, 1)
            If Not (EmployeeData.BOF And EmployeeData.EOF) Then
                .Cells(x, 2) = EmployeeData.Fields("first_name")
                .Cells(x, 3) = EmployeeData.Fields("last_name")
                .Cells(x, 4) = EmployeeData.Fields("email")
                .Cells(x, 5) = EmployeeData.Fields("gender")
                .Cells(x, 6) = EmployeeData.Fields("ip_address")
            End If

        Next
    End With
CloseRecordset:

    EmployeeData.Close
    Set EmployeeData = Nothing

CloseConnection:
    conn.Close
    Set conn = Nothing
End Sub