ここで、この質問の有用な点や他のところで私が提起したいくつかの点については、ExcelスプレッドシートからダイナミックレンジまたはセルA1でExcelのデータが開始されない静的範囲。
これらの例では、いずれもボタンを使用してコードを初期化しています。明らかにこのようにする必要はありませんが、フォームとボタンを作成してボタンからコードビルダーを実行し、そのコードを必要な以下のソリューションに置き換える必要があります。
ダイナミックレンジ:
ダイナミックレンジのこの例は、Excelのセルのあなたの範囲が常に同じ一番上の左端の位置で開始することと列の数は常に同じであることを前提としていることを留意してください。つまり、ダイナミックなのは、あなたのセル範囲の一番下の行番号だけです。あなたがあなた自身のセットアップに基づいてアウトを交換する必要があります
参考文献:
C:\Users\Matt\Desktop\ExcelFile1.xls
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
静的範囲:データに関数を適用するExcelブックを開くために必要はありませんよう
これずっと簡単。あなたがあなた自身のセットアップに基づいてアウトを交換する必要があります
参考文献:
C:\Users\Matt\Desktop\ExcelFile2.xls
ExcelStaticRangeData
呼び出したいものは何でもと交換を提出あなたのエクセルのフルパスと交換Accessのテーブルで、Excelの範囲から取得したデータが格納されます。
Static!A14:EL20
シートの名前と、インポートするExcelのセルのフルレンジアドレスを置き換えます。この方法では、のstaticデータ範囲を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
NB:
両方の方法でacSpreadsheetTypeExcel9
ビットをインポートしているExcelのバージョンのファイルを参照します。私の例ではExcel 2000形式をインポートしています。別のバージョンのExcelをインポートしている可能性がありますので、thisを参照して、コードで参照する必要があるバージョンを確認してください。 .xlsxファイルはリストされていませんが、それはacSpreadsheetTypeExcel12Xml
となります。
私の例では、ソースデータへのアクティブなリンクとしてAccessにデータを持ち込みます。多くのデータがある場合は、実際にデータをインポートしてAccessに格納する方が良いでしょう。リンクするとパフォーマンスの問題が発生する可能性があります。この場合、スワップアウトacLink
はacImport
です。
Accessで空白のテーブルを手動で作成していない場合(コードで参照されているテーブル名と同じテーブル名を使用している場合)は、最初にコードを実行したときに実行するかコメントアウトする必要があります。DoCmd.DeleteObject acTable, "yourAccessTable"
その後この部分を元に戻します。
これで行うことができる可能性が高い以上あります - つまり、あなたのデータソースは、列の数を変化させた場合、列の動的な数のアカウントに取るようにCOUNTA関数を適応させます。
@ david-zemens、@ gord-thompsonと他のStackoverFlowユーザーにも感謝します。これは私にとって非常に便利なことです。
ありがとうDavid。私は既にExcelでダイナミックレンジを作成することに慣れていますが、Access VBAを使用してAccessにインポートするのは慣れていません。おそらくこれを読んでいる誰かが、私がVBA構文で始めることができるかもしれません。もしこれが最善の方法です。 –
@MattHall私はすべてのことをする*しかし*テーブルを作成する例を追加しました(私はその方法を知らないので)。しかし、少なくともExcelデータを読み込み、行/列を繰り返し処理することを開始する必要があります。次に、テーブルに書き出すコードを追加するだけです。 –
Davidに感謝します。 'Set xlRange = xlSheet.Range(" A1:B10 ")'部分は私がExcelで指定したダイナミックレンジを受け入れることを前提としています。つまり、名前に 'A1:B10'ビットを代入します。ダイナミックレンジ? –