ExcelのデータをVBAで読み込む際の問題点と解決方法

このQ&Aのポイント
  • ExcelデータをAccess VBAを使って読み込んでテーブルに溜め込んでいますが、時折列の追加や削除が行われるため、プログラム修正が必要となります。
  • この問題を解決するためには、Excelのデータの列数を事前に検知し、動的にテーブルのスキーマを変更する方法が有効です。
  • Accessでの対応に加えて、VB.NETやSQL Serverを学び、これらのツールを使用して解決することも検討できます。
回答を見る
  • ベストアンサー

ExcelをVBAで読み込むと

ExcelデータをAccess VBAを使い、読み込んでテーブルに溜め込んでいます。 問題が1つあり、Excelのデータは他のシステムによって自動で作られています。 このExcelデータは1行目に見出しがあります。この見出しの列が時々追加されたり、削除さたりします。 例えば、下記の2列があるとします。読み込みたいのはID,NAMEのみです。 ID,NAME この2列が固定であれば、問題ありません。しかし、時々、 ID,SEIBETU,NAME と、SEIBETUという項目が追加されたりします。そうすると、Access VBAで読み取ろうとするとエラーが出ます(プログラムの修正をすればいいのですが)。 こういった問題を解決するには、何かいい方法はあるでしょうか?Accessでやっていますが、VB.NET、SQL Serverで解決できるなら、そちらを勉強して解決したいと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

当該Excelファイルの保存場所とファイル名が常に同じなら、 Excelファイル自体をリンクテーブルとしてはいかがでしょうか。 そうしてしまえば、後はそのリンクテーブルから「ID」と「NAME」 フィールドのみを指定した追加クエリを作成することで、 それ以外のフィールドを一切無視して、データを取り込むことが できると思います。 【Excelからのリンクテーブルの作成方法】 <Access2003以前> 1)データベース ウィンドウ(テーブルなどの一覧が表示される  画面)を右クリック 2)「テーブルのリンク」を選択して、『リンク』ダイアログを開く 3)同ダイアログ下方にある『ファイルの種類(T)』のコンボボックス  で、「Microsoft Excel」を選択 4)当該ファイルを指定したら、『リンク(K)』ボタンをクリック <Access2007以降> 1)『外部データ』リボンを選択 2)『インポート』グループ(?)内にある『Excel』ボタンをクリック 3)『外部データの取り込み - Excelワークシート』ダイアログが  開くので、『ファイル名(F)』に当該ファイルを指定  (アドレスを貼り付けるか、『参照(R)』ボタンで指定) 4)その下にあるオプションボタンから、『リンク テーブルを作成して  ソース データにリンクする(L)』を選択 以上の操作を行うと、ウィザードが起動しますので、必要な 設定を指定すれば、Excelファイルへのリンクテーブルが作成 できます。 このリンクテーブルは(他社特許の関係で)参照専用となって いますが(古いバージョンだと編集可のままかもしれません)、 それ以外は通常のテーブルと同様に扱えますので、これを 元に追加クエリまたはテーブル作成クエリを作れば、実質的に 「Excelからのインポート」と同様のことが行えます。 ※Excelファイルの保存先やファイル名が一定でない場合も、  VBAでFileDialogオブジェクトやTransferDatabaseメソッド等を  使用して当該ファイルへのリンクを行うコードを作成すれば、  一応対応は可能かと思います。

mellow91
質問者

お礼

なるほど、そういう手があるのですか。とても勉強になりました。ご回答ありがとうございました!!

その他の回答 (1)

回答No.1

・運用として、ID、NAME以外の列は削除した形でVBA作業へ引き渡す。 ・ID、NAMEという名前が固定ならば、VBAを修正し、ID、NAMEの列を導き出して、その列を処理する  ようにする。 ・「他のシステム」が、ID、NAMEしか出力しないように修正する。 処理するソフトウェアやDBがどうのこうのという解決法は無いと思います。 仕組みのインターフェースが統一されていないことが問題ならば、検討すべきはソフトウェアではなく そのインターフェース、または回避ルートです。

mellow91
質問者

お礼

ご回答ありがとうございます!!やはり、列などを削除して統一するしかありませんか。わかりました、感謝です!!

