从closures的Excel文件中获取范围

我一直在试图从一个封闭的Excel文件中获取数据,到目前为止,没有解决scheme发布了这样做,而不打开源工作簿。 我曾尝试使用ExecuteExcel4Macro命令,但不能使用,因为我需要VLOOKUP的searchfunction。 然而,使用VLOOKUP有其自身的问题。 我不能简单地做这样的事情:

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

因为我需要在源数据input到单元格之前做一些处理。

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

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

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

 Application.ScreenUpdate = FALSE Application.EnableEvents = FALSE Application.DisplayAlerts = FALSE Workbooks.Open <source> Set sourceRange = Workbooks(<sourcename>).Worksheets(<sheetname>).Range(<range>) 

但是我没有成功地压制对话。

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

当您需要从已closures的Excel文件中获取多个值时,请使用ADO。 这里是一个例子,我使用ADO从一个closures的Excel文件中获取一个特定的范围。 I:\stackoverflow\Employees.xlsx[Sheet1$A1:F21]
有关更详细的示例,请查看我的答案: 错误91(对象未设置)在封闭的工作簿中查找数据时

 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