VBAマクロでワークブックAにワークブックBの集計方法と注意点

このQ&Aのポイント
  • VBAマクロを使用して、ワークブックAにワークブックBのデータを集計する方法について解説します。ワークブックBには複数の番号があり、日付もバラバラです。また、ワークブックAには存在するがワークブックBには存在しない番号や、その逆もあります。集計する際は、日付が近いものから最大3つまで表示するようにしましょう。
  • 例えば、ワークブックAには番号11111、22222、35851があり、ワークブックBにも同じ番号が存在します。しかし、ワークブックBの日付はバラバラで、ワークブックAには存在するがワークブックBには存在しない番号やその逆もあります。集計する際には、日付が近いものから最大3つまでを表示するようにすることがポイントです。
  • ワークブックAとワークブックBのデータを集計する方法として、VBAマクロを使用することが一般的です。まず、ワークブックAから集計したい番号を取得し、それぞれの番号に対応するデータがワークブックBに存在するか確認します。存在する場合は、そのデータをコピーしてワークブックAに貼り付けます。日付が近いものから最大3つまで表示するためには、データを日付順にソートする必要があります。
回答を見る
  • ベストアンサー

■VBAマクロでワークブックAにワークブックBの集計をしたい。

■VBAマクロでワークブックAにワークブックBの集計をしたい。 ただし、ワークブックBは同じ番号で何個もあり、日付も並んでいません。 またワークブックAにあってBにない番号、また逆もあります。 それを日付が近いものから3つまで表示。 例) ワークブックA (sheet1)  番号 メモA1  メモA2 メモB1  メモB2 メモC1 メモC3 11111 2010/7/7  ccc 2010/5/5 ddd 2010/3/3 bbb 22222 2010/10/10 fff 2010/2/2 eee 35851 2010/12/12 ggg 54321 ワークブックB (sheet1) 番号  日付  メモ 11111 2009/1/1 aaa 11111 2010/3/3 bbb 11111 2010/7/7 ccc 11111 2010/5/5 ddd 22222 2010/2/2 eee 23568 2010/4/4 hhh 22222 2010/10/10 fff 35851 2010/12/12 ggg ※ワークブックAは最初項目と番号以外メモ部分は白紙です。例)は実行後の結果です。 質問で足りない部分ありましたら補足を入れますのでよろしくお願い致しますm(__)m

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

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

ワークブックAのSheet1のシートモジュールに次のコードを書いてください。 Sub 集計() Dim i As Integer Dim j As Integer Dim 番号 As String Dim 日付 As Date Dim メモ As String For i = 2 To Workbooks("ワークブックB").Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row 番号 = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 1).Value 日付 = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 2).Value メモ = Workbooks("ワークブックB").Sheets("Sheet1").Cells(i, 3).Value For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(j, 1).Value = 番号 Then If Cells(j, 2).Value < 日付 Then Cells(j, 6).Value = Cells(j, 4).Value Cells(j, 7).Value = Cells(j, 5).Value Cells(j, 4).Value = Cells(j, 2).Value Cells(j, 5).Value = Cells(j, 3).Value Cells(j, 2).Value = 日付 Cells(j, 3).Value = メモ ElseIf Cells(j, 4).Value < 日付 Then Cells(j, 6).Value = Cells(j, 4).Value Cells(j, 7).Value = Cells(j, 5).Value Cells(j, 4).Value = 日付 Cells(j, 5).Value = メモ ElseIf Cells(j, 6).Value < 日付 Then Cells(j, 6).Value = 日付 Cells(j, 7).Value = メモ End If Exit For End If Next Next End Sub

RENTAOSAKA
質問者

お礼

