vba - 从关闭的 Excel 文件获取范围

标签 vba excel

我一直在尝试从关闭的 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/

相关文章:

excel - 多列合并为一列,以逗号分隔

vba - 向形状/线条添加渐变

excel - 使用系统时间每 30 秒保存一次 Excel 文件

c# - 导出到excel打开它

vba搜索功能

excel - 如何使用 VBScript 判断 Excel 2007 电子表格是否打开以及是谁打开的

vba - 打开 Windows 资源管理器并选择一个文件

vba - Excel VBA 的 Find 和 FindNext

vba - Excel VBA : Type mismatch when passing array

excel - 如何在 VBA 用户窗体中修复日期 - 日期以不正确的格式输入工作表