2つの表を統合するVBAマクロについて

このQ&Aのポイント
  • 2つの表を統合するVBAマクロの作成方法についてお教えください。
  • 具体的な表の内容と結果のイメージを示しながら、2つの表を統合する方法を解説します。
  • VBAマクロを使用して、2つの表を統合することで、効率的にデータの管理を行うことができます。
回答を見る
  • ベストアンサー

2つの表を統合するVBAマクロについて

2つの表を統合したいのですがどなたかお知恵をお貸しください。 (例) sheet1に古い表、sheet2に新しい表があります。それぞれの表はこんな感じです。 (sheet1)   A    B    C    D sony001 男  東京 Japan sony002 女  埼玉 Japan sony003 女  千葉 U S A sony005 男  大阪 Canada sony007 女  東京 Russia (sheet2)   A    B   C   D sony001 男  東京 Japan sony002 女  埼玉 Japan sony002 女  千葉 U S A sony004 男  大阪 Canada sony005 女  東京 Russia sony006 女  東京 Russia sony007 男  東京 U S A sony007 女  東京 Russia これらの表をsheet3にどのように統合したいかといいますと、下記のようは統合表を作成したいのです。 (sheet3 統合表)   A    B    C   D sony001 男  東京 Japan sony002 女  埼玉 Japan sony002 女  千葉 U S A sony003 女  千葉 U S A sony005 女  東京 Russia sony007 男  東京 U S A sony007 女  東京 Russia 質問の長さが800字を超えてしまいますので、この統合表を作成するための手順を「2つの表を統合するVBAマクロについて(2)」で補足したいと思いますのでどうぞよろしくお願いいたします。

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

  • ベストアンサー
  • april21
  • ベストアンサー率42% (91/216)
回答No.2

別のご質問で関数の事に触れたので一例として、こういう場合にはこの関数で出来ます という意味で回答したものであって実際に使用する事を薦めている訳ではありません。 5000~10000件もあるようなデータを自動計算する設定のまま件数分のセルに数式をいれると 処理が遅くて使い物にならないと思います。 それにnishi6さんの考えてくださったVBAがあるのですから必要ないはずです。 ■件数が少なくて何かに利用したい方の為に 商品番号などをつける場合は別々のセルするか「0001みかん」という風に数字を左に付ける。 番号を付けたセルをキーに「データ」-「並べ替え」で並べ替えを行う事が出来ます。 (文字列の左側のものを優先的にする為「みかん0001」「おかん0002」で並べ替えを 行うと「おかん0002」「みかん0001」に。) 50音順、数字などの昇順、降順でもなく任意の順に並べ替えたい場合は1番目に並べたい行の セルに「1」2番目「2」・・・という風に番号をつけ、そのセルをキーに「並べ替え」 をする。 50音順で並び替えたけど最初の並びに戻したい場合、番号がふってないと戻す為のキーが ないので戻らない。 だから、並べ替える前にデータの右でも左のセルでもいいので番号ふっておく。 手動では大変なのでフィルを使って番号を自動で付ける(フィルが分からなければヘルプ参照) ☆今回のを例にすると K列にフィルを使って番号をつけ、F~I列でしたのと同様に シート1のJ1は=IF($E1=0,K1,"") シート2のJ1は=IF($E2<>0,K1,"")にして不要な番号がセルに 入らないする。 E1をクリックしてシフト+コントロールキーを押しながら「end」キーで選択してコピーして シート3に「形式を選択して・・」-「値」で貼り付けし「データ」-「並び替え」で「J列」を キーにして並べ替える。 (F~J列を選択してコピーして値をシート3に張り付けて並べ替えをするとデータが空白で番号 だけが表示された行が入ってしまう)

kiroro302
質問者

お礼

