• ベストアンサー

複数ブックの特定セル列を新しいブックへ集約したい

お願い致します。 下記の操作をVBAで行いたいと思っています。 下記画像サンプルにあるように、複数ブック(同じ階層)に同じ配列のデータがあります。 こちらの、黄色く色付けしている(実際は色付けされていません)複数列を新たなブックの1シートへ抽出したいと考えています。 列のデータ量は、各ブックごとに違っていますので、11列のデータを基準に抽出できればと思います。 複数シートを1つのシートに纏めCSVで出力するとこまではVBAで出来たのですが、 複数ブックのシート指定列を抽出して1つの違うブックへ纏めることが出来ないでいます。 どうぞご教授よろしくお願いいたします。

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

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

「VBScript」による回答です(「Windows限定」です)。 このプログラムの特徴は、これから読み込みたい「csv」ファイルの存在するフォルダにプログラムファイルを放り込んで、ダブルクリックするだけです。 同じフォルダに「MergeCsv.xlsx」という結果ファイルを残します。 最後に「Finished!」と表示しますので、「OK」を押して、終了してください。 以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。 「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず半角です。 できたプログラムファイル(「~.vbs」ファイル)を、これから処理したい「csv」ファイルの存在するフォルダに放り込んで、ダブルクリック(「シングルクリック」→「Enter」の方が確実)するだけす。 Option Explicit Dim a, bk, c, cv, ex, f, gf, i, j, r, sh, so Set so = CreateObject("Scripting.FileSystemObject") Set gf = so.GetFolder(".") Set ex = CreateObject("Excel.Application") ex.Application.DisplayAlerts = False ex.Visible = False Set bk = ex.Workbooks.Add() Set sh = bk.Worksheets(1) c = Array(6, 11, 12, 13, 16) r = 0 For Each f In gf.Files If LCase(so.GetExtensionName(f.Name)) = "csv" Then Set cv = so.OpenTextFile(gf & "\" & f.Name, 1) Do Until cv.AtEndOfStream a = Split(cv.ReadLine, ",") r = r + 1 For j = 0 to UBound(c) sh.Cells(r, j + 1).Value = a(c(j) - 1) Next Loop cv.Close Set cv = Nothing End If Next bk.SaveAs(gf & "\MergeCsv.xlsx") bk.Close ex.Quit Set sh = Nothing Set bk = Nothing Set ex = Nothing Set gf = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 Option Explicit 「厳密に」というような意味ですが、気にしないでください。 Set so = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしていますが、今回は特に、「csv」というテキストファイルを扱うのにも必要です。 Set gf = so.GetFolder(".") プログラムファイル(「~.vbs」ファイル)の存在するフォルダ、したがって、これから処理したい「csv」ファイルの存在するフォルダを取得しています。 Set ex = CreateObject("Excel.Application") エクセルを扱えるようにしています。 ex.Application.DisplayAlerts = False ex.Visible = False 「上書きしますか」などと聞いてこないように、また、エクセルを表示しません。 Set bk = ex.Workbooks.Add() Set sh = bk.Worksheets(1) ワークブックを新規作成し、一番左端のシートを「sh」にセット。 c = Array(6, 11, 12, 13, 16) 読み込む列を配列変数に入れています。 「c(0) = 6」、「c(1) = 11」、「c(2) = 12」、「c(3) = 13」、「c(4) = 16」としているのと同じです。 r = 0 行カウント用変数の初期化。 For Each f In gf.Files プログラムファイルの存在するフォルダ内のすべてのファイルを1つずつ処理。 If LCase(so.GetExtensionName(f.Name)) = "csv" Then 拡張子が「csv」なら、 Set cv = so.OpenTextFile(gf & "\" & f.Name, 1) そのファイルを開いています。 Do Until cv.AtEndOfStream そのファイルの終端まで処理。 a = Split(cv.ReadLine, ",") 1行ずつ読み込みながら、区切り記号を使って、配列に格納しています。 たとえば、読み込んだ1行が「1,2,3」の場合、「a(0) = 1」、「a(1) = 2」、「a(2) = 3」としています。 r = r + 1 1行カウント。 For j = 0 to UBound(c) 「UBound()」は、配列変数の添え字(「()」内の数字)の最大値を返します。 今、「c(4) = 16」の「4」がそれにあたります。 したがって、「For j = 0 to 4」と記述しているのと同じです。 sh.Cells(r, j + 1).Value = a(c(j) - 1) 実際にセルに書き出しています。 書き出す列は「c()」に入っていて、実際の読み込んだ値は「a()」に入っています。 Next Loop を、繰り返しています。 cv.Close Set cv = Nothing End If テキストファイルを閉じています。 Next を、すべてのファイルに対して行っています。 bk.SaveAs(gf & "\MergeCsv.xlsx") bk.Close 同じフォルダ内に「MergeCsv.xlsx」という名前で保存して、閉じています。 ex.Quit エクセルそのものを終了しています。 Set sh = Nothing Set bk = Nothing Set ex = Nothing Set gf = Nothing Set so = Nothing MsgBox("Finished!") あとは、終了処理ののち、「Finished!」と表示しています。

その他の回答 (3)

回答No.3

あ、失礼。書き損じです。 その2の手順2~3は見事に重複です。 手順2の「貼り付け」は手順3に回りますね。 私が提示したサンプルは同時にやっちゃってますが(笑)。 ところで、1番さんもおっしゃる通り、 「現状はどのように書いているのか」を 見られたくない部分はフェイクを入れつつでも提示した方が良いです。 それがあると、より具体的なアドバイスをもらえるかもしれません。 前後の流れから書き方が変わることもありますからね。

回答No.2

ひとまず・・・ 考えやすくて書きやすい手段その1 ・(お作りのコードで)CSV全部まとめる ・要らない行を削除する ※ (※)   列(行)削除は後ろからが鉄則です。   Columns("N:O").Delete   Columns("G:J").Delete   という具合。    考えやすくて書きやすい手段その2 ・CSV開く ・必要列コピー貼り付けする ※ ・新規ブックの末尾に貼る (※)   Sheets("Sheet1").Range("F:F,K:M,P:P").Copy Sheets("Sheet2").Range("A1")   な感じでできますよ。 この辺りなら考えやすくて早くないですかね? 注)効率が良い、見た目かっこいいなどは別の話です。

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

