• 締切済み

他ブックからデータ取得

困っています、よろしくお願いします 現在画像のような月データ(例としてのため簡略化しています。実際はもっとデータ数は多いです)を大量に、いくつかのブックで保存しています。 これらをファイルごと、具体的にはAフォルダに12か月分あると考えてください やりたい事としては、Aファイルにあるこの画像のデータのA列の日付を参照し、日付が変更した行から5行を取り出してその他の同日のデータは消去してを繰返して、Bファイルに新規保存していきたいです この場合、2012/2/2のM列の値段が100から500までの5行を抽出し、他の2012/2/2の行を消去し詰める その後2012/2/12の範囲のM列の値段が1500から1900までの5行を抽出し、他の2012/2/12の行を消去し詰める といった事を最終行まで繰返したいのです この時、対象となる日付の5行以下ならそれら全てを参照、例えば5行を抽出し、他の2012/2/27のデータが3行しかないなら、それらをはじかず全てデータとしてとりこみたいです また、できれば抽出する行数(この場合5行)を自由に変更できるようにもしたいです 日本語がおかしくてよく伝わらないとおもいますが、VBAとかプログラムとかこういうのが全くわからなくて困っています ほんとうに、よろしくお願いいたします

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

VBAで作成しています。 以下の手順(1)~(8)に沿って作業願います。 (1)新規ブックを作成 (2)Alt+F11でVBEを開く (3)挿入→標準モジュールで標準モジュールを作成 (4)標準モジュールに最下のVBAコードを貼付 (5)コード内の「設定」項目を変更(以下の部分です)   '/////////////設定/////////////   'チェック対象列   tar_col = "A"   '重複削除基準値   del_row = "5"   '別名保存添付文字列   new_name = "New_"   '////////////////////////////// (6)右上の×または、Alt+F11でVBEを閉じる (7)Alt+F8 または 表示→マクロ から「ファイル処理」を選び実行 (8)ファイルを開くダイアログが表示されるので対象のファイルを指定(複数可能) (1)で作成し、コードを追加したブックを名前を付けて保存しておけば、 次回から上記手順の(7)(8)だけで利用できるようになります。 ■VBAコード Sub ファイル処理() '型宣言 Dim fpath As Variant, dpath As String, tbook As Workbook Dim i As Long, j As Long, cnt As Long Dim bkRng As String, myRng As Range Dim tar_col As String, del_row As Long, new_name As String Dim fn As String, exfn As String '/////////////設定///////////// 'チェック対象列 tar_col = "A" '重複削除基準値 del_row = "5" '別名保存添付文字列 new_name = "New_" '////////////////////////////// 'ファイル指定 fpath = Application.GetOpenFilename("全てのファイル (*.*), *.*", MultiSelect:=True) If IsArray(fpath) = False Then Exit Sub 'ディレクトリパス取得 dpath = Replace(fpath(1), Dir(fpath(1)), "") 'ファイル処理 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For i = 1 To UBound(fpath)   '初期化   bkRng = ""   Set myRng = Nothing   'ファイル名・拡張子の取得   fn = Dir(fpath(i))   fn = Left(fn, InStrRev(fn, ".") - 1)   exfn = Right(Dir(fpath(i)), Len(Dir(fpath(i))) - Len(fn))   'ブック開く   Set tbook = Workbooks.Open(fpath(i))   With tbook.ActiveSheet     '行数ループ     For j = 1 To .Range(tar_col & Rows.Count).End(xlUp).Row       '対象セル判定・カウントアップ       If bkRng <> .Range(tar_col & j).Text Then         bkRng = .Range(tar_col & j).Text         cnt = 1       Else         cnt = cnt + 1       End If       'カウント値が指定行数より多ければ対象として設定       If cnt > del_row Then         If myRng Is Nothing Then           Set myRng = .Rows(j)         Else           Set myRng = Union(myRng, .Rows(j))         End If       End If     Next j     '行削除     If Not myRng Is Nothing Then myRng.Delete   End With   '別名保存   If Dir(dpath & new_name & Dir(fpath(i))) = "" Then     tbook.SaveAs Filename:=dpath & new_name & fn & exfn   Else     '添え字追加保存     j = 1     Do Until Dir(dpath & new_name & fn & "(" & j & ")" & exfn) = ""       j = j + 1     Loop     tbook.SaveAs Filename:=dpath & new_name & fn & "(" & j & ")" & exfn   End If   'ブック終了   tbook.Close Next i Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True MsgBox i - 1 & "件終了しました" End Sub