april21さん、お忙しい中ご回答本当にありがとうございます。やはり、データが多い場合はマクロなどの自動処理の方が時間が短縮できるのですね。おっしゃるとおりnishi6さんのVBAのお世話になっているのでどうしてもというわけではなかったのですが、私にとってBVAより比較的ハードルが低いかなと思われる関数でも同じことが出来るのであれば、何かのときに自分たちの力でどうにか処理することが出来ることがあるかもしれないと、ご迷惑も考えずにご相談してしまいまいた。本当に申し訳ありませんでした。A列には何の秩序もなくリストアップされている表もあるので、april21さんが最後のところでご指導してくださったやり方で一度試してみたいと思います。本当にいつもありがとうございます。今回もお手数をおかけして恐縮ですがどうぞこれからもよろしくお願いします。

その他の回答 (2)

  • april21
  • ベストアンサー率42% (91/216)
回答No.3

>データが多い場合はマクロなどの自動処理の方が時間が短縮できるのですね。 表計算では自動計算をしてしまうため操作する度に10000件分の処理をしてしまう 為、重くなってしまいます。 (自動計算させない設定にしておいてデータを処理する時だけ実行する方法もあります) マクロだと実行させる処理(ボタンを押すとか特定のイベントを起こした時)を した時しか動作してない。 それと繰り返し実行するフロー制御ステートメントがVBAにあるのでコードを 簡略化することが出来るので軽くなります。 今回を例にVBAにするなら 1~10000件のデータに対して同じ処理を繰り返して実行しているだけなので 今回使った関数をVBAの関数にして繰り返し実行するステートメン(For...Nextなど)を使って実行すれば良いだけですね。 (^^)/~~~

  • april21
  • ベストアンサー率42% (91/216)
回答No.1

■シート1の E1=COUNTIF(Sheet2!A$1:A$8,A1) で、このセルをクリックして右下が「+」に変わったらI1までドラッグ&ドロップ、 次にI5のセルまでドラッグ&ドロップ F1=IF($E1=0,A1,"") で、このをクリックして右下が「+」に変わったらF5までドラッグ&ドロップ ■シート2 E1=COUNTIF(Sheet1!A$1:A$8,A1)・・・・・Sheet2がSheet1に変わっただけ F1=IF($E1<>0,A1,"")・・・・・「=」だったのが「<>」に変わっただけ ↑と同じような感じで数式入力(5行から8行に増えたのでその分多めにトラッグ&ドロップ) これでシート1とシート2が必要なデータがF列~I列に残ってるはずです。 シート3に各シートのデータを「形式を選択して貼り付け」-「値」で貼り付け、 空白行はオートフィルタで「空白以外のセル」選択すれば消えます。 並び方を変えたくないのであればシート1,2のデータにフィルで番号を付けておき、それをキー に「並べ替え」。 (I1までだったのをこのセルの分まで増やさないと無視するデータに番号がついたままになります) 番号を付けると元データにキーになる数字などがなくても大丈夫です。 無視されたデータなどはシート2を見ればわかると思いますので省きました。

kiroro302
質問者

お礼

