質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

5回答

5393閲覧

【Excel VBA】異なる2つのシートのデータを使用してSQLのINNER JOINのような動きをするマクロを作成したいのですがご教授願いたいです。

k207067

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/01/10 02:54

イメージとしては
|A|B|C|D|E|
|:--|:--:|--:|
|x|y|key|a|a|
|x2|y2|key|b|b|

のような内容のシート1を

|A|B|C|D|E|
|:--|:--:|--:|
|key|v|w|
|key|v2|w2|

という内容のシート2で「key」をキーとして上書いて結合したいというものです。

結合後イメージとしては

ABCDE
xykeyvw
x2y2keyv2w2

このような感じです。

VLOOKUPを使って頑張ってみたのですがkeyを基準に全体を結合することができなかったので質問させていただきます。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

シートをテーブルとして扱い、SQLで処理することも可能です。
Excelの集計をSQLでおこなう方法。VLOOKUP()やSUBTOTAL()の限界を超えろ!!

投稿2019/01/10 09:03

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k207067

2019/01/10 10:31

あーこれは良さそうですね!!! とりあえずこれで頑張ってみます。 詰まったらまた質問させて頂きたいのでよろしくお願いします。
guest

0

Keyで検索して、値を「上書き」するのなら、
JOINとは性質の異なるものだと思います。

両方のテーブルに対して、
Dictionaryを作って Key,Item = シートのkey,行番号 の構造体を作成し、
シート2のKeyで回して、
シート1にあるKeyだったら、
シート2の該当行の値で、
シート1の該当行の値を上書き、
で処理できるかと。

もし、本来のJOIN同様、新しいテーブルを作成したいのであれば、
新規シートに、シート1のデータをコピーして、
上記の処理をした後に、シート2に無いKeyのデータ行を削除すれば
再現できそうかな
※1行ごとに削除すると、Dictionaryの行位置とズレるので、
該当箇所の全てをRange型変数にまとめておいて(UNIONを使用)、
全部を一括で削除するのが無難でしょうね。

投稿2019/01/10 09:35

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

キーとする項目(シート1のC列、シート2のA列)が2行とも"key"という値で同一なのですが、これは各行でそれぞれ異なる値(例えば"key1"と"key2")ですよね?
でなければキー項目でそれぞれ対応する1行とは結び付けられませんので、一応確認です。

あとVBAでの実装をお考えで、ご自身で作ってみたものの期待する動作とならない、ということですよね。

・どのようなコードを作成されたのか
・うまくいかないとは具体的にどういうことか(エラーが発生するのか、期待する結果が得られないのか、等)
というところを追記いただいた方が、より具体的で実のあるアドバイスができると思います。


やりたいことはVlookupで実現可能だと思います。
(不一致行の削除まではできないのでどちらかというとLEFT JOINでしょうか。)

ただしVlookupには使用にあたり、以下のような制限事項というか前提条件がある点に注意してください。

①マスタとなる範囲の左端列を検索キーとすること
⇒今回の場合シート2のA列~C列の左端列(つまりA列)がキー列となっていますので問題ありません。

②マスタとなる範囲が左端列(つまり検索キーの列)でソートされていること
⇒この条件が満たされていないと、範囲内に一致するキーが存在するのに見つけられない、という結果になる場合があります。

シート2が上記の条件を満たしていれば、

出力シートのD2セル:`=Vlookup(Sheet1!$C2, Sheet2!$A$2:$C$3, 2)` 出力シートのE2セル:`=Vlookup(Sheet1!$C2, Sheet2!$A$2:$C$3, 3)`

といった式で目的の結果を得ることができると思います。

ご自身で作成されたコードの提示がありませんのでサンプルコードの提供は控えさせていただきますが、VBAでWorksheetFunction.VLookupを使った実装とする場合も同様です。

まずはSheet2が前提条件を満たしているかから、ご確認ください。

投稿2019/01/10 04:14

編集2019/01/10 04:24
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

vlookupにこだわらず結果だけ求めるということであれば、
シート1の行とシート2の行の二重ループを作成し、
二重ループ内でシート1のC列とシート2のA列が一致したら転記する。
という処理を作れば可能だと思います。
行数が多いと時間がかかりそうなので、そこは工夫してください。

投稿2019/01/10 03:50

tabuu

総合スコア2449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

表を結合は、列の結合の繰り返しでしかないので、こちら→VLOOKUPを応用して、2つの表を結合するのように可能だと思います。

それともVLOOKUPが沢山あるせいで遅いということが仰りたいのでしょうか?

投稿2019/01/10 03:00

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k207067

2019/01/10 03:11

一応は全体的にマクロで自動化したいということです。
k207067

2019/01/10 03:13 編集

言葉足らずでした。 VLOOKUPってよりかは Application.WorksheetFunction.vlookupを使って頑張ってみたっていうことです。 申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問