6

Excel スプレッドシートのデータ範囲をリンクして、その範囲内のデータが Access で使用可能なテーブルとして表示されるようにするにはどうすればよいですか?

セル A1 で始まるデータを含む Excel シートにリンクするのは簡単ですが、Excel スプレッドシートのデータがシートの別の場所で始まる場合、特に A1 以外の場合に、Access でそれを特定する方法がわかりません。範囲は動的です。

インポート/リンク ウィザードを実行するときに、Access が名前付き/動的範囲を取得していないようです。

現実世界のシナリオ:

私は Excel スプレッドシート ファイルを持っています。これを「ExcelFile1.xls」と呼びましょう。これは外部から提供されています (そのため、その書式を実際に変更することはできません)。

シート/タブの 1 つ、「動的」と呼びましょう。Access でテーブルとして使用したいデータ範囲がありますが、その列見出しは行 14 から始まり、列 EL まで続きます。Access にこのデータ範囲をテーブルとして取得してもらいたいのです。さらに、「ExcelFile1.xls」も定期的に更新されます。つまり、「ExcelFile.xls」ファイルの新しいバージョンが利用可能になりますが、行 14 の列見出しの下により多くのデータがあるため、理想的には Access に新しいバージョンを取得してもらいたいと考えています。以前のバージョンの「ExcelFile1.xls」を上書きするたびに、この範囲のデータが表示されます。

別の Excel スプレッドシート ファイルもあります。これを「ExcelFile2.xls」と呼びましょう。これも外部から提供されたものです。

これにはシート/タブがあり、「 Static 」と呼びましょう。これは、Access のテーブルとして必要なデータ範囲を同様に持ちます。また、以前のバージョンを上書きする「 ExcelFile2.xls 」の新しいバージョンがあります。理想的には Access のようなものです。この範囲はA14:O19常にこの範囲です (つまり、静的範囲)。

要約すると、Access を 2 つの Excel ファイルから 2 つのデータ範囲にリンクして、Access で使用できる 2 つの個別のテーブルを作成したいと思います。ソース データ範囲の 1 つは動的で、もう 1 つは静的です。可能であれば、ソース Excel ファイルをまったく同じファイル名とパスの新しいバージョンで上書きするだけで、Access が新しいデータを取得できるようにしたいと考えています。

4

2 に答える 2

5

さて、ここでのこの質問と、私が他の場所で提起したいくつかの他の質問に関する有用な指針から、Excel スプレッドシートからダイナミック レンジまたはスタティック レンジのいずれかとしてデータを取得したい人にとって、かなり単純な解決策があると思います。 Excel のデータはセル A1 から始まりません。

これらの例は両方とも、ボタンを使用してコードを開始します。もちろん、このようにする必要はありませんが、そうする場合は、フォームとボタンを作成し、ボタンからコード ビルダーを実行して、そのコードを以下の必要なソリューションに置き換える必要があります。

ダイナミックレンジ:

この動的範囲の例は、Excel のセル範囲が常に同じ左上端の位置から始まり、列数が常に同じであることを前提としていることに注意してください。セルの範囲。

独自の設定に基づいて交換する必要がある参照:

  • C:\Users\Matt\Desktop\ExcelFile1.xlsExcelファイルのフルパスに置き換えます

  • DynamicExcel ファイルに含まれるシートの名前に置き換えます

  • A14:A2000テストする範囲に置き換えて、空でないセルがいくつあるかを確認します。この範囲は次のようにする必要があります。列見出しが配置されているデータの行から開始します。インポートしようとしているデータ内の、空のセル エントリが決してない列をカバーします。Excel スプレッドシートの実際のデータを含む行数を常に超える十分な範囲をカバーします。

  • ExcelDynamicRangeDataExcel の範囲から取得されたデータを含む、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.xlsExcelファイルのフルパスに置き換えます

  • ExcelStaticRangeDataExcel の範囲から取得されたデータを含む、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 つ大きな感謝を表します。

于 2013-04-11T11:08:04.917 に答える
2

私は Access の専門家ではありませんが、役立つヒントをいくつか紹介します。

シート/タブの 1 つ、「動的」と呼びましょう。Access でテーブルとして使用したいデータ範囲がありますが、その列見出しは行 14 から始まり、列 EL まで続きます。私が Access に実行してほしいのは、このデータ範囲をテーブルとして取得することです。さらに、「ExcelFile1.xls」も定期的に更新されます。つまり、「ExcelFile.xls」ファイルの新しいバージョンが利用可能になりますが、行 14 の列見出しの下により多くのデータがあるため、理想的には Access に新しいバージョンを取得してもらいたいと考えています。以前のバージョンの「ExcelFile1.xls」を上書きするたびに、この範囲のデータが表示されます。

では、このワークシートで動的な名前付き範囲を設定します。基本的に、新しいデータが追加されるたびに範囲を決定/サイズ変更する数式を作成します。

動的な名前付き範囲を作成する方法の概要については、ここから始めてください。

http://support.microsoft.com/kb/830287

VBA では、最悪のシナリオは、この名前付き範囲にアクセスし、その内容を配列変数に読み込むか、単に行/列を反復処理してから、それらの内容を Access テーブルに書き出すことです。しかし、Access プログラマーではないので、これを行うためのもう少し効率的な方法があるかもしれません。

これにはシート/タブがあり、「静的」と呼びましょう。これは、Access のテーブルとして必要なデータ範囲を同様に持ちます。また、以前のバージョンを上書きする「ExcelFile2.xls」の新しいバージョンがあります。理想的には Access のようなものです。この範囲は A14:O19 であり、常にこの範囲になります (つまり、静的範囲)。

同様に、=$A$14:$O$19どれが静的な名前付き範囲になるかを定義する別の名前付き範囲を作成できます。その後、上記のように扱うことができます。

編集これは、Excel データを取得し、行と列を反復処理する例です。コードを追加して、フィールド/レコード/などを Access のテーブルに追加するだけです。

Sub ImportDataFromRange()
'Access variables
Dim dbFile As Database
Dim tbl As TableDef, fld As Field

'Excel variables
Dim xlApp As Excel.Application
Dim xlFile As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim xlRange As Excel.Range
Dim r#, c#
Dim clVal As String 'string to hold cell's value, may need to modify this type.

Set dbFile = CurrentDb

'Use this to create a new table definition
'    Set tbl = dbFile.CreateTableDef("Test")
'Use this if your table already exists:
    Set tbl = dbFile.TableDefs("Test")

'Get the info from Excel:
Set xlApp = New Excel.Application

Set xlFile = xlApp.Workbooks.Open("C:\Users\david_zemens\desktop\Book1.xlsx")
Set xlSheet = xlFile.Sheets("Sheet1")
Set xlRange = xlSheet.Range("A1:B10")

    For r = 1 To xlRange.Rows.Count
        For c = 1 To xlRange.Columns.Count

            'Add code to append new fields/records/etc to your table

        Next c
    Next r

xlApp.Quit
Set xlApp = Nothing


End Sub

始めるにはこれで十分だと思います!

于 2013-04-10T16:30:59.537 に答える