• 締切済み

複数のエクセルの特定の列からデータを抽出

特定のフォルダに格納されているエクセルファイル(500ぐらい)のC列に記載されている文字列を抜き出し、別のファイルに一覧化したいです。 要望として、 対象ファイルのC1は項目名が入っているので、C2から記載ある行まで抜き出してほしい。(C3で終わる場合とC5で終わる場合、そもそも記載ない場合もあり) 抜き出したものは、別シートにA列にファイル名、B列にその抜き出した項目を記載。 宜しくお願い致します。

みんなの回答

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

追伸。 「シート名」には「【】」が前後に付いているものとして処理しています。 すなわち、2文字目から9文字を抜き出しています。

abcdefghijklmu
質問者

補足

その認識であっております!説明がいたらないところ、多数あったかと思いますが、何度もご対応頂き有難う御座いました。非常に、助かりました。

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

No.1の「Prome_Lin」です。 「C3」から読み込みを開始し、「エラーで止まらない」ようにし、なおかつ、シート名を指定して読み込むようにプログラムを変えました。 注意事項は、最初と同じです。 Option Explicit On Error Resume Next Dim a, b, c, d, i, r, s, t, u, v, w, x, y, z Set t = CreateObject("Scripting.FileSystemObject") Set u = t.GetFolder(".") Set v = CreateObject("Excel.Application") v.Application.DisplayAlerts = False v.Visible = False Set w = v.Workbooks.Add() Set x = w.Worksheets(1) a = 0 For Each b In u.Files c = LCase(t.GetExtensionName(b.Name)) If c = "xls" or c = "xlsx" Then s = Mid(b.Name, 2, 9) Set y = v.Workbooks.Open(u & "\" & b.Name) Set z = y.Worksheets(s) r = z.Range("C1").End(-4121).Row For i = 3 to r a = a + 1 x.Cells(a, 1).Value = b.Name x.Cells(a, 2).Value = z.Cells(i, 3).Value Next y.Close Set z = Nothing Set y = Nothing End If Next w.SaveAs(u & "\Result.xlsx") w.Close v.Quit Set z = Nothing Set y = Nothing Set x = Nothing Set w = Nothing Set v = Nothing Set u = Nothing Set t = Nothing On Error GoTo 0 MsgBox("Finished!")

abcdefghijklmu
質問者

補足

完璧です!!!ほんとに、感謝です。有難う御座います!

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

No.1の「Prome_Lin」です。 3番目からなら、「For i = 2 to r」の「2」を「3」にするだけです。 次に、「エラーが出てもそのファイルは無視して」ということですが、「VBScript」では、エラー処理が貧弱なので、1行目の「Option Explicit」の下に「On Error Resume Next」と入れてください。何かエラーが出ても、エラーを出力せず、次にいきますが、「次に」というのは、ファイルを飛ばす、ということではなく、単にエラーの出た行の次の行を実行する、というだけですが、これで、エラーは出ません。また、気になるようでしたら、一番下の「MsgBox("Finished!")」の前に「On Error GoTo 0」を置けば、「On Error Resume Next」から復帰しますが、すでにプログラムが終わっているので、意味はありません。 最後に、「【Sheet名】XXXXXXX.xls もしくは、【Sheet名】XXXXXXX.xlsx」についてですが、具体的に書いて頂けませんか、「Sheet名」と「XXXXXXX.xls」の間の区切りが、何か明確なものがないと、プログラムで判断できません。それとも必ず「【】」が付いている?とか。 とにかく、「XXXXXXX」は必ず7文字です、とか、「Sheet名」は必ず5文字です、とか、「Sheet名」と「XXXXXXX」の間には、必ず、「_」が存在し、「_」は他には存在しませんとか、何かルールが分からないと、どこまでが「Sheet名」か判断が出来ません。

abcdefghijklmu
質問者

補足

ファイル名として、【数字3ケタとアルファベット1文字-数字4ケタ】文字(文字数バラバラ).xls or .xlsx ■例1) ファイル名:【123K-5678】問題分析.xls Sheet名:123K-5678 ■例2) ファイル名:【567A-1234】(未定)今後の予定.xlsx Sheet名:567A-1234 ご回答になっていますでしょうか? 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

