さて、ここでのこの質問と、私が他の場所で提起したいくつかの他の質問に関する有用な指針から、Excel スプレッドシートからダイナミック レンジまたはスタティック レンジのいずれかとしてデータを取得したい人にとって、かなり単純な解決策があると思います。 Excel のデータはセル A1 から始まりません。
これらの例は両方とも、ボタンを使用してコードを開始します。もちろん、このようにする必要はありませんが、そうする場合は、フォームとボタンを作成し、ボタンからコード ビルダーを実行して、そのコードを以下の必要なソリューションに置き換える必要があります。
ダイナミックレンジ:
この動的範囲の例は、Excel のセル範囲が常に同じ左上端の位置から始まり、列数が常に同じであることを前提としていることに注意してください。セルの範囲。
独自の設定に基づいて交換する必要がある参照:
C:\Users\Matt\Desktop\ExcelFile1.xls
Excelファイルのフルパスに置き換えます
Dynamic
Excel ファイルに含まれるシートの名前に置き換えます
A14:A2000
テストする範囲に置き換えて、空でないセルがいくつあるかを確認します。この範囲は次のようにする必要があります。列見出しが配置されているデータの行から開始します。インポートしようとしているデータ内の、空のセル エントリが決してない列をカバーします。Excel スプレッドシートの実際のデータを含む行数を常に超える十分な範囲をカバーします。
ExcelDynamicRangeData
Excel の範囲から取得されたデータを含む、Access でテーブルを呼び出したいものに置き換えます。
Dynamic!A14:EL
シートの名前、一番上/一番左のセル参照、および Excel 範囲の一番右の列文字に置き換えます。一番下/一番右の行番号は動的にする必要があるため、含めないでください。これを割り当てて、numberofrows
後でこの範囲の最後に連結します。
numberofrows = 13 ...
13 を、列見出しの開始位置より上にある行数に置き換えます。たとえば、列見出しが 4 行目から始まる場合、この数値は 3 である必要があります。
Command0
このすべてのコードを開始するために使用されているボタンの名前に置き換えます。
Sub ImportDataFromRange()
' Assign the Excel Object
Dim excelapp As Object
Set excelapp = CreateObject("excel.application")
' Assign the workbook
Dim wb As Object
Set wb = excelapp.Workbooks.Open("C:\Users\Matt\Desktop\ExcelFile1.xls")
' Assign the result of your CountA function used in the next line
Dim numberofrows As Integer
' Get the bottom-most row number needed to complete our dynamic range address
numberofrows = 13 + excelapp.Application.CountA(wb.worksheets("Dynamic").Range("A14:A2000"))
' Delete any previous access table, otherwise the next line will add an additional table each time it is run
DoCmd.DeleteObject acTable, "ExcelDynamicRangeData"
' Import data from Excel using a range that now knows where bottom row number is
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel9, "ExcelDynamicRangeData", "C:\Users\Matt\Desktop\ExcelFile1.xls", True, "Dynamic!A14:EL" & numberofrows
' Close and clean
wb.Close
Set wb = Nothing
excelapp.Quit
Set excelapp = Nothing
End Sub
Private Sub Command0_Click()
ImportDataFromRange
End Sub
静的範囲:
CountA
データに関数を適用するために Excel ワークブックを開く必要がないため、これは非常に簡単です。
独自の設定に基づいて交換する必要がある参照:
C:\Users\Matt\Desktop\ExcelFile2.xls
Excelファイルのフルパスに置き換えます
ExcelStaticRangeData
Excel の範囲から取得されたデータを含む、Access でテーブルを呼び出したいものに置き換えます。
Static!A14:EL20
シートの名前と、インポートする Excel のセルの全範囲アドレスに置き換えます。このメソッドは、Excel からデータの静的範囲を取得して Excel のデータにアクセスする方法を説明しているため、インポートする Excel のデータはこの範囲外に出てはいけません。
Command0
このすべてのコードを開始するために使用されているボタンの名前に置き換えます。
Sub ImportDataFromRange()
' Delete any previous access table, otherwise the next line will add an additional table
DoCmd.DeleteObject acTable, "ExcelStaticRangeData"
' Import data from Excel using a static range
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel9, "ExcelStaticRangeData", "C:\Users\Matt\Desktop\ExcelFile2.xls", True, "Static!A14:EL20"
End Sub
Private Sub Command0_Click()
ImportDataFromRange
End Sub
注:
両方の方法のacSpreadsheetTypeExcel9
ビットは、インポートする Excel ファイルのバージョンを参照します。私の例では、Excel 2000 形式をインポートしています。別のバージョンの Excel をインポートしている可能性があるため、これを参照して、コードで参照する必要があるバージョンを確認してください。.xlsxファイルはリストされていませんが、acSpreadsheetTypeExcel12Xml
.
この例では、データをソース データへのアクティブなリンクとして Access に取り込みます。リンクによってパフォーマンスの問題が発生する可能性があるため、大量のデータがある場合は、実際にデータを Access にインポートして保存する方がよい場合があります。acLink
このようなacImport
場合は交換してください。
Access で空のテーブルをまだ手動で作成していない場合 (コードで参照されている同じテーブル名を使用)、それを行うかDoCmd.DeleteObject acTable, "yourAccessTable"
、コードを初めて実行するときにコメントアウトしてから、この部分を元に戻す必要があります。 .
これでできることは他にもあります。たとえば、データ ソースの列数が変動する場合に、動的な列数を考慮に入れるように CountA 関数を調整します。
@david-zemens、@gord-thompson、および他の StackoverFlow ユーザーがこれに到達するのを手伝ってくれたことに、もう 1 つ大きな感謝を表します。