この質問課題を解決するために、どんな勉強をしたのか。 回答をコピペするために、丸投げしたいのか? ーーー 3つの課題があると思う。 <ブック> (1)多分同一フォルダ内の指定名の1ブックを都度開きリスト分だけ繰り返す。 <シート> (2)1つのブックを開いたら、その中の2つ以上のシートを1つのシートにまとめる。 複数のシートはどうゆう風に選択するのか。あるものすべてか? <1シートにまとめる> (3)指定列(全列のうち、どういう風に、まとめる対象列を決めるのか)を まとめる。 (あ)持ってくる列データの最終列 (い)まとめる列の現在の最終行 とも、Sub test01() lr = Range("B100000").End(xlUp).Row MsgBox lr End Sub を参考に、応用を考えれば簡単。Rangeの前にブックとシート名を限定しておく。 ーー これらの(1)、(2)、(3)のオブジェクトを、どう選択するのか、全部を対象にするのか、除外するものがあるのか、質問に書いてないから、現状では、回答例は出せない。 質問するときのポイントは、どういう選択をすればよいのか書かないと。 名前とか属性とかあって、名前による方が処理が簡単。 VBAを少しやったら、普通はその点で苦労するのはすぐわかるだろ。それを書いてないのはVBAの経験が少ないのに、それ以上のことをやろうとしているだろう。またやってみて自分の行き詰まった点を認識してない証拠。 ーー 後出回答のために、上記の点の説明を追加したらどう。

