我一直在尝试从关闭的 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 需要一个范围作为第二个参数,该参数必须是一个范围。我一直在打开源文件来获取这些范围,但我正在寻找一种无需打开文件即可获取这些范围对象的方法,因为我似乎无法安静地打开它们。
最佳答案
当您需要从关闭的 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
关于vba - 从关闭的 Excel 文件获取范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405868/