我一直在尝试从已关闭的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需要一个范围作为第二个参数,它必须是一个范围。我一直在打开源文件以获取这些范围,但我正在寻找一种方法来获取这些范围对象而不必打开文件,因为我似乎无法安静地打开它们。
答案 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