2016-06-16 5 views
0

こんにちはstackoverflowのコミュニティ、

私は別の1つのワークシートからデータを取得するために、マクロを使用していますが、私は、「Microsoft Accessデータベースエンジンのエラーを受信し続けるオブジェクトを見つけることができませんでした「Sheet1の$ ''私は、参照されているファイルがSheet1を持ち、パスが正しいことを確認しています。問題は、複数の参照ファイルが同じブックに作成され、後で個別のファイルとして保存されることです。だから私が参照しているファイルの1つを開くと、Sheet2343(Sheet1)と表示され、問題が発生すると思います - マクロはSheet1を探していますが、Sheet2343しか見つからないためエラーメッセージを返します。以下は私が使用しているコードです。誰でも、回避策を提案できますか?

ありがとうございます!

Sub Pull_Data() 

Dim rsData As ADODB.Recordset 

rsFile$ = ThisWorkbook.Path & "\" & Sheet1.Range("C1") & ".xlsx" 
strConn$ = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
        "Data Source=" & rsFile & ";" & _ 
        "Extended Properties=""Excel 12.0;HDR=Yes"";" 

rsSQL$ = "SELECT * FROM [Sheet1$]" 
Set rsData = New ADODB.Recordset 

rsData.Open rsSQL, strConn, , adOpenUnspecified, adLockUnspecified 
Sheet1.Range("F4").CopyFromRecordset rsData 

End Sub 
+0

Let's say 'Sheet2343'をコピーする必要がありますか?または、明示的にSheet1を持つファイルのみ?ファイルには1枚しかありませんか?シートには、シートの一意の識別子として機能するユニークなタイトルがありますか? – Sgdva

+0

したがって、各ファイルにはSheet1というワークシートが1つしかないので、マクロを調整して参照されているワークブックのシートからデータを取り出すことができます。ありがとう! – mamuka21

+0

シッダースの答えを使って実際のシート名を見つけることができます:http://stackoverflow.com/questions/14982990/iterate-through-excel-worksheet-names-when-office-not-installed-using-vb6 –

答えて

1

EDIT:あなたのユースケースのために、この

Sub Pull_Data() 

    Dim rsData As ADODB.Recordset, sheetName 
    Dim rsFile As String, strConn, rsSQL 

    rsFile = ThisWorkbook.Path & "\" & Sheet1.Range("C1") & ".xlsx" 

    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
         "Data Source=" & rsFile & ";" & _ 
         "Extended Properties=""Excel 12.0;HDR=Yes"";" 

    sheetName = GetSheetName(rsFile) 

    rsSQL = "SELECT * FROM [" & sheetName & "]" 
    Set rsData = New ADODB.Recordset 

    rsData.Open rsSQL, strConn, , adOpenUnspecified, adLockUnspecified 
    Sheet1.Range("F4").CopyFromRecordset rsData 

End Sub 

'return the worksheet name from a closed single-sheet Excel file 
Function GetSheetName(fPath As String) 
    Dim cn As ADODB.Connection 
    Dim rsT As ADODB.Recordset 
    Set cn = New ADODB.Connection 
    With cn 
     .Provider = "Microsoft.ACE.OLEDB.12.0" 
     .ConnectionString = "Data Source=" & fPath & _ 
         ";Extended Properties=Excel 12.0;" 
     .CursorLocation = adUseClient 
     .Open 
    End With 
    Set rsT = cn.OpenSchema(adSchemaTables) 
    GetSheetName = rsT.Fields("TABLE_NAME").Value 
    rsT.Close: Set rsT = Nothing 
    cn.Close: Set cn = Nothing 
End Function 

のようなものが、ここではExcelワークブックの構造を照会するADOXを使用する方法は次のとおりです。

Sub Tester() 
    Dim cn As ADODB.Connection 
    Dim rsT As ADODB.Recordset 
    Dim intTblCnt As Integer, intTblFlds As Integer 
    Dim strTbl As String 
    Dim rsC As ADODB.Recordset 
    Dim intColCnt As Integer, intColFlds As Integer 
    Dim strCol As String 
    Dim t As Integer, c As Integer, f As Integer 

    Set cn = New ADODB.Connection 

    With cn 
     'edit: updated to work with .xlsx-format files 
     .Provider = "Microsoft.ACE.OLEDB.12.0" 
     .ConnectionString = "Data Source=" & ThisWorkbook.Path & _ 
        "\ADOXSource.xlsx;Extended Properties=Excel 12.0;" 

     .CursorLocation = adUseClient 
     .Open 
    End With 

    Set rsT = cn.OpenSchema(adSchemaTables) 

    intTblCnt = rsT.RecordCount 
    intTblFlds = rsT.Fields.Count 

    Debug.Print "Tables: " & intTblCnt 
    Debug.Print "--------------------" 

    For t = 1 To intTblCnt 

     strTbl = rsT.Fields("TABLE_NAME").Value 

     Debug.Print vbTab & "Table #" & t & ": " & strTbl 
     Debug.Print vbTab & "--------------------" 

     For f = 0 To intTblFlds - 1 
      Debug.Print vbTab & rsT.Fields(f).Name & _ 
         vbTab & rsT.Fields(f).Value 
     Next 

     Debug.Print "--------------------" 
     Set rsC = cn.OpenSchema(adSchemaColumns, _ 
        Array(Empty, Empty, strTbl, Empty)) 

     intColCnt = rsC.RecordCount 
     intColFlds = rsC.Fields.Count 

     For c = 1 To intColCnt 
      strCol = rsC.Fields("COLUMN_NAME").Value 
      Debug.Print vbTab & vbTab & "Column #" & c & ": " & strCol 
      Debug.Print vbTab & vbTab & "--------------------" 
      For f = 0 To intColFlds - 1 
       Debug.Print vbTab & vbTab & rsC.Fields(f).Name & _ 
          vbTab & rsC.Fields(f).Value 
      Next 
      Debug.Print vbTab & vbTab & "--------------------" 
      rsC.MoveNext 
     Next 

     rsC.Close 
     Debug.Print "--------------------" 
     rsT.MoveNext 
    Next 
    rsT.Close 
    cn.Close 

End Sub 
+0

こんにちはティム、返事をありがとう。だから私は、私が今持っているものの代わりに上記のコードを使うべきですか、それとも両方を同じマクロで使うべきですか?私はまだVBAの新機能です。ありがとう! – mamuka21

+0

読み込みが必要なファイルはすべて1枚だけですか? –

+0

はい、すべてのファイルはSheet1ワークシートだけです。 – mamuka21

0

私のオリジナルの問題はによって引き起こされました特定の文字列の後にスペースがあることに気付かない。それと同じようにシンプルだが、それを理解するまでには時間がかかった。貴重な情報をいただきありがとうございます!

関連する問題