ありがとうございます。 今、確認ができないので、ひとまずお礼をっ(><;

RENTAOSAKA
質問者

補足

遅くなりましたが、ありがとうございました。 自分のファイルに置き換えができました^^

関連するQ&A

  • VBAでCSV内にある改行を取る方法

    あるシステムが吐くcsvファイルの項目の中に改行が入っているものがあります。 例) 01,aaa,bbb(改行)bbb,ccc(改行) 02,ddd,eee,fff(改行) 03,ggg(改行)ggg,hhh,iii(改行) このCSVファイルをエクセルのマクロで読み込んでシートに展開したい のですが、項目中にある改行で別レコードを認識してしまいます。 結果) A B C D ---+---+---+--- 01 aaa bbb  bbb ccc 02 ddd eee fff 03 ggg ggg hhh iii これを以下のようにしたいのですが・・・ A B C D ---+------+------+---- 01 aaa bbbbbb ccc 02 ddd eee fff 03 gggggg hhh iii どうやればよいでしょうか? ご教授お願いいたします。

  • EXCEL VBA 行列操作

    どなたか教えてください。 下記の様にA1からH5までの範囲に値がある行とない行があります。 空白セルを無視しA10に行列を操作し(行列入れ替え?)、さらに上詰め でコピーしたいのです(上にある行から列順に)。 よろしくお願いします。 例です  A   B   C   D   E   F  G   H 1 2                   aaa bbb 3 ccc ddd eee fff ggg 4 5 hhh ~ 10 aaa 11 bbb 12 ccc 13 ddd 14 eee 15 fff 16 ggg 17 hhh

  • エクセルのマクロについて

    エクセル97のマクロについて教えてください。 下のようなエクセルシートがあると仮定します。 このシート全体を選択して用意してあるボタンを押すと、マクロが流れるようにします。 マクロの中身は、項目1~4の値が同じであれば、同じデータを一つにするというものを考えています。 たとえば下の例の場合、追番でいえば2と4のデータは同じなので、マクロ処理にかけると、追番の大きい4のデータは消え、2のデータの"200"項目にフラグ1が追加されるようにしたいのです。 項目の値が同じであれば、いくつでもデータを統一したいと考えています。 ================ エクセル シート例 ================================== 追番_項目1_項目2_項目3_項目4_100_200_300_400 ← 見出し ----------------------------------------------------------------- 1****AAA****BBB****CCC****DDD****1*********1****1**** 2****EEE****FFF****CCC****GGG****1**************1**** 3****HHH****FFF****KKK****JJJ****1****1****1********* 4****EEE****FFF****CCC****GGG****1****1*********1**** ↓ マクロ処理後 追番_項目1_項目2_項目3_項目4_100_200_300_400 ← 見出し ----------------------------------------------------------------- 1****AAA****BBB****CCC****DDD****1*********1****1**** 2****EEE****FFF****CCC****GGG****1****1*********1**** 3****HHH****FFF****KKK****JJJ****1****1****1********* =================================================================== 注:見出しの_とデータの中の*は空白を生めるためのもので、データとはまったく 関係ありません。 なにぶんエクセルVBAは初心者同然なもので... よろしくお願い致します。

  • この場合の集計方法(エクセル)

    エクセル2003です。 下記のようなリストがあります。 |部屋|配属者| | A |aaa| | A |bbb| | A |ccc| | B |ddd| | A |eee| | C |fff| | C |ggg| | A |hhh| | B |iii| そして別の各シートに 部屋「A」ならば |配属者| |aaa| |bbb| |ccc| |eee| |hhh| というように、行に隙間を作らずに 上記のようなリストを作れる方法を 教えてください。 もちろんフィルターで絞って 部屋ごとにコピーするという不細工な方法は× 部屋の種類は約100種類 配属者データは約10,000件あります。

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • ピポッド 集計の追加

    ご存知の方、お知恵をお貸し下さい。 現在、下記のようなピポッドを組んでいます。 グループ1  AAA (AAAの合計、以下aaa+bbb+cccの合計) aaa bbb ccc        BBB (BBBの合計、以下ddd+eee+fffの合計) ddd eee fff CCC (CCCの合計、以下ggg+hhh+iiiの合計) ggg hhh iii グループ2・・・以下続く 上記に、BBBとCCCだけの合計を、(グループ1の中に)追加したいのです。 このように、合計したい項目だけを指定して 集計する事は可能でしょうか? 数式の集計アイテムの追加を行いましたが 上手くできませんでした。 ご存知の方、ご教授いただければ幸いです。 宜しくお願い致します。

  • Excel2000 データの振り分けと配列変換について

    シート1にデータを一気に入力してあります。 第1段階、所属ごとに所属1は所属1のシート、所属2は所属2のシートというようにシートに振り分けをしたい。 第2段階、振り分け後データごとに2列になるように印刷をしたい。 この様に入力されているデータを A   B   C   D 番号 名前   所属  1 AAA  1  2 BBB  2  3 CCC  1  4 DDD  3  5 EEE  4  6 FFF  5  7 GGG  6  8 HHH  3  9 III  4 10 JJJ  6  ・  ・  ・ 所属ごとにシートに振り分けて、2列 任意の単位で(この場合では、5単位ごと)になるように印刷したい。 所属1のシート 番号 名前   所属 番号 名前   所属  1 AAA  1   6 FFF  1  2 BBB  1   7 GGG  1  3 CCC  1   8 HHH  1  4 DDD  1   9 III  1  5 EEE  1  10 JJJ  1 技が無いため、切り張りしていますが、なにか良い方法がありましたら教えてください。

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • 大量データの一括変換

    aaa.bbb ccc.ddd eee.fff ggg.hhh 上記のようなデータが約1万行程度あるのですが、これを下記のようなユーザ名・メルアドに変換するコマンド等、お分かりになる方教えてください。ユーザ名・メルアドの間は半角スペースです。 ある程度自分で調べた結果awk等で出来そうな気がするのですが。。。 ユーザ名  メルアド   ↓     ↓ aaa.bbb aaa.bbb@hoge.com ccc.ddd ccc.ddd@hoge.com eee.fff eee.fff@hoge.com ggg.hhh ggg.hhh@hoge.com

  • sedで文字列の抜き出し

    ある一部分の文字列を抜き出したく、sedを使用したいと思って試行錯誤しております。 ↓あるファイル内の文字列 aaa bbb=ccc:ddd=eee:fff=ggg: aaa bbb=hhh:ddd=iii:fff=jjj: ※aaaとbbbの間はスペースです。 ※bbb,ddd,fffはある一定のキーワードです。 ※ccc,eee,ggg,hhh,iii,jjjはバラバラの文字列で長さも一定ではありません。 【質問】 上記の文字列の中でddd=の後の文字列(eee,iii)のみを抜き出したいです。 以下のようなsedを試してみましたが、 eee:fff=ggg iii:fff=jjj が抜き出されてしまいます。 sed 's/.*:ddd=\(.*\):\(.*\)$/\1/' 恐れ入りますが、皆様の知恵をお貸し下さい。

専門家に質問してみよう