• ベストアンサー

複数のエクセルファイルのシートを1枚のシートに

100個以上のエクセル(CSV)ファイルの1枚目のシートに同じ書式のファイルが多数(100個程度)有るのですが、これを1枚のシートにまとめる方法は無いのでしょうか? 一枚のシートの行数は数行~50行以下で、全部のデータを1枚に纏めてデータ処理したいのですが、一括は無理でも出来るだけ簡単に出来る方法をお願いします。 尚、当方VBAは不得手で、あまり長いと(長くなくても)動くまでの試行錯誤の手間ひまで100枚のファイルのシートへのコピペが終わってしまう程度の実力ですので、ご配慮?お願い致します。

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8620/18438)
回答No.6

#1 & #5です。 > ’type*.csv'は内部コマンド、外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません これは type*.csv > all.txt と書いているからです。typeの後の空白がありません。 type *.csv > all.txt としてください。

akira0723
質問者

お礼

で、で、出来ました~!!!! 不慣れなVBAで出来るまで試行錯誤するか、だめなら諦めて、総当たりでコピペするか、と考えていたのですが、こんなに簡単にできてしまったので、感動的ですらあります。 今月末にcsvファイルに抜き出す作業を開始します。 最終的にはcsvファイルに抜き出す方法から知りたかったのですが、当方の知識では、その状況説明がうまく出来そうにないので、100回程度の抽出作業は手作業でやれるので、その先の結合だけは何とかならないかと。 本当に助かりました。

その他の回答 (5)

  • f272
  • ベストアンサー率46% (8620/18438)
回答No.5

#1です。 Windowsのエクスプローラで,フォルダを作るのはできますね。まず作業用のフォルダを作ってください。次にその中に必要なCSVファイルをすべてコピーしてください。これで準備作業は終わりです。 次にエクスプローラで作業用のフォルダを,Shiftキーを押しながら右クリックしてください。「コマンドウィンドウをここで開く(W)」というのがあると思いますので,それを選択してください。真っ黒な画面が出てくるはずです。これで「コマンドプロンプトを起動して,そのフォルダに移動します」まで終了です。 次にその真っ黒な画面にキーボードで type *.csv > all.txt と書いて,エンターキーを押してください。そうすると作業用のフォルダの中にall.txtという名前のファイルができています。 次に拡張子をtxtからcsvに変更するのですが,例えば ren all.txt all.csv と真っ黒な画面にキーボードで打ってエンターキーを押してください。これでall.csvが出来ました。 最後はall.csvをエクセルで開いてください。以上です。

akira0723
質問者

補足

早々のご回答ありがとうございます。 データファイルが会社にしかないので土日は試せませんでした。 朝から、サンプルフォルダをデスクトップに作成して、csvファイルを2つだけ入れてみて試してみたのですが、下記のエラーメッセージが出てしまいました。 「’type*.csv'は内部コマンド、外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません」 何度かやって見ましたが同じメッセージが出てきます。 念のため、フォルダを覗いたら、all.txtというファイルが有ったので、一応拡張子の変更を教えて頂いた通りに実行したら、all.csvが出来たのですが、残念ながら、開いてきたエクセルの1枚目の「all」のシートは白紙でした。 何度も恐れ入りますが、上記のエラーの解決方法を教えて下さい。

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.4

(1)手操作では大変でしょう。コピペなど。 (2)メニューにある操作で質問に適した機能はないと思います。 2シートを合体させるなどの操作。 (3)VBAや(1部)VBSを使うと、やや簡単になる。 本質問は、VBA向けの質問だろう。 ーー 問題は「100個以上のエクセル(CSV)ファイル」の(フォルダー的に)あり場所がどういう状態か書かないと、むつかしさが、格段に違う。 2、3のフォルダに分かれているぐらいなら、手動で、1つのフォルダにまとめて、そちらを対象にVBAでやるのが簡単。もう一つ、対象外のファイルも、そのフォルダにあるのかどうか書かないと、コードが書けない。 少数なら、そのファオルダから対象外のフォルダを排除して、VBASを考える方が簡単。 対象外のファイルを排除するのは、(言葉で表現巣すなら)どういう表現になるか? こんなことも書いてないのは質問として不十分。  結局この問題に対処するには、周辺の勉強・経験が至ってないと思うので、回答のコードをまる写しにせざるを得ない、になってしまう。 ーー どうせ仕事の絡みの問題だろうが、そういう仕事の絡みの問題は、VBAができないでは、手を出せないと思うよ。少なくても、WEBのVBAコードを実行できるようになると、勉強できるよ。 ーー ファイルが、同じフォルダーにあり、他に対象外のものが含まれないなら、割合コードは簡単。 == Googleででも例えば、「フォルダ内のファイルを結合」で照会したか? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1155537766 などそっくりの質問だろう。 VBAの動かし方を書物やWEBで調べ、上記のWEBのコードでもコピペしてやってみて、それからの質問だ。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

