- ベストアンサー
2つの表を統合するVBAマクロについて
- 2つの表を統合するVBAマクロの作成方法についてお教えください。
- 具体的な表の内容と結果のイメージを示しながら、2つの表を統合する方法を解説します。
- VBAマクロを使用して、2つの表を統合することで、効率的にデータの管理を行うことができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
別のご質問で関数の事に触れたので一例として、こういう場合にはこの関数で出来ます という意味で回答したものであって実際に使用する事を薦めている訳ではありません。 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に張り付けて並べ替えをするとデータが空白で番号 だけが表示された行が入ってしまう)
その他の回答 (2)
- april21
- ベストアンサー率42% (91/216)
>データが多い場合はマクロなどの自動処理の方が時間が短縮できるのですね。 表計算では自動計算をしてしまうため操作する度に10000件分の処理をしてしまう 為、重くなってしまいます。 (自動計算させない設定にしておいてデータを処理する時だけ実行する方法もあります) マクロだと実行させる処理(ボタンを押すとか特定のイベントを起こした時)を した時しか動作してない。 それと繰り返し実行するフロー制御ステートメントがVBAにあるのでコードを 簡略化することが出来るので軽くなります。 今回を例にVBAにするなら 1~10000件のデータに対して同じ処理を繰り返して実行しているだけなので 今回使った関数をVBAの関数にして繰り返し実行するステートメン(For...Nextなど)を使って実行すれば良いだけですね。 (^^)/~~~
- april21
- ベストアンサー率42% (91/216)
■シート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を見ればわかると思いますので省きました。
お礼
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列の並びを基準に統合できれば完璧なのですが、何かいい方法はございますでしょうか?説明が長くなってしまって(しかもややこしくて)大変申し訳ありませんが,いいアイデアが思い浮かんだ時にはご指導下さいませ。どうぞよろしくお願いします。今回は素晴らしい関数をお教え下さり本当に勉強になりました。ありがとうございます。
お礼
april21さん、お忙しい中ご回答本当にありがとうございます。やはり、データが多い場合はマクロなどの自動処理の方が時間が短縮できるのですね。おっしゃるとおりnishi6さんのVBAのお世話になっているのでどうしてもというわけではなかったのですが、私にとってBVAより比較的ハードルが低いかなと思われる関数でも同じことが出来るのであれば、何かのときに自分たちの力でどうにか処理することが出来ることがあるかもしれないと、ご迷惑も考えずにご相談してしまいまいた。本当に申し訳ありませんでした。A列には何の秩序もなくリストアップされている表もあるので、april21さんが最後のところでご指導してくださったやり方で一度試してみたいと思います。本当にいつもありがとうございます。今回もお手数をおかけして恐縮ですがどうぞこれからもよろしくお願いします。