2016-07-15 8 views
0

クローズド・エクセル・ファイルからデータを取得しようとしていましたが、ソース・ブックを開くことなく、これまでのソリューションの投稿はありませんでした。 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を得ることができました。ブックの1つにリンクが含まれていて、リンクを更新するかどうかを尋ねるポップアップダイアログが表示されます。

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

とダイアログボックスを抑制しようとしましたが、ダイアログを抑制できませんでした。

VLOOKUPには範囲を第2引数として指定する必要があります。私はそれらの範囲を取得するためにソースファイルを開いているが、私は静かにそれらを開くことができないように見えるので、ファイルを開くことなくそれらの範囲のオブジェクトを取得する方法を探しています。

+0

は、あなたがWorkbooks.Openコマンドの「UpdateLinks」パラメータを試してみましたen-us/library/office/ff194819.aspx)。 – OldUgly

答えて

2

閉じたExcelファイルから複数の値を取得する必要がある場合は、ADOを使用します。次に、閉じたExcelファイルから特定の範囲を取得するためにADOを使用する例を示します。 I:\stackoverflow\Employees.xlsx[Sheet1$A1:F21]
より詳細な例については、ここで私の答えをチェックしてください:[ここ](https://msdn.microsoft.com/説明したよう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

笑...私は他の投稿から私の答えをリサイクルすることができてうれしかった。 –

関連する問題