「VBScript」で組みましたので、「Windows限定」です。 以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。 「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず半角です。 できたプログラムファイル(「~.vbs」ファイル)を、目的の「csv」ファイルが存在するフォルダに放り込んで、ダブルクリック(「シングルクリック」→「Enter」の方が確実)して、実行すると、プログラムファイル(「~.vbs」ファイル)が存在するフォルダの中の、すべての「csv」ファイルをエクセルファイルに読み込みます。 プログラムが動き始めたかどうか、分かりにくいので、最初に「Start!」と表示しますので、「OK」を押して、スタートしてください。 最後に、「Finished!」と表示しますので、「OK」を押して、終了してください。 Option Explicit Dim a, b, c, i, u, v, w, x, y, z MsgBox("Start!") Set u = CreateObject("Scripting.FileSystemObject") Set v = u.GetFolder(".") Set w = CreateObject("Excel.Application") w.Application.DisplayAlerts = False w.Visible = False Set x = w.Workbooks.Add() Set y = x.Worksheets(1) a = 0 For Each b In v.Files If LCase(u.GetExtensionName(b.Name)) = "csv" Then Set z = u.OpenTextFile(v & "\" & b.Name, 1) Do Until z.AtEndOfStream c = Split(z.ReadLine, ",") a = a + 1 For i = 0 to UBound(c) y.Cells(a, i + 1).Value = c(i) Next Loop z.Close Set z = Nothing End If Next x.SaveAs(v & "\Result.xlsx") x.Close w.Quit Set y = Nothing Set x = Nothing Set w = Nothing Set v = Nothing Set u = Nothing MsgBox("Finished!") 簡単な説明です。 Option Explicit 「厳密に」というような意味ですが、気にしないでください。 Set u = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしていますが、今回は特に、「csv」というテキストファイルを扱えるようにもしています。 Set v = u.GetFolder(".") プログラムファイル(「~.vbs」ファイル)が存在するフォルダを取得しています。 Set w = CreateObject("Excel.Application") エクセルを扱えるようにしています。 w.Application.DisplayAlerts = False w.Visible = False 「上書きしますか」などと聞いてこないように、また、エクセルを表示しません。 Set x = w.Workbooks.Add() ワークブックを新規作成しています。 Set y = x.Worksheets(1) 一番左端のシートを「y」にセット。 a = 0 行カウント用。 For Each b In v.Files プログラムファイル(「~.vbs」ファイル)の存在するフォルダの中のすべてのファイルを1つずつ処理。 If LCase(u.GetExtensionName(b.Name)) = "csv" Then もし、拡張子が「csv」なら(「LCase()」関数は、英字を小文字に、「GetExtensionName()」は、「Scripting.FileSystemOnbject」の機能を使って(「u.」)、拡張子を取得しています)。 Set z = u.OpenTextFile(v & "\" & b.Name, 1) 見つけたファイルを開いています。 Do Until z.AtEndOfStream ファイルが終端に達するまで。 c = Split(z.ReadLine, ",") 「z.ReadLine」は、1行読み込み。 「Split()」関数は、文字列を区切り記号を使って分割し、配列変数に格納します。 すなわち、読み込んだ1行が、「1,2,3」の場合、「c(0) = 1」、「c(1) = 2」、「c(2) = 3」となります。 a = a + 1 1行カウント。 For i = 0 to UBound(c) 配列変数の添え字(「()」内の数字)の最大値は「UBound()」によって返ってきます。 配列変数は「0」から始まるので、先ほどの例だと、「UBound(c)」で返ってくるのは、「2」です。 y.Cells(a, i + 1).Value = c(i) 配列変数の値をセルに書き込んでいます。 を、繰り返しています。 z.Close Set z = Nothing 「csv」ファイルを閉じています(「Set」でセットした変数は、解放しておくのですが、気にしないでください)。 x.SaveAs(v & "\Result.xlsx") x.Close w.Quit エクセルのファイルを「csv」ファイルが存在する同じフォルダに「Result.xlsx」という名前で保存し、ファイルを閉じ、エクセルを終了しています。 あとは、終了処理で、最後に、「Finished!」と表示しています。

  • msMike
  • ベストアンサー率20% (368/1813)
回答No.2

「1枚目のシートに同じ書式のファイルが多数有る」は、支離滅裂な表現ですが・・・ もういちど正しく仰ってください。

akira0723
質問者

補足

申し訳ありません。 エクセル(CSV)ファイルが多数あります。 実際にはこれからデーターをCSV形式でバッチ処理で抜き出すのですが、恐らく100件程度にはなると思っています。 この100個のエクセルファイルの1枚目のシートに抜き出したデーターが同じ形式で保存されます。 この100枚(個)のシート(ファイル)を1枚のエクセルシートにまとめたいのです。 目的は理解していただけたでしょうか?  宜しくお願いします。

  • f272
  • ベストアンサー率46% (8620/18438)
回答No.1

100個以上のエクセル(CSV)ファイルというのだけが入っているフォルダを作って,コマンドプロンプトを起動して,そのフォルダに移動します。コマンドプロンプトに type *.csv > all.txt と打ち込めばall.txtができて,すべてがまとまったファイルになっています。all.txtの拡張子をcsvに変更してからエクセルで開いてください。

akira0723
質問者

補足

早々のご回答に感謝!! 出来そうな気がするのですが、コマンドプロンプトというやつは昔DOSで少しいじったC:¥>みたいなやつですよね? 情けないことにフォルダに移動(ファイルのパスですよね?)は出来たと思うのですが。。。 少しネットで調べてみて、試しにデスクトップのフォルダを「cmdの黒い画面」にドラックすれば入るようなのですが、その後の 「コマンドプロンプトにtype *.csv > all.txtと打ち込む」方法が分かりません。(トホホ・・・状態)。 出来そうなのでお手数をおかけしますが、何卒よろしくお願い致します。 この作業を定期的に実施することになりそうなので何とかお願いしたいのですが。 これで出来そうなので、総当たりでのコピペ作業はやる気が無くなってしまっていますので何とか宜しくお願い致します。 所で作られたall.txt のファイルはどこに保存されるのでしょう? 普通に探せれば何処でもいいのですが。。。。

関連するQ&A