april21さん、いつもご回答ありがとうございます。早速やってみました。素晴らしいですね。見事sheet1,sheet2のE列、F列に、sheet3で統合したいデータが残りました。これをsheet3に統合する際に、上記の質問では分かりづらいのですが、A列のデータの並びを変えずに統合したいのです。これは何をやっているのかといいますと、データの更新なのです。sheet1にはお客様から送られてくる品番(A列)とそれに対するデータ(B,C,D列)があります。Sheet2にはその品番に対して私どもの会社で行った最新のテスト結果データ(B,C,D列)があります。(もちろんA列は共通です。)sheet1のA列には重複はありません。しかしsheet2の私達の方の表は、テストの結果によってはA列の1つの項目に対して2~3行の結果データになる場合もあるのです。 (例) sheet1 みかん001   男   東京  USA  ←april21さんの関数で残るデータ  みかん002   女   大阪  JAP  みかん003   男   埼玉  CAN  みかん004   女   福岡  SDD  みかん005   男   秋田  TTA  ←april21さんの関数で残るデータ   みかん007   女   千葉  YER sheet2 みかん002   男   東京  USA  ←april21さんの関数で残るデータ  みかん002   女   福岡  TTA  ←april21さんの関数で残るデータ  みかん003   女   秋田  CAN  ←april21さんの関数で残るデータ  みかん004   男   埼玉  DAA  ←april21さんの関数で残るデータ  みかん006   女   千葉  YER  ←無視されるデータ  みかん007   男   東京  USA  ←april21さんの関数で残るデータ sheet3  みかん001   男   東京  USA  ←sheet1のデータ  みかん002   男   東京  USA  ←sheet2のデータ  みかん002   女   福岡  TTA  ←sheet2のデータ  みかん003   女   秋田  CAN  ←sheet2のデータ  みかん004   男   埼玉  DAA  ←sheet2のデータ みかん005   男   秋田  TTA  ←sheet1のデータ  みかん007   男   東京  USA  ←sheet2のデータ という風にしたい場合、april21さんがご提案下さったSheet1,2に残ったデータを空白を無視してSheet3にコピーすると  みかん001   男   東京  USA  ←sheet1のデータ  みかん005   男   秋田  TTA  ←sheet1のデータ  みかん002   男   東京  USA  ←sheet2のデータ  みかん002   女   福岡  TTA  ←sheet2のデータ  みかん003   女   秋田  CAN  ←sheet2のデータ  みかん004   男   埼玉  DAA  ←sheet2のデータ  みかん007   男   東京  USA  ←sheet2のデータ というふうになりA列の並びが変わってしまうと思われます。(みかん001の後にみかん005が来てしまうので…)このA列の並びはsheet1の並びを基準にしたいのです。これを今までは手動で見合わせながらcut & Paste をしていましたが、データの数が5000件から10000件にも及ぶといつも午前様になってしまうというわけです。april21さんの関数では見事にそれぞれのsheetにsheet3で採用したいデータが残っていますので、後はこれをsheet1のA列の並びを基準に統合できれば完璧なのですが、何かいい方法はございますでしょうか?説明が長くなってしまって(しかもややこしくて)大変申し訳ありませんが,いいアイデアが思い浮かんだ時にはご指導下さいませ。どうぞよろしくお願いします。今回は素晴らしい関数をお教え下さり本当に勉強になりました。ありがとうございます。    