関連するQ&A

  • EXCEL VBA行のコピー繰り返し

    EXCEL VBAで行の特定の列の数字を読み取りコピーしてすぐに下の行に挿入して次の行へというようなことがしたいと考えております。 例 商品ID1の数量の列の数値を読み取り4なら同じデータを3行追加する。追加後次の項目へ(商品ID2の行へ) VBAで可能でしょうか?

  • Excel VBA からの Access 呼び出しでの挙動不審

    ADO を使って、Excel VBA から Access のテーブルを検索しようとしています。 Excel, Access 共に 2000 です。 変数の説明:  myConn は、ADODB.Connection。  mySQL は、 String。 コード: mySQL = "INSERT INTO T1 (ID) SELECT ID FROM T2 WHERE Name like '*日本*'" myConn.Execute mySQL というコードで、テーブルT1 へテーブルT2 の ID フィールドのデータを転送しようとしています。検索条件として、テーブルT2 の Name フィールドを指定しています。  T2 のデータはきちんと入っており、実際この mySQL の文字列をそのまま Access のクエリに Copy & Paste して実行すると、うまく動きます。  具体的には、SELECT 以後をクエリに Copy & Paste してデータ表示すると、Name に「日本」を含むデータが表示されました。  しかし、Excel VBA のプログラムからでは、何もヒットしない結果となります。  Access クエリでの書式と、Excel VBA からコールするときの書式とは違うのでしょうか。  よろしくお願いします。

  • ExcelデータをAccessに取得させる方法

           エクセル           Access    A列   B列  C列      フェールド名  人 りんご みかん ばなな キャベツ    リンゴ  3   木村               木村  3    2    みかん  2   木村             小林             4    ばなな  4  小林               青木                   2    キャベツ 2  青木 のようにエクセルのデータでA列をAccessのフィールド名にし、もし無ければ、その項目名(りんご等)をフィールド名に追加させ、上の右図のようにAccessにデータを取得させるコードを作りたいと考えてます。  取得させる場合はExcellではなく、Access VBAで取得させたいです。  どんなコードを書いたらよろしいのですか?  分かる方がおられましたら、よろしくご指導くだされとうれしいです。  私のVBAのレベルですが、Access VBAは今回初めてで、Excel VBAは中級くらいかと思います。  よろしくお願いします。

  • リストボックスの列見出し(ExcelのVBA)

     ExcelのVBAでのリストボックスコントロールについての質問です。  リストボックスの列見出しを作りたいのですが、なかなか上手く行きません。リストボックスに項目を設定するのはExcelのシートから… ----- WorkSheets("Sheet1").ListBox1.ListFillRange = "A1:B2"  ↑(Sheet1のA1:B2のデータをListBox1に追加する場合)↑ ----- のようにするのではなく… ----- Dim MyList(1,1) ~~~(MyList配列にデータを代入) Userform1.ListBox1.Column = Mylist() -----  というように、コードから項目を追加しています。  そこで、列見出しを追加したいと思ったのですが… ----- ListBox1.ColumnHeads = True ----- と記述しても、列見出しは真っ白で、その下に項目が表示されるだけです。  列見出し専用の配列を用意しなければならないというような事はあるのでしょうか?  もしあれば、どのように定義すればよいのでしょうか。  ちなみに、用いているExcelの環境は『Microsoft Excel 2004 for Mac (11.5.6)』、VBAの環境は『Microsoft Visual Basic (11.5)』です。  我流で覚えてきたような知識ですので、とても常識的な事を聞いているかもしれないですが、回答宜しくお願いします。

  • Excel VBA Accessでデータ取り込み

    Excel VBA、Access VBAについてお教え下さい。 「My_Excel.xlsm」というファイルがあります。このファイルにはボタンが1つあります。 このボタンを押すことにより、「Imp_Excel.xlsx」というファイルを取り込みたいと思います。 取り込み先ですが、「My_Excel.xlsm」に取込むのではなく、Accessの「My_Access.accdb」の「T_MyTable」というテーブルに取り込みたいと思っています。 Accessから直に「Imp_Excel.xlsx」をインポートするには、TransferSpreadsheetを用いれば比較的簡単にデータをAccessに取り込むことができるのですが、「My_Excel.xlsm」をまたいでAccessに取り込みたいので、TransferSpreadsheetは使えません。 やり方としては、 My_Excel.xlsxを開く。 レコードセット取得。 レコードセットがEOFになるまでまわして、SQLのINSERT、またはAddNewメソッドを使用して1件1件挿入していくしか方法はないでしょうか? 今のところ、私が思い浮かぶのは上記の方法なのですが、何かもっと簡単にやれるような方法はあるでしょうか?よろしくお願いします。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

  • アクセスの外部データ(エクセル)の取り込み。VBA

    アクセスの外部データ(エクセル)の取り込み。VBAの質問です。 アクセス2003 エクセル2003 不要な行・列がある場合の外部データ取り込みVBAを教えて下さい。 今は、エクセルで削除して取り込んでいます。 アクセスに「得意先リスト」というテーブルを作っています。 コード(テキスト型)主キー 名称(テキスト型) フリガナ(テキスト型) 郵便番号(テキスト型) 住所1(テキスト型) 住所2(テキスト型) TEL(テキスト型) FAX(テキスト型) エクセルブック[得意先リスト.xls] シートは「リスト形式」のみです。 1~4行は不要。 5行目が見出しです。 A~AZ列までデータがあります。 必要な列は、B・C・D・F・G・H・M・N列です。 セルの書式設定は「文字列」です。 [アクセス エクセル インポート 行 列 削除]などでサンプルVBAを探しましたが見つからなかったので質問させて頂きました。 申し訳ありませんが、教えて下さい。

  • エクセル VBA

    エクセルVBAで以下のようなデータがあります。 D列の文字列と右隣のE列の文字列の2つが入っているものをA列から探し、見つかったセルの上にセルを追加し、E列の右隣のF列に入っている文字列を代入したいです。 どのようなプログラムになりますか?

  • エクセルVBAでの質問です。

    エクセルVBAでの質問です。 以下のようなA列にID、B列、C列にそれぞれIDに対応したデータがあります。 A      B      C ID    名前    住所 10000 ~ 39999 IDを10000~19999、20000~29999、30000~39999で分けて別シートに もっていこうと思っています。 自分としては、ID左端の数字をLeft関数を使って何とかしようと思っていましたが、 どうしてもうまくいきません。 何かいい方法はないでしょうか。

  • エクセルVBA

    エクセルVBAで、列の非表示をさせるためにはどうしたら良いでしょうか? また、別の質問になりますが、エクセルVBAで出した 結果をACCESSのレポート等で印刷させることって出切るんでしょうか? 前者はどうにかお知恵を借りてできるようにしたいです。後者はもし出来なければかまいません。 よろしくお願いいたします。