2013-04-10 6 views
5

で起動しませんMS-AccessにでExcelの範囲?インポート動的および静的には、その範囲内のデータがAccessで使用可能な表として表示されるように、私はExcelスプレッドシートからデータ範囲をリンクするかもしれませんどのようにセルA1

セルA1から始まるデータを持つExcelシートにリンクするのは簡単ですが、Excelスプレッドシートのデータがシートのどこかで始まる場合は、特にピンポイントにアクセスする方法がわかりません非A1の範囲は動的です。

のアクセスは、インポート/リンクウィザードを通過するときの名前/ダイナミックレンジをピックアップしていないようです。

実世界のシナリオ:

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

Dynamic」という名前のシート/タブは、Accessでテーブルとして使用できるデータ範囲を持っていますが、列見出しは列14から列ELに移動します。私がしたいことは、このデータ範囲をテーブルとして取り上げることです。さらに、「ExcelFile1.xls」も定期的に更新されます、「ExcelFile.xls」ファイルのすなわち新しいバージョンが利用可能になったが、14行目の列見出し以下のより多くのデータを持つので、理想的に私が迎えにアクセスをしたいと思います以前のバージョン "ExcelFile1.xls"を上書きするたびにこの範囲の新しいデータが表示されます。

私はまた別のExcelスプレッドシートファイルを持っていますが、これを "ExcelFile2.xls"と呼びましょう。

これは、シート/タブを持っている、のは同様Accessでテーブルとして私が欲しいのデータ範囲を持っており、再び、「ExcelFile2.xls」の新しいバージョンが存在することを、「静的」と呼んでみましょうそれは私が理想的にはAccessが欲しいと思っていた以前のバージョンを上書きします。この範囲はA14:O19であり、常にこの範囲(静的範囲)になります。

だから、要約すると:私はAccessで利用できる2つの別々のテーブルを生成するために2つのそれぞれのExcelファイルから2つのデータ範囲へのアクセスをリンクしたいと思います。 1のソースデータ範囲は動的で、もう1つは静的です。可能であれば、元のExcelファイルを正確に同じファイル名とパスの新しいバージョンで上書きするだけで、新しいデータを取得するようにしたいと思います。

答えて

3

ここで、この質問の有用な点や他のところで私が提起したいくつかの点については、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に格納する方が良いでしょう。リンクするとパフォーマンスの問題が発生する可能性があります。この場合、スワップアウトacLinkacImportです。

  • Accessで空白のテーブルを手動で作成していない場合(コードで参照されているテーブル名と同じテーブル名を使用している場合)は、最初にコードを実行したときに実行するかコメントアウトする必要があります。DoCmd.DeleteObject acTable, "yourAccessTable"その後この部分を元に戻します。

これで行うことができる可能性が高い以上あります - つまり、あなたのデータソースは、列の数を変化させた場合、列の動的な数のアカウントに取るようにCOUNTA関数を適応させます。

@ david-zemens、@ gord-thompsonと他のStackoverFlowユーザーにも感謝します。これは私にとって非常に便利なことです。

2

私は、Access男じゃないけど、私はあなたを助けることができる必要があり、いくつかのポインタを与えてみましょう。シート/タブの

1、の「ダイナミック」、それを呼ぶことにしましょう、私はAccessでテーブルとして利用できる をしたいデータの範囲を有するが、その列見出しは、カラムELに渡って行く、行 14で開始します。私がしたいことは、 このデータ範囲をテーブルとして受け取ることです。さらに、「ExcelFile1.xls」も はすなわち ファイル「ExcelFile.xls」の新バージョンでは、理想的には、私が迎えにアクセスしたいのですが、行14の列 見出し以下のより多くのデータと、利用可能になるだろう、定期的に更新されます "ExcelFile1.xls"の前のバージョンを上書きするたびに、新しいデータを にアップしてください。

いいえ、このワークシートでは、動的な名前付き範囲を設定したいと思うでしょう。基本的には、新しいデータが追加されるたびに範囲を決定/変更する数式を作成します。ここから始め、動的な名前付き範囲を作成する方法の概要については

:VBAで

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

は、その後、最悪のシナリオでは、この名前付き範囲にアクセスできることである、としてその内容を読んで配列変数を使用するか、単純に行/列を繰り返して、その内容をAccessテーブルに書き出します。しかし、Accessのプログラマーではなく、これを行うためのやや効率的なやり方があります。

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

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

EDITは、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 

これで十分です

+0

ありがとうDavid。私は既にExcelでダイナミックレンジを作成することに慣れていますが、Access VBAを使用してAccessにインポートするのは慣れていません。おそらくこれを読んでいる誰かが、私がVBA構文で始めることができるかもしれません。もしこれが最善の方法です。 –

+0

@MattHall私はすべてのことをする*しかし*テーブルを作成する例を追加しました(私はその方法を知らないので)。しかし、少なくともExcelデータを読み込み、行/列を繰り返し処理することを開始する必要があります。次に、テーブルに書き出すコードを追加するだけです。 –

+0

Davidに感謝します。 'Set xlRange = xlSheet.Range(" A1:B10 ")'部分は私がExcelで指定したダイナミックレンジを受け入れることを前提としています。つまり、名前に 'A1:B10'ビットを代入します。ダイナミックレンジ? –

関連する問題