関連するQ&A

  • 2つの表を統合するVBAマクロについて(2)

    「2つの表を統合するVBAマクロについて」での質問を補足いたしますのでどうかお力をお貸しください。 前回の質問で例にあげたsheet1の表とsheet2の表を統合してsheet3に統合表を作りたいのですが、どのように統合したいのかといいますと、 (1)それぞれの表のA列をキーに、sheet1にもsheet2にもあるデータは新たに統合する表に採用します。前回の例でいうと、sony1,2,5,7ですね。この両者共通のものは新たに統合する表には、sheet2の方のデータを採用します。(複数ある場合は全て採用します。) (2)次にsheet1にしかないデータは統合する表に採用します。前回の例ではsony003が該当します。 (3)最後にsheet2の方にしかないデータは統合する表には採用しません。無視します。 この(1)から(3)を実行して下記のようは統合表を作成したいのです。 (sheet3 統合表)   A   B   C    D sony001 男  東京 Japan ←(sheet2のデータ) sony002 女  埼玉 Japan ←(sheet2のデータ) sony002 女  千葉 U S A ←(sheet2のデータ) sony003 女  千葉 U S A ←(sheet1のデータ) sony005 女  東京 Russia ←(sheet2のデータ) sony007 男  東京 U S A ←(sheet2のデータ) sony007 女  東京 Russia ←(sheet2のデータ) そしてできれば採用されなかった(無視されたデータ)をsheet4にリストアップしたいのです。 (sheet4 無視されたデータ) sony004 男  大阪 Canada sony006 女  東京 Russia このような処理を自動的にできるVBAマクロがわかる方がいらっしゃいましたら、どうかご教授くださいませ。データが大量なので手動ではとても時間がかかってしまい困っております。どうかお力をお貸しください。よろしくお願いいたします。

  • エクセルで2つのリストを統合するには?

    エクセルの別々のシートにある2つのリストを統合したいのですが、過去の質問などを見てもうまくいきません。具体的には 【表1】 番号 氏名 住所 A 佐藤 東京 B 高橋 神奈川 C 渡辺 埼玉 D 田中 千葉 E 小林 山梨 【表2】 番号 氏名 年齢 B 高橋 22 D 田中 45 という2つの表で、これを 番号 氏名 住所 年齢 A 佐藤 東京 B 高橋 神奈川 22 C 渡辺 埼玉 D 田中 千葉 45 E 小林 山梨 のようにまとめたいのです。 「データの統合」を使ってみましたがうまくいきませんでした。よろしくお願いします。

  • 表の統合

    エクセルで表を作るときの簡単な方法を探しています。 今、下のようなデータ1とデータ2があります。(ほんとうはたくさんあるのですが、省略させていただきます) そのデータを統合してtotalというデータを作る場合、どのような方法があるでしょうか。 D1   D2 名前 出身 頻度 名前 出身 頻度 山田 東京 3 山田 東京 2 伊藤 埼玉 1 山田 埼玉 1 梅田 大分 2 伊藤 埼玉 2      total 名前 出身  D1 D2 山田 東京 3 2 伊藤 埼玉 1 2 梅田 大分 2 0 山田 埼玉 0 1

  • EXCLEのマクロ 2つのシートを統合する方法

    下記のことを行いたいのです。 教えていただけないでしょうか。 下記2つのシートをA列をキーにして sheet1のあ、b、c列のデータに sheet2のc、d列を 統合して、sheet1のdれつ e列に統合して5列のデータを作りたい a列とb列のデータは基本同じですが、スペースが入っていたり 違う場合もある。B列はsheet1のデータを採用 sheet2は不要 ・sheet1 a列 b列 C列 123 ああ 123456 456 いい 125456 789 うう 12344556 1234 ええ 12345678 4567 おお 123456456 8945 かか 1234567844 ------------------- ・sheet2 a列 B列 C列 D列 123 ああ 03-5212-0000 東京都○ 456 いい 06-5212-0000 大阪府○ 789 うう 044-5212-0000 神奈川県○ 1234 ええ 045-512-0000 横浜市○ 4567 おお 043-212-0000 埼玉県○ 8945 かか 03-5212-0000 東京都○

  • ある列のリアルタイム数値を3分毎に列をずらしながら記録するEXCELマクロを作りたい

    EXECL2002 SP3を使っています。 B2からB99まで数式が入力されています。 この数式の結果はリアルタイムで変わります。 このリアルタイムデータを、 記録するマクロを作成したいと考えています。 9時1分から20時1分まで3分毎にデータを取得し、 C列、D列、E列、と列をずらしながら記録していきます。 以下のようなイメージになります。 ☆数式の状態     A   B 1        =now 2    東京  =tokyo.temperature 3    千葉  =kanagawa.temperature 4    埼玉  =saitama.temperature ☆9時1分のシートの状態     A   B   C 1        9:01  9:01 2    東京  11.5  11.5 3    千葉  11.9  11.9 4    埼玉  10.8  10.8 ☆9時4分のシートの状態     A   B   C   D 1        9:04  9:01  9:04 2    東京  11.6  11.5  11.6 3    千葉  12.1  11.9  12.1 4    埼玉  11.0  10.8  11.0 ☆9時7分のシートの状態     A   B   C   D   E 1        9:07  9:01  9:04  9:07 2    東京  11.8  11.5  11.6  11.8 3    千葉  12.4  11.9  12.1  12.4 4    埼玉  11.1  10.8  11.0  11.1 上記の作業を実現できるマクロを 教えていただけませんでしょうか。 よろしくお願いいたします。

  • Accessでこんな表(データ)つくれますか?

    府県名 学校名 学年 性別  -------------------------- 東京  〇〇〇  6  男 埼玉  ×××  2  女 埼玉  ▲▲▲  1  女 千葉  □□□  3  男 神奈川 ◎◎   1  男 上記データを基に、下記のような表を作成したいです。 行→府県名、学校名 列→学年、性別 データ→性別のカウント 今まで、Excelのピボットテーブルをりようしていましたが Accessで作表できないものでしょうか?

  • エクセルの立ち上げ時とマクロ実行時の再計算について

    なぜ同じ形式のファイルで同じようなことをマクロで実行させているだけなのに 一つだけ立ち上げ時と再計算時に時間がかかるか教えてください。 各フォルダ(東京・神奈川・千葉・埼玉)にアクセスからエクスポートしたExcelファイル(A・B・C・D)と、それを集計する合計.xlsがあります。 合計.xlsのマクロボタンを押下することによって A・B・C・Dが立ち上がり、それぞれが合計.xlsのsheet2~5に貼りつき、A・B・C・Dを閉じます。 合計.xlsのSheet1にはマクロボタンとSheet2~5を集計するための表があり、Sheet2~5からvlookupで数値を引っ張ってきています。 ●各フォルダに入ってるファイルは同じ形です。 ●フォルダ(東京・神奈川・千葉)は立ち上げもマクロ実行時も数秒で計算が完了します。 フォルダ(埼玉)だけは立ち上げ時に3分以上かかり、どこかクリックする度に再計算(これも3分以上)されてしまいます。 3分位待ってればいいのですが、なぜ(埼玉)の合計.xlsだけがそうなってしまうのか、わかる方がいらっしゃれば教えてください。 マクロ作成時、確認をしたときは他と同じでした。 今日他の人が合計.xlsを何度か強制終了したとのことですが、これが原因になったりしますか? ちなみに他フォルダ(東京)からファイルをコピーしマクロ&関数を修正してみましたがダメでした。 フォルダ(埼玉)に問題があったりするのでしょうか?

  • EXCELのVBAで困っています。

    うまくかけないので、イメージを下に書かせていただきます、。  |  A  |  B  | ---------------------- 1 | 東京   150 2 | 埼玉   150 3 | 千葉   150 4 | 群馬   120 5 | 東京   120 6 | 静岡   110   ↓  |  A  |  B  | ------------------------  | 東京 1 | 埼玉   150  | 千葉 ------------------------ 2 | 群馬   120  | 東京 ------------------------ 3 | 静岡   110 上記のような処理をVBAで行いたいのですが、どのように 書いたらよいかを、教えてください。お願いします。

  • Excel 2007 マクロ 表の貼り付け

    Excel 2007 マクロ 表の貼り付け Excel 2007 マクロ 表の貼り付けについて教えてください。 <Sheet1>の表にあるA2からD4を <Sheet2>に値貼り付けをします。 表は画像を添付します。 マクロの記録では下記内容になります。 Sub Macro1() ' ' Macro1 Macro ' ' Range("A2:D4").Select Selection.Copy Sheets("Sheet2").Select Range("A2:D4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub <Sheet1>のA列の行の増減にかかわらず、<Sheet2>に貼り付けることができるように するにはどのようにマクロを修正すればよろしいでしょうか。

  • Excelで統合の機能を使いたい

    Excelで統合の機能を使ってデータを集計したいのです。 例えば、Aさんの売上表をsheet1に作成します。 売上表は、項目やセル位置に若干の違いはあるものの、 似たような作りの表なので、 Aさんのシートを元にして、シートコピーを行い、 コピーしたシートに、Bさんの売上表、Cさんの売上表を作成しました。 そして、集計するためのシートにて、統合を選択しました。 集計方法を「合計」、 統合元範囲をそれぞれ「Aさんのシートにある表範囲」 「Bさんのシートにある表範囲」「Cさんのシートにある表範囲」を追加し、 統合の基準で「上端行」「左端列」にチェックを入れ、OKを押しました。 しかしその結果、合計行が2つでてしまい、正しく集計が行えませんでした。 どこか、やり方が間違っているのでしょうか? 試しに、シートコピーを行わないで各シートごとに表を1から作成し、 統合を実行したところ、ちゃんと合計行も1つで、正しい集計結果が得られました。 もしかして、統合の時には、表をコピーしてはいけないのでしょうか? 以前にも、1から表を作った場合と、シートコピーをした場合とで、 集計結果に、「項目の並び順の違い」がでたことはあったのですが、 そのときは並び順だけが違い、集計結果はあっていたので、 特に気にしていませんでした。 なぜ、こういう結果になってしまうのか、 どなたか、ご存知の方いらっしゃいましたら、 アドバイスいただけたらと思います。 よろしくお願いします。

専門家に質問してみよう