複数のEXCELファイルを自動でマージするマクロか、ソフトが掲載されているサイト、もしくは、やりかたを教えてください。

<条件>
1.EXCELは、97か2000
2.ファイルは、一つのフォルダにあり、データ形式は一緒。
3.ファイル数は100個以上
4.ファイル名の規則性はなし
5.一つのシートにデータをマージ
6.一つのファイルの容量は、80KBから100KB

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/04/26 20:51:40
  • 終了:--

回答(2件)

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082004/04/26 23:14:54

ポイント30pt

試しにコードを書いてみました。

’ ExcelMarge.vbs

’ Usage : CScript ExcelMarge.xls

Const DIR = ”E:¥home¥edu¥excel¥tmp¥data” ’ 対象データ

Const XLS = ”E:¥home¥edu¥excel¥tmp¥marge.xls” ’ マージ先のファイル

Marge

Sub Marge

Dim cn

Dim rs

Set cn = CreateObject(”ADODB.Connection”)

cn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & XLS & ”;Extended Properties=Excel 8.0”

Dim fs

Set fs = CreateObject(”Scripting.FileSystemObject”)

Dim folder

Set folder = fs.GetFolder( DIR )

Dim file

For Each file In folder.Files

cn.Execute ”INSERT INTO [Sheet1$] SELECT * FROM [Excel 8.0;database=” & file & ”].[Sheet1$]”

Next

End Sub

id:aqua99

検証してみます。ありがとうございます。

2004/04/27 07:31:44
id:mitu_hisa No.2

mitu_hisa回答回数62ベストアンサー獲得回数02004/04/26 23:45:46

id:aqua99

やってみます。ありがとうございます。