ファイルが500もあれば、手作業でやるのは、無理でしょう。 だからVBAでやることになろう。 質問者が、VBA・VBScriptの経験があるのかないのか、明記すべきだ。 回答をコピーして、貼り付けしたいのかもしれないが、 (経験が無ければ、回答を自分の場合(ケース)に合わせて、修正もできないだろうから、質問して回答をもらっても無駄。本件は回答をコピーして、貼り付けしても、うまく行きそうなタイプだが) エクセルバージョンは2007以後のものか、以前のものか、書くべきだ。 各ブックでシートは1つとしてよいのか、それで少し説明が変わる。 「特定のフォルダ」には対象外のファイル(エクセルファイル、その他)が含まれていないのだろうね。これを必ず書くこと。 (1)目的のフォルダをFor EachかDir関数で1つづつ開き、(必要なら)エクセル・ファイルかどうか判別し、でなければ何もしないで、次の繰り返しに進む。 (2)エクセルファイル(x)なら、ブックを開き、Sheet1に当たるシートを開き、 C列の最下行からEnd(xlUp).Rowで、その列のデータ最終行(番号)を知る。 C2(最初だけはC1から?またはC2からにして(Y)のC1の項目名は別にセットするのも統一的で良いかも)から、データ最終行までを、集約ファイル(Y)のB列にコピーする。 その時、集約ファイル(Y)の(処理中の現在の)最終行はEnd(xlUp).Rowで知り、その次行以下に集約されるファイル(X)の目的のデータを(Yに)貼りつける。 集約ファイル(Y)のA列(最終行の次行)にはファイル名を代入する。 これを(X)の最終のファイルまで繰り返す。 終わればXとYのファイルをCloseする。 ーー このタイプの質問は、たびたびあり、市販の解説書にもほぼ載っているし、WEBにも記事が多数あるのに、質問者は自分で探そうとしたのか。 Googleで「(エクセル)VBA フォルダ名 取得」や「エクセルVBA フォルダ 集約 」で検索してみたら、近いものが多数出る。 必要な要素技術は (1)VBのDir関数か、VBScriptのForEach (2)あるシートの1つの列の入力データ最終行(番号)を知るコード の2つしかない問題だろう。あとはVBAの初歩的なコード。

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

