2016-07-15 54 views
0

我一直在試圖從一個已關閉的excel文件中獲取數據,到目前爲止,還沒有發佈解決方案,無法打開源工作簿。我嘗試過使用ExecuteExcel4Macro命令,但不能使用它,因爲我需要VLOOKUP的搜索功能。但是,使用VLOOKUP有其自身的問題。我不能簡單地做這樣的事情:從已關閉的Excel文件中獲取範圍

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

因爲我需要做一些處理源數據輸入到單元格之前。

我已經成功地得到它打開源工作簿和運行

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

成功地獲取數據的MWE,但我不能在後臺悄悄地打開工作簿。其中一個工作簿包含鏈接,並出現一個彈出對話框,詢問我是否想更新鏈接。我試圖壓制對話框

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

但我沒有成功抑制對話框。

VLOOKUP需要一個範圍作爲第二個參數,它必須是一個範圍。我一直在打開源文件來獲取這些範圍,但我正在尋找一種方法來獲取這些範圍對象而無需打開這些文件,因爲看起來我無法安靜地打開它們。

+0

您是否嘗試過的Workbooks.Open命令「UpdateLinks」參數,如[這裏](https://msdn.microsoft.com/描述EN-US /圖書館/辦公室/ ff194819.aspx)。 – OldUgly

回答

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 
+0

這是一個聰明的答案。 –

+0

大聲笑...我很高興能夠從其他帖子回收我的答案。 – 2016-07-16 00:11:19