2004/04/27 12:39:59
  • id:aqua99
    結局

    1.の方法は、マクロがうまく動かず
    2.の方法は、シートのコピーだったのであきらめました。
    最終的にやりたいのは、複数のブック(ファイル)から検索条件にあうものを抽出して、一覧(エクセルシート)にしたかったのですが。
    別の方法でやってみます。
  • id:cx20
    Re:結局

    > 1.の方法は、マクロがうまく動かず

    どのようにうまく動かなかったのか教えていただければ、
    アドバイスできるかと思います。
    また、サンプルコードの内容が分かりにくいようでしたら解説致します。

    ちなみに「SELECT * FROM 〜」の部分で、条件指定を行うと、
    任意のデータを抽出することが可能です。

    例)2列目のデータの範囲が100〜200のものを抽出。
    SELECT * FROM [Sheet1$] WHERE Field2 >= 100 AND Field2 <=200

    http://support.microsoft.com/default.aspx?scid=kb;ja;257819
  • id:aqua99
    Re(2):結局

    >> 1.の方法は、マクロがうまく動かず

    cx20様:わざわざ、ありがとうございます。

    VBには疎く、使用方法がわからなかったので、自分なりに解釈して
    以下のようにやってみました。

    具体的に書きますと、
    1.ディレクトリ構造は
    c:¥excel直下に
    ┬marge.xls #マージしたデータ格納用の空のファイル
    ├macro.xls #用意していただいたマクロを書いたエクセルファイル
    ├出荷履歴ファイル0300451.xls #マージする元のデータファイル1
    └出荷履歴ファイル0301278.xls #マージする元のデータファイル2

    2.macro.xlsに書き込んだ内容は、用意していただいたマクロの
     DIRとXLSの変数を上記に合わせ変更

    3.macro.xlsからマクロを実行したとき、以下の部分でエラーが発生
     *発生部分
     cn.Execute ”INSERT INTO [Sheet1$] SELECT * FROM [Excel 8.0;database=” & file & ”].[Sheet1$]”
     *エラー内容
      「実行時エラー’-2147467259(80004005)’;
       外部テーブルのフォーマットが正しくありません。」

    以上の内容です。
    私は、VBAはあまりやっていませんが、昔はBasicで組んだこともあるし、現在は、Perlのプログラムは、やります。

    お手数ですが、わかりましたら、お願いします。
    やはり、Excelベースでマージしてしまうのが、一番早くて簡単なので。
  • id:aqua99
    Re(2):結局

    >> 1.の方法は、マクロがうまく動かず

    追加情報:
    使用したのは、Excel97です。
    Office2000もありますが、周囲もまだExcel97が主流なので
    できれば、Excel97でできればと思っています。

    あと、シートは、1枚目のシートだけですが、シート名は、「Sheet1」にはなっていません。
  • id:aqua99
    Re(2):結局

    >> 1.の方法は、マクロがうまく動かず

    上記のエラーは、上記フォルダに、エクセルファイル以外のファイルが
    あったため、発生したものと思われます。
    エクセルファイル以外を削除し、実行した結果、上記のエラーははっせいしませんが、別のエラーが発生。

    エラー内容
    「これ以上ワークシートに書き込むことはできません。」
    エラー箇所は、上記と同じです。
  • id:cx20
    Re(3):結局

    > 3.macro.xlsからマクロを実行したとき、以下の部分でエラーが発生
    >  *発生部分
    >  cn.Execute ”INSERT INTO [Sheet1$] SELECT * FROM [Excel 8.0;database=” & file & ”].[Sheet1$]”

    テーブル名として ”[Sheet1$]” を使用していますが、
    これは実際のシート名+ドル記号で表現します。
    たとえば「出荷履歴」というシート名でしたら、
    ”[出荷履歴$]” という表現になります。

    > エラー内容
    > 「これ以上ワークシートに書き込むことはできません。」

    Excel97 だと、シート内の最大行数が 65,535行 だったと思います。
    もし、データ件数の合計が 65,535件 以上あるようでしたら、
    結合は行えません。

    そのような大量データを扱うのであれば、MS-Access
    (もしくは、他のデータベース製品)などを検討したほうが
    良いかもしれません。
  • id:aqua99
    Re(4):結局

    >テーブル名として ”[Sheet1$]” を使用していますが、
    >> エラー内容
    >> 「これ以上ワークシートに書き込むことはできません。」
    >
    >Excel97 だと、シート内の最大行数が 65,535行 だったと思います。
    >もし、データ件数の合計が 65,535件 以上あるようでしたら、
    >結合は行えません。

    現在、検証するために、上記のファイルのシート名は、「Sheet1」に変更しましたが、エラー内容は変わりません。

    一つのファイルは、75KB程度で、row数は、160行ほどです。

    >そのような大量データを扱うのであれば、MS-Access
    >(もしくは、他のデータベース製品)などを検討したほうが
    >良いかもしれません。

    MS-Accessの場合、結局、アクセスのテーブルに、エクセルファイルを
    手動でリンクしなければ、いけないので、新しいファイルが
    追加された場合、都度、手動の作業が発生してしまうと思います。
    (モジュールで、組み込めば自動も可能かと思いますが、
     VBAは不慣れなので、工数を食ってしまうのでやめときます。)

    現在は、web上から、フリーソフトを使用して、エクセルを一括でCSVに変換して
    web上から検索をかけて、エクセルで出力するようにしてます。
    Perlで、エクセルファイルから直接読み込むことができますが、
    ファイル数が多すぎて、時間がかかりすぎるため、テキストベース
    のCSVファイルにしました。

  • id:cx20
    Re(5):結局

    > 一つのファイルは、75KB程度で、row数は、160行ほどです。

    160行 * 100ファイル = 16,000 行となり、
    65,535行の最大件数には達していませんので大丈夫そうですね。

    > 「これ以上ワークシートに書き込むことはできません。」

    何がエラーの原因か特定できません。
    1ファイル目の(結合)処理で、このエラーが出るのでしょうか?

    試しに、テストデータとスクリプト(excel_marge.zip)をアップして置きました。
    これで試していただけないでしょうか?
    もし、これが動くようでしたら、データの内容に原因があるような気がします。
    http://www.hondarer-soft.com/cx/pukiwiki/pukiwiki.php?Memo%2F2004-04-26

    http://www.hondarer-soft.com/cx/pukiwiki/pukiwiki.php?Memo%2F2004-04-26
  • id:aqua99
    (投稿者削除)

  • id:aqua99
    Re(6):結局

    >これで試していただけないでしょうか?
    >もし、これが動くようでしたら、データの内容に原因があるような気がします。

    いろいろとありがとうございました。
    結局、動くには、動きました。
    原因の一因として、marge.xlsにfield名を書き込んでおかなかったのが
    いけなかったみたいです。
    ただ、一部のファイル(データ)に問題があるみたいで(データ以外のセルにゴミがいるみたい)、下記のエラーが出てしまいます。
    「実行時エラー ’-2147217900 (80040e14)’:
     INSERT INTO ステートメントに、認識できないフィールド ’F23’ があります。名前が正しいことを確認して、再度実行してください。」

    データは、V列までしかないのですが、AP列ぐらいまで、何かデータがあり、
    AP列まで、marge.xlsと元のファイルにフィールド名をつけたら、エラーは発生しなくなりました。

    どもでした。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません