かなり初心者の質問ですいません。
マクロで、エクセルのVLOOKUP関数のような事がやりたいのですが、
条件を2つ設定することはできるのでしょうか。
データは、
ファイル1 商品データA.xls
ファイル2 商品データB.xls
ファイル3 グループ分け分類.xls
とあり、まずはマクロで「商品データA」の下に「商品データB」を貼り付けます(ここまでは問題ありません)
このデータには「商品コード」と「区分」があります。
これに応じて、ファイル3の「グループ分け分類.xls」から
データを引っ張ってきたいのです。
(ファイル1・2の加工物にも、ファイル3にも
「商品コード」と「区分」があります)
この場合のコードのやり方がわかりません。
No.1ベストアンサー
- 回答日時:
質問の表現の意味ががはっきりしない。
検索されるデータは商品データA.xlsのシート1と商品データB.xls
のシート1とか、なのか(シートまではっきり書くこと。または複数シート全体か。エクセルはシートのデータを直接的には扱うのだ。)
そしてシートのデータのフォーマットは同じなのか。
検索の場合は同じでなくてもよい場合があるが。
>これに応じて、ファイル3の「グループ分け分類.xls」から
データを引っ張ってきたいのです。
これだとグループ分け分類.xlsが検索されるデータなのか?
「から」といえばそうも取れる。
むしろ、条件のようなものが「グループ分け分類.xls」にあるのでは無いのか?
簡単な実例でも挙げて表現しないと「、何を言っているか判りにくい。
ーー
マクロの記録コードの修正で対処できなかったのか。
この回答への補足
失礼しました。
まず、すべてのデータはエクセルファイルです。
「商品データA.xls」と「商品データB.xls」はどちらもフィールド数が同じで、
結合したものを仮に「結合データ.xls」とします。
結合データ.xlsの内容は、
A列 B列 C列 D列
商品コード 区分 金額 購入日
A001 A 30,000 20090901
A005 B 20,000 20090901
B006 A 15,000 20090903
A001 C 30,000 20090903
とうようになっています。
これに対し、「グループ分け分類.xls」の内容は
A列 B列 C列
商品コード 区分 グループ名
A001 A 分類A
A001 B 分類B
A001 C 分類A
B006 A 分類A
B006 B 分類C
となっています。
「結合データ.xls」に「グループ分け分類.xls」のデータを
検索で流していきたいのです。
結果、「結合データ.xls」の完成予想では
A列 B列 C列 D列 E列
商品コード 区分 金額 購入日 グループ名
A001 A 30,000 20090901 分類A
A005 B 20,000 20090901 分類B
B006 A 15,000 20090903 分類A
A001 C 30,000 20090903 分類A
のようになれば成功です。
これをマクロで書く方法がわからなくて質問しました。
No.2
- 回答日時:
今更ですが…。
まず、素朴に書く場合。
'=====↓ ココカラ ↓===============================================
Sub Sample()
Dim mstSht As Worksheet
Dim tgtSht As Worksheet
Dim i As Long
Dim j As Long
Set mstSht = Workbooks("グループ分け分類.xls").Worksheets("Sheet1")
Set tgtSht = Workbooks("結合データ.xls").Worksheets("Sheet1")
'結合データの2行目から最終行まで回す
For i = 2 To tgtSht.Cells(Rows.Count, "A").End(xlUp).Row
'グループ分け分類の2行目から最終行まで回す
For j = 2 To mstSht.Cells(Rows.Count, "A").End(xlUp).Row
If tgtSht.Cells(i, "A").Value = mstSht.Cells(j, "A").Value And _
tgtSht.Cells(i, "B").Value = mstSht.Cells(j, "B").Value Then
tgtSht.Cells(i, "E").Value = mstSht.Cells(j, "C").Value
Exit For '見つかれば抜ける
End If
Next j
Next i
End Sub
'=====↑ ココマデ ↑===============================================
ただし、上のように
その都度セルから読み込んで、その都度セルに書き出す方式だと
データ数やグループ数が多い場合には時間がかかります。
下のように、配列に一気に読み込んで一気に書き出せば
所要時間はかなり少なくなります。
'=====↓ ココカラ ↓===============================================
Sub Sample2()
Dim mstAry As Variant
Dim tgtAry As Variant
Dim rtnAry As Variant
Dim i As Long
Dim j As Long
'グループ分け分類のデータを一気に読み込む
With Workbooks("グループ分け分類.xls").Worksheets("Sheet1")
mstAry = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "C").End(xlUp))
End With
'結合データのデータを一気に読み込む
With Workbooks("結合データ.xls").Worksheets("Sheet1")
tgtAry = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "B").End(xlUp))
End With
'書き出しデータ用の配列を用意する
ReDim rtnAry(1 To UBound(tgtAry), 1 To 1)
For i = 1 To UBound(tgtAry)
For j = 1 To UBound(mstAry)
If tgtAry(i, 1) = mstAry(j, 1) And tgtAry(i, 2) = mstAry(j, 2) Then
rtnAry(i, 1) = mstAry(j, 3)
Exit For
End If
Next j
Next i
'E2セル以下に結果を一気に書き出す
Workbooks("結合データ.xls").Worksheets("Sheet1") _
.Range("E2").Resize(UBound(tgtAry), 1).Value = rtnAry
End Sub
'=====↑ ココマデ ↑===============================================
以上ご参考まで。
返事が遅くなり、申し訳ございません。
初心者ながら、記述を上から順に理解して、
「なるほど」と感激しました。
まだ下の方の「UBound」はよくわからないのですが、
いろいろ試してみようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) DisplayAlertsブロパティで ”実行時エラー424オブジェクトが必要です” 5 2022/05/15 18:02
- その他(Microsoft Office) Excelで総数量を変動させたい 2 2022/11/04 23:49
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) 指定月分の顧客データファイルを統合して並べ替え、所定の場所に貼り付ける 3 2022/09/10 07:55
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- ヤフオク! ヤフオクの取引について 1 2022/04/16 23:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
Excel VBA テキストインポート...
-
ポケコン PC-E650 の...
-
COBOLの定義について
-
阿武町4630万円誤送金事件。町...
-
不規則なデータのfft処理
-
ディベートに関して質問です。...
-
EXCEL データをコピーして別シ...
-
ACCESS VBA インデックスが有効...
-
質問です スマホのデータを真っ...
-
エクセルのVBA メッセージボッ...
-
COD測定の滴定
-
エクセルで一連の文字列の左端...
-
メモ帳(テキストデータ)をExc...
-
SDカード メーカーや値段によ...
-
C#でserialPort送信。RS232Cへ。
-
平均値の計算の仕方は?
-
MATLABでのFFTについて
-
エクセルで2つの時系列のデー...
-
MATLAB - 3D Matrix の体積を計...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
VBA 空白セルを削除ではない方...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
S9タイプからXタイプにデータ...
-
Excelのマクロでワードのテキス...
-
エクセルで2つの時系列のデー...
-
Accessで該当データにフラグを...
-
ユーザーフォームのテキストボ...
-
シーケンサにパソコンからアク...
-
EXCELVBAでSQLserverからデータ...
-
[C言語] コメント文字列を無視...
-
VBAを使ってOutlookメール本文...
-
プログラミング python pandas ...
-
VBA 毎日取得するデータを順番...
-
<VB>String→Object
-
カンマからスラッシュに
おすすめ情報