関連するQ&A

  • 複数のエクセルブックから特定シートの特定セル抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル値を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 よく似ている質問、回答を読んだのですが、私のレベルではとても応用できず質問させていただきます。 【前提】 ・実行する端末のOSはWindows XP(SP3)、Excelは2003 ・対象フォルダはネットワーク接続フォルダ「\データ解析\データ」  この中に、複数のExcelブックがあります。 ・抽出したい対象は、各ブック内のシート(シート名はファイル名と同じ)の「BO6からBW16までの□の範囲」で統一されています。 【抽出一覧作成イメージ】 ・「集計.xls」ブックの「Sheet1」の2行目から抽出した結果を一覧表示する。 ・表示はA列に抽出元ブック名(=ファイル名)、B列に抽出元BO6セルの値。以降,C列・D列と 順に値を入れていきたい。 ・BO6~BW16までのセル値を「集計.xls」ブックの「Sheet1」に貼り付ける際には「値で貼り付ける」が望ましい。 というようなイメージです。 とても勝手なお願いではありますが、宜しくお願いいたします。

  • 複数のExcelブックから特定シートのセル範囲抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル範囲を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 このサイトで殆どよく似た回答を読んだのですがうまくいきません。VBA初心者です。 よろしくお願いします。 【前提】 ・実行する端末のOSはWindows 10 ExcelはOffice365 ProPlus ・対象フォルダはネットワーク接続フォルダ  この中に、複数のExcelブック(xlsx、xlsm)があります。 ・抽出したい対象は、各ブック内の「台帳」シートの「A3:Cの最終行」で  複数のブックの中には「台帳」シートが含まれていないブックも混在しています。 【抽出一覧作成イメージ】 ・「集約.xlsm」ブックの「集計」シートの2行目から抽出した結果を一覧表示する。 ・「集約.xlsm」ブックにマクロは登録する ・表示はA列に抽出元ブック名(=ファイル名)、B列からD列に抽出元「A3:Cの最終行」セルの値。 ・「A3:Cの最終行」セルの値を「集約.xlsm」ブックの「集計」に貼り付ける際には「値で貼り付ける」が望ましい。

  • 複数のExcelブックから特定シートの特定セル抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル値を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 よく似ている質問、回答を読んだのですが、私のレベルではとても応用できず質問させていただきます。 全く同じものがあれば、そのアドレスを回答いただくだけでも助かります。 【前提】 ・実行する端末のOSはWindows XP(SP3)、Excelは2003 ・対象フォルダはネットワーク接続フォルダ「\\share\target」  この中に、複数のExcelブックがあります。 ・抽出したい対象は、各ブック内の「概要」シートの「C3」セルで統一されています。 【抽出一覧作成イメージ】 ・「集約.xls」ブックの「Sheet1」の2行目から抽出した結果を一覧表示する。 ・表示はA列に抽出元ブック名(=ファイル名)、B列に抽出元C3セルの値。 ・C3セル値を「集約.xls」ブックの「Sheet1」に貼り付ける際には「値で貼り付ける」が望ましい。 というようなイメージです。 とても勝手なお願いではありますが、宜しくお願いいたします。

  • Excel VBAで複数のExcelブックからある文字列を検索→抽出したものをまとめたい

    Excel VBAで以下の操作は可能でしょうか。 私はAccessVBAを少しさわる程度でExcel VBAはまったくわかりませんし、 まだ現物データを見ていないので説明不足ですが、 ご存知の方がいらっしゃいましたらどうぞご回答をお願いします。 コード等もあわせて教えて下さるととても助かります。 複数のExcelブックからある文字列を検索→抽出したものをまとめたい。 ・検索抽出したい文字列の入っているセル位置は固定。 ・抽出したデータを新たなファイルにするか、どうするかはまだ未定。 ・Excelブックは100個ほどある。

  • エクセルVBAで複数CSVを抽出、ブックへの出力

    エクセルVBAで複数のCSVファイルからファイル名と 任意のセル8箇所を自作した計算シートに抽出。 別ブックにCSVファイル名 計算結果4種類を出力する。 というvbaを作りたいのですがどうすればよいでしょうか? CSVファイルが1700ほどあり、大変困っています。 申し訳ありませんがご教授願います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー 詳細 CSV読み込みセル8箇所:B2、D2、F2~P2 自作計算シートへの貼り付け箇所:G3~G10 計算結果セル抽出箇所:C8~F4 出力の理想系は CSVファイル名、計算結果1、2、3、 4の順で file01 ○○ ○○ ○○ ○○ file02 ○○ ○○ ○○ ○○ ・・・ ・・ のようになれば大変嬉しいです。 お力をお貸しください よろしくお願いいたします。

  • ブックを開かずに、フォルダ内にある複数ブックの、特定セルの値を抽出した

    ブックを開かずに、フォルダ内にある複数ブックの、特定セルの値を抽出したいのですが、やり方をご存じの方がいらっしゃったら教えてください。 フォルダ内には150個ほどエクセルファイルがあり、中身のシート名・フォーマットは同じなのですが、すべてファイル名が違います。 ファイルを開くことなく、これらのファイルの特定のシートの特定のセルにある値を、全て1枚の表にまとめることは可能でしょうか? フォルダ名 →"AGENDA_RIREKI" 参照したいファイル名 →ファイルによって異なる "#1111 AAA.xls"など 参照したいシート名→ "AGENDA" 参照したいセル→ "A7" と "E20~E70(E列のみ) データをまとめたいファイル名→ "AGENDA_matome.xls" データをまとめる時の形↓ (A列)          (B列)            (C列)        (D列) ファイル1のA7の値 ファイル1のE20の値  ファイル2のA7の値  ファイル2のE20の値                     E21の値                    E21の値                     ・                     ・                     ・     VBAは初心者です。。できればコードをそのまま拝借したいです。 お知恵を貸してください。よろしくお願いします。

  • 条件一致するセルを異なるブックへコピーするには…

    EXCEL VBAで条件に一致するセルを別のブックの複数のシートへコピーして 貼りたいのですが、どのようにしたらよいか教えて下さい。 (1)のブック、A列と、(2)のブックA列には順番はバラバラですが、同じデータ(数字とアルファベットの番号が入っています)これを元に、(1)のブックのK列のデータを(2)のブックシートa~dのY列に貼りたいのです。(シートa~dにはそれぞれ異なるデータが入っていますが、列数は一緒です。A列に入っているデータも(1)のブックと一緒です。) お詳しい方どうかどうか宜しくお願い致します。

  • 複数のBookから決まったセルの値を別のBookに

    お世話になります。 EXCELで複数のBOOKから決められたセルにある値を抽出してひとつのBOOKに纏めたいのです。 BOOK1~50、 BOOKには31枚のSheetがあります。 その中のSeet31にSeet1~30のデーターを纏めてあります。 Seet31の A1~3 B1~2 C1~3 のデーターを抽出して 新しく作ったBook【集計】のSeet1にBook1~50から抽出した データーを縦に並べたいのです。 【 例 】   A1 A2 A3 B1 B2 C1 C2 C3 1  5  2  4  3  6  7  1  3 2  2  3  4  6  9  7  5  2 3  7  8  5  6  2  3  1  8 と、いった感じです。 なお、Book名は『漢字+数字』です。 宜しくお願いします。

  • エクセル:複数ブックをマクロを使い同一条件で集約・抽出したい

    教えて下さい 複数のエクセルブックがあります(全て1フォルダーに集約してある) それぞれA列に日付、B列に金額が入っている 複数あるブックを指定する日付で次から次へと検索しその金額とファイル名を新しいブックに縦に全てコピー(抽出)したい ちなみに、必ず条件にあうデータがそれぞれのブックにあるとは限りません 無い場合もあります 無い場合は特に抽出する必要はありません ========================================================= 例:2007/12のデータを抽出したい ★抽出結果イメージ    A      B    C 1 2007/12   200   ああああ.xls 2 2007/12   300   いいいい.xls 3 2007/12   100   うううう.xls 4   ・      ・      ・ 5   ・      ・      ・ 6   ・      ・      ・ 7   ・      ・      ・ ========================================================= このような場合、マクロでできますか?マクロは初心者です 教えてください よろしくお願いします 複数あるブックとは数的に60とかあります ちなみに現状はファイルを一つ一つ開き、指定日付を検索し見つけだし その行をコピーペーストしています たくさんブックがあるので、これをしていると目がチカチカしてきてしまいます この作業がマクロでできると、すごく感激なのですが・・・ どなたか、お知恵・お力をおかしくださいませ

  • Excelでキーワード検索(異なるブックで)

    現在、シートのA2にキーワード欄を設けて、A5:Z5以下にあるデータ(文字列)から 該当した文字のみサイズ変更と該当セルの色づけをVBAで行っています。 キーワードが1つずつしか検索出来ないことと、A5以下のデータ(文字列)を 別のブックから都度貼り付けることに不便を感じております。 そこでご質問ですが キーワードとデータを異なるブックで用意し、キーワード側のVBAでデータファイルを 検索し、文字サイズとセルの色づけを実施するのはVBAで可能でしょうか。 (キーワードは複数有り、増減します。) 尚、VBAは入門レベルです。 宜しくお願い致します。

専門家に質問してみよう