関連するQ&A

  • セル値に変更のあった行を他のブックにリストアップする。

    データベース上書きのため、値が入力され、既存のデータと変更のあった行だけを抽出したいと思います。データベースはサーバに保存され、エクセルデータを全読み込みする形式でデータベースを更新しています。データが20000行に及ぶ為、読み込みに時間がかかります。そこで、差分データだけの読み込みを行いたいと思います。 B列のセルに数値を入力していますので、B列が変更された行だけ差分データとして更新しようとしています。そのセルのA列にはそれぞれ固有のコード番号をふっています。 B列セルに変更があった場合に、同じ行のA列セルの値を他ブックに記録するか、もしくはその行をまったく同じ形式で他ブックに保存出来ませんか?

  • エクセル 異なるブックのデータ比較

    教えてください。 エクセルのファイルA1.xls(原本)とA2.xlsがあるとします。 どちらも行ごと(レコード)にデータを入力したデータベースのファイルです。 A1は原本データで、A2がデータ(レコード)を追加した編集後のファイルです。 この時、A1とA2の列(レコード)を比較し、A2にあってA1に無いものを抽出するフリーソフトなどはご存知ではないでしょうか。 あくまで、A1とA2の差分の抽出ではなく(A1にあってA2にないものはは除く)、A2にあってA1にないものだけを抽出したいのです。

  • 日付から特定の行のセル内データを取得したい。

    列に日付、行に時間を入力データの内容は商品の販売個数です。 要するに日付毎の時間別販売数を調べたいのですが、 列の日付の下に各品名を数項目並べております。 この様なデータを個人別のシートで入力しています。 行いたい事は、そのデータを別シートで日付毎に参照したいのです。 あるセルに18と入力すれば、18日分の売り上げデータを一枚のシートに表示させたいのです。 これが一商品だけの集計なら「HLOOKUP」関数で普通に参照できるのですが、列に日付と商品、行に時間を入れているためどの様に参照すればよいのか判りません。 =HLOOKUP(A1,'名前'!A3:AF20,6,0) コレではその日の一番左の列の商品データしか参照できませんでした。 日付を入力するだけで複数の商品を時間帯毎に参照出来るような上手いやり方はありませんでしょうか? 宜しくお願い致します。

  • エクセルで縦列を横行にするには?

    エクセル2007を使っています。 縦:A1列に日付があり、B1列にデータがあります。 これをC1行にA1列の日付、C2行にB1列のデータというように 縦のものを横に変更したいのですが、それぞれを参照するようにする他に、 どのようにしたらいいのでしょうか?

  • EXCEL:ゼロ以外のデータを詰めて抽出する方法

    初めて投稿します。よろしくお願いいたします。 EXCEL2000を使用しています。 オートフィルタを使わずに 関数でデータを抽出する方法で悩んでいます。 下記<データ>が存在しています。 2行目がゼロ以外のものを、 別シート<抽出>に上から詰めて抽出したいのです。 <データ>   A列 B列 C列 D列 E列 1行 1  2  3  4  5  ←日付 2行 5  3  0  2  0  ←数字 <抽出>別シート   A列 B列  1行 1  5 2行 2  3 3行 4  2   ↑  ↑   日付 ゼロ以外 関数については中級レベルだと思います。 いろいろ試したのですが、関数を組み合わせてもなかなかうまくいきません。 どなたかご教授いただけないものでしょうか? よろしくお願いいたします。

  • Excel VBAを使って他ブックのデータ抽出とコピー

    VBA初心者です、よろしくお願い致します。 現在、Excel97を使用して、実績をまとめるファイルを作成しています。 このファイルのシートに、他ブック(ネットワーク上固定フォルダ固定ファイル名)のデータを抽出コピーを行いたいと思っています。 他ブックは、品名(A3)、日付(C3~AG3)(1日~31日)という列からなり、品名数の増減があります。 様々な情報を参照させていただき下記のようなコードを作成しました。 Set wb1 = Application.ActiveWorkbook 'ブックを開く Application.ScreenUpdating = False Set wb2 = Application.Workbooks.Open(dataDirJisseki & dataNameJisseki, ReadOnly:=True) 'コピーする With wb2 .Worksheets("SMT生産実績").Range("A3:A65536").Copy _ Destination:=wb1.Worksheets("work_jisseki").Range("A1") .Worksheets("SMT生産実績").Range(colTmp & "3:" & colTmp & "65535").Copy _ Destination:=wb1.Worksheets("work_jisseki").Range("B1") End With 'ブックを閉じる Set wb1 = Nothing wb2.Close Savechanges:=False Set wb2 = Nothing Application.ScreenUpdating = True 上記プログラムでも希望した動作にはなるのですが、下記について改善したくご相談させていただきました。 (1)抽出する列を他ブックから検索したい  現状では、抽出する列を自ブックのシートの"日付"セルに入力させ、その値に該当する他ブックの列名をSelect Caseを使って判断しています。 Select Case Day(Range("日付")) Case "1" colTmp = "C"     : Case "31" colTmp = "AG" End Select  これでは他ブックの列構成が変わってしまうと異なるデータ列を取ることになるため、日付を使って他ブックから該当列を検索するようにしたいです。 (2)他ブックのデータ数(行列数)を使ってコピーをしたい  現状では行数最大値の65536でコピーしていますが、他ブックのデータ数でコピーしたい。 以上ですが、是非お力添えをいただければと思います。 説明等不足がありましたら、そちらも指摘ください。よろしくお願いします。

  • エクセルの重複データを抽出し、最新のデータを残した

    エクセルの重複データを抽出し、最新のデータを残したいです。 A列 B列 1 aaa@aaaa.co.jp 2014/1/1 2 bbb@aaaa.co.jp 2013/1/2 3 aaa@aaaa.co.jp 2014/1/10 4 aaa@aaaa.co.jp 2014/10/10 A列にアドレス、B列に日付が入っているデータがあります。 (他にC列などにも顧客情報が入っています。) アドレスの重複データを抽出し、最新の日付の行が残るようにしたいです。 この場合ですと2と4が残るようにしたいです。 膨大なデータの為、困っています。 良い方法をご存知の方、よろしくお願い致します。

  • 複数CSVファイルをExcel形式1つにまとめたい

    VBA初心者です。 似たような質問・回答がありますが、どうも私の意図するところと異なるので、 新たに質問させていただきます。 どうぞお願いします。 仕事場で、基本1日1ファイル取得している複数のCSVファイルを、 1週間に一度Excelファイルに一週間分のデータを追加し、 最終的には1か月毎に1つのExceファイル(1シート)に集計してます。 全ファイルとも内容は同じで、1シートで作成されており、 タイトル行は1行目、2行目以降データ(行:データ数はファイル毎に異なる)、 列数はA-IV列といった構成になります。 新しい1つのファイルにまとめる際には、 B列とG列のみ抽出し、一行目にタイトル行、2行目からデータ、 最終行に次のファイルのデータと、いうように複数のファイルのデータをつなげて 1つのファイルにしたいのです。 ちなみに出来上がったExcelファイルとしては、 A列に元CSVファイルのB列データ、C列に元CSVファイルのG列データ、 B列に各データがどのCSVファイルの物か分かるように、 各ファイル名の日付にあたる後ろ部分を表示させたいのです。 ファイル名から日付を拾えない場合は、 ファイルをまとめる前に、列を挿入し、 C列にデータ日付の項目を作り、そこに日付を入力し、 まとめる際に、B・C列+G列を抽出、といった形で、まとめられたらと思ってます。 *各Exceファイルのタイトルの後部分がデータの日付を表す (タイトル例:0803abcde2013_08_03.xls) B列2行目以降に、それぞれ抽出したデータのファイル名から、 日付にあたる部分を書き出し(8月3日と言ったように)表示させたい。 場合によっては、前部分を抽出するパターンもあるので、そちらもお願いします。 *今後、他の何種類かの複数CSVファイルでもファイル毎に (こちらも全ファイルとも内容は同じ)同様に1カ月毎にまとめたいので、 違う条件でも抽出できるように、応用できたらと、考えております。 (抽出する列がB列とI列のみ、A~C列+F列など) VBAで作業したいと考えてます。色々とお手数ですが、よろしくお願いします。 また、他にお勧めのサイトや、参考になる質問がありましたら、 合わせて、教えていただけると幸いです。

  • EXCEL20001分ごとのデータを抽出したい

    お世話になっておりますm(__)m(このごろは頻繁に(^^ゞ) タイトルどおり、1分ごとのデータを抽出したいのです。 データは次のようになっています。 A列1行目から縦に日付です。 2002/1/1 2002/1/1 2002/1/1 2002/1/1 2002/1/1 2002/1/1 上記のように同じ日付がずーっとつづいています B列1行目から縦に時間です。 0:30:04 0:30:06 0:30:08 0:30:10 0:30:12 0:30:14 0:30:16 ・ ・ ・ 上記のように2秒ごとにデータがあるのです。 ただし、C列にもその日付と時間に対応したデータがあります。 2秒ごとにデータがあるのですが、 それを1分ごとのデータを抽出したいのです。 どうにかこうにかしてできないものでしょうか? 関数とかでできるでしょうか? VBAとかはぜんぜんやったことがないので、 もしそれをつかわなければ出来ない場合は、 詳しく説明してくださればうれしいです(涙

  • -excel-違うブックの文字列を含む行の抽出

    商品の価格を一括で変更できる方法を探しているのですが見つからず困っています。 全ての商品データが載ってるブックAがあります。価格を変更する商品のIDと値下げ後の値段が載っているブックBがあります。ブックAの商品価格をブックBの値下げ後価格に変更したいのですが、関数か、マクロなど何か良い方法はないでしょうか? 最悪価格は手動で変更するとしてせめてブックBのIDと合致するセルを持つブックAの行を抽出する方法はないでしょうか?抽出した行は別ブックにまとめてくれるとなお助かります。 ちなみにブックAには7000行、ブックBには1000行のデータがあります。 ブックA(商品データ) A列・・・・・・    F列・・・・・・・・ ID         価格 1234        2500 2345        3200 3456        1200 4567        3000 5678        1800 ブックB(価格変更データ) A列        B列 ID         価格 2345        2600 5678        1500 ↓ ブックA(商品データ)もしくは新規ブックC A列・・・・・・    F列・・・・・・・・ ID          価格 1234        2500 2345        2600 3456        1200 4567        3000 5678        1500 といった感じです。どなたかお知恵をお貸しください。よろしくお願いいたします。

専門家に質問してみよう