以下のプログラムは、「VBScript(Microsoft Visual Basic Scripting Edition)」によって組んでいますので、「Windows」限定です。 「Windows」で、なおかつ「Excel」が入っているパソコンなら動くはずです。 一応、3個ほどファイルを適当に作って、間違いなく動くことを確認しています。 エクセルのファイルが500個ほどある フォルダ(関係ないエクセルファイルはその中には存在してはいけません)に、このプログラムを放り込んで、ダブルクリック(または、より確実に、シングルクリックして「Enter」)すると、処理を開始し、最後に「Finished!」と表示されます。 「Finished!」が表示されると、「Result.xlsx」というファイルが出来ているハズですので、そのファイルを開いてみてください。 なお、このプログラムをメモ帳やテキストエディタに貼り付け、適当な名前を付けるのですが、その際、拡張子を「.vbs」としてください。これは必ず「.vbs」でなければなりません。 あと、試していませんが、もしかしたら、フォルダ名にスペースがあると動かないかも知れません。出来れば、そのファイルの入っている直接のフォルダだけでなく、その上のすべての関係するフォルダ名のスペースを削除しておいてください。 Option Explicit Dim a, b, c, i, r, t, u, v, w, x, y, z Set t = CreateObject("Scripting.FileSystemObject") Set u = t.GetFolder(".") Set v = CreateObject("Excel.Application") v.Application.DisplayAlerts = False v.Visible = False Set w = v.Workbooks.Add() Set x = w.Worksheets(1) a = 0 For Each b In u.Files c = LCase(t.GetExtensionName(b.Name)) If c = "xls" or c = "xlsx" Then Set y = v.Workbooks.Open(u & "\" & b.Name) Set z = y.Worksheets(1) r = z.Range("C1").End(-4121).Row For i = 2 to r a = a + 1 x.Cells(a, 1).Value = b.Name x.Cells(a, 2).Value = z.Cells(i, 3).Value Next y.Close Set z = Nothing Set y = Nothing End If Next w.SaveAs(u & "\Result.xlsx") w.Close v.Quit Set z = Nothing Set y = Nothing Set x = Nothing Set w = Nothing Set v = Nothing Set u = Nothing Set t = Nothing MsgBox("Finished!")

abcdefghijklmu
質問者

補足

早速有難う御座います!!素晴らしすぎて、涙が出そうです。 ちょっと補足として、2点お願いさせて下さい。 1.開始セルですが、C2ではなく、C3でした。申し訳ございません。 2.何等かのエラーが起きた場合でも、そのファイルは無視して、最後まで全ファイルを確認する。 あと、補足として、ファイル名とSheet名の関係性は下記のようになっています。 ファイル名:【Sheet名】XXXXXXX.xls もしくは、【Sheet名】XXXXXXX.xlsx 役立つ情報か不明ですが、共有させていただきます。 宜しくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連する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 文字列条件抽出

    特定の文字列を検索条件として別シートに抽出する方法を御教授願います。 使用する関数はLEN,MID,LEFT,ISERR,もしくはワイルドカードなどを使用すればいいのかと考えておるのですがいまいちやりたいような数式を組めず悩んでおります。 やりたいことを言葉で表現するならば以下のような感じとなります。 「sheet1のF列に<107>という文字が含まれていた場合」 ・顧客別シートのD列に顧客ごとに分けて抽出 ・含まれていない場合、抽出しない と、単純なことなのです。が、制約がある為にうまくいきません。 制約は以下となります。 ・検索対象の文字列が以下のように決まった形ではない。 (1)A-BB-107○#----- (2)A-BB-107○#----- (3)ABB107○C #----- (4)ュウリABB-107○#----- (5)ュウリABB107○#----- (6)BB-107○C-D9#-----  など、その他にも数種類存在。(○部分には違う数字が入ります) ・上記でも分かるように<107>が始まる文字列の位置が決まっていない。 という具合です。 操作しているブック構成は下記のとおりです。 ・sheet1・・・参照用シート 4行目 /D列・・・顧客No / E列・・・顧客名 / C列・・・製品仕様 (A列,B列,G~AD列まで使用中) 5行目 / 1 / A / A-BB-107○#----- 6行目 / 2 / B / ュウリABB-107○#----- 7行目 / 1 / A / BB-107○C-D9#----- 8行目 / 3 / C / A-BB-107○#----- 9行目 / 3 / C / BB-107○C-D9#-----  10行目 / 4 / D / A-BB-107○#----- (会社のサーバーで管理している情報がそのままエクセルに打ち出されたシート。 情報量として約1000行ほど) ・sheet2,3,4,5(開始行,項目列は同じ位置)・・・特定の顧客別ごとに分け、特定の製品仕様だけを抽出したシート(参照用から引用)。 4行目/ B列・・・顧客No / C列・・・顧客名 / D列・・・製品仕様 5行目 / / A-BB-107○#----- 6行目 / / ュウリABB-107○#----- 7行目 1 / A / BB-1234C-D9#----- 8行目 / / A-BB-1115#----- 9行目 / / BB-107○C-D9#-----  10行目 / / A-BB-3498○#----- 特定の顧客NoをB列(一つのセルになってます。C列も同様一つのセルになってます)に入力すると、製品仕様すべてを抽出するように作成したシート。このシート内のG列から新たに表を作成し<107>の文字列が含む製品仕様を抽出しようと考えております。 出来れば、このような一度段階を踏んでから特定の仕様を抽出するのではなく各シートに対象となる顧客Noを入力すると特定の仕様が一回で抽出できるようなシートを作成したいのですが、関数初心者の為、うまく組めずこのような形となりました。(現在、参照用シートに作業列を作り対応。作業列ばかりが増えて正直困っているのも確かなのです) 【御教授頂きたいこと】 ・<107>の文字列を条件として別表に抽出する関数の数式 です。 また、出来ればでいいのですが、 ・顧客Noを入力すると特定の仕様が一回で別表に抽出できるような方法が御座いましたら、そちらも合わせてお願いしたいと思っております。 長々と書き綴り、大変申し訳御座いませんが、宜しくお願い致します。

  • エクセル 複数ファイルから特定のデータを抽出

    いつもこちらでお世話になっております。 先日も同じような質問をさせて頂いたのですが、 ファイルの構成が変わってきてしまい、再度質問させて頂きます。 (元データ) A  B     C      D        E No 月1    月2     月2      氏名    1 2010/11  2010/8   2010/7    佐藤 2 2010/10  2010/8   2010/7    山田 3 2011/12  2010/8   2010/7    田中 4 2010/10  2010/8   2010/7    田中 ・ ・ 上記のデータが1年度あたり ファイル1(4シート+一覧シート) ファイル2(4シート+一覧シート) ファイル3(4シート+一覧シート) ファイル4(4シート+一覧シート) ファイル5(4シート+一覧シート) ※上記A列のNoは1シート内での連番。 のように構成され、それが6年度分(計30ファイル)あるという状態です。 別ファイルにて2010/10とセルに入力してやると、各ファイルのB~D列に2010/10 とあるデータだけ抽出して一覧にしてくれるようにしたいと考えております。 関数またはVBAにて処理する方法はありますでしょうか? お知恵を拝借願えれば幸いです。

  • エクセルVBAで特定の列の複数の行を一覧表示し

    エクセルVBAで特定の列の複数の行を一覧表示し マウスなどで選択された項目を特定の変数に代入するにはどのようにVBAを書けばよいか教えてください。 たとえばC列の縦10行分を一覧表示して、マウスで選択した一項目を変数に代入するというようなことです。

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

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

  • 複数のエクセルファイルからのデータの抽出、一覧の作成について

    エクセルでのデータ整理の件で以下の質問があります。 以下のことができるようなマクロは組めませんでしょうか? 同一フォルダ(仮に、「C:\Sample」とします)に日々の業務データが 入力されたエクセルファイルが300個ほどあります。 各ファイル内にはSheetが5枚あり、各ファイルで入力されているデータは すべて同一のフォーマットです(Sheet毎では異なる。 例えば、Sheet1の1行A列には日付データ、Sheet2の2-5行B列には名前データ、といった感じです)。 これら300個のファイルから、これまでのデータを一覧にしたリストを 新規に作りたいと考えています(作成場所はどこでも構いません)。 例えばSheet1の、1列目にはファイル名、2列目には各ファイルSheet1の1行A列の日付データ、 3-6列目には各ファイルSheet2の2-5行B列の名前データ・・・、といった具合です。 (縦に日付が並び、1行内に各ファイルのデータが入力されている、 といった風にしたいと考えています。) 参考になりそうな過去の回答もありましたので、いくつか試してみたものの、 うまくいきませんでした(私はマクロは少しかじった程度です)。 一個ずつコピペでは非常に骨が折れ、難儀しております。 ややこしい質問ではございますが、ご回答お待ちしております。

  • 複数の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ファイル中のデータを1つのファイルへ

    同じシート名、同じフォーマットで記載されている約400個のEXCELファイルから、『Participant List』というシート名のB列~H列、8行目~50行の範囲の記載を1つのEXCELファイルに纏めるVBAスクリプトを作成し実行したいのですが、VBAが全く分からず大変困っております。 マクロを実行した時に、入力ファイルと出力ファイルの保存ホルダーを聞いて指定出来るように出来た良いと思っています。 何方か、お分かりでしたらどうぞお力添えをお願いいたします。 <詳細> ・400個の入力EXCELファイルには、『Participant List』、『特定類型』の2つのシートが入っており、今回の入力用シートは『Participant List』になります。 ・今回抜き出したい記載は、『Participant List』シート中のB列~列、8行目~50行の範囲の記載になります。 ・『Participant List』シート中のB列の6行目と7行目のセルは結合しており、各列のタイトルは以下の通りになっています。  このタイトル名を出力ファイルの1行目へデータの各列のタイトルとして付けて、2行目以降より400個の入力ファイル中のデータを連結したいです。   B列:6,7行=『職員番号(nimsID)』     C列:6,7行=『名前(Name)』       D列:6,7行=『部門(Research Center, Division)』   E列:6,7行=『グループ(Group)』   F列:6,7行=『役職(Title)』   G列:6,7行=『開始年月(Start)』   H列:6,7行=『終了年月(End)』 ・出力ファイル名や出力のシート名は特に考えておりません。 ・入力データは以下ような記載のフォーマットになります。   B列=『職員番号(nimsID)』       例:14769     C列=『名前(Name)』         例:田中 一郎    D列=『部門(Research Center, Division)』 例:総合開発・情報部門   E列=『グループ(Group)』   例:科学リーダー   F列=『役職(Title)』     例:リーダ-   G列=『開始年月(Start)』  例:2023/5/1   H列=『終了年月(End)』   例:2023/5/31 ・入力ファイル名の例=科学登録者_23BB3001.xlsx            科学登録者_23BB3005.xlsx            科学登録者_23BB3405.xlsx ※拙い口足らずな説明となってしまいましたが、どうぞ宜しくお願い致します。

  • Excel 複数の項目合致するデータを抽出したい

    是非、よろしくお願いいたします。 以下の状況です。 sheet1には A、B、C、Dという4列があります。データは1000行くらいです。 sheet2には A、B、C、Eという4列があります。データは2000行くらいです。 この状況で、sheet1のD列の右に新しい列を作り、 「sheet1の(例えば)A1、B1、C1と合致する行のsheet2のE列データ」を、 sheet2のABC列範囲を検索して抽出したいのです。 項目が一つであればvlookup関数でできるものを「複数項目に合致」のため上手くいきません。 この3列のデータを結合して一つにしてみましたが、結合後のデータが16桁以上のため末尾が「0」になってしまい、正確に検索できません。 何か上記を可能にする方法はないでしょうか? よろしくお願いいたします。

  • 複数のエクセルファイルとシートからデータ抽出したい

    すみませんが教えてください! 複数のエクセルファイルがあり、それぞれに複数のシートがあります。 (ファイルによってシート数は異なります) そのすべてのファイル/シートから、C列の最後の行のデータを抽出し、集計ファイルに書き出したいのです。 書き出しのフォーマットは3セル使用して、ファイル名、シート名、データとしたいです。 すみませんが、よろしくお願いいたします。