VBAで照合作業用マクロを作成しております。
初心者なのでネット検索などして作成しているのですが
重複データ同士の照合というものが見つからないため
どなたかご教示いただけると助かります。
(OS-Windows7,Office2013)
作業内容:
①シート1とシート2のデータを売上番号と金額をキーにして照合する
②データが一致したシート2の該当行(同行横)へ、シート1の該当行を転記
・シート1,2の売上番号と金額は重複を含む
・重複している売上番号等は、シート1,2で同数
・データは各シート1,000行~1,200行
・マッチング出来ないデータについては空白とする
=======================================
◆質問◆
重複データの"Item"を転記する方法
(転記は金額を基準とする)
=======================================
○シート1(明細データ)
売上番号 金額 Item1 Item2
--------------------------------------
44-3 2,000 500 1,500
11-1 1,000 300 700
11-1 1,000 500 500
11-1 1,500 500 1,000
22-4 3,000 2,000 1,000
○シート2(売上データ)
売上番号 金額 氏名
------------------------
11-1 1,000 佐藤
11-1 1,000 佐藤
11-1 1,500 佐藤
55-2 4,500 上田
22-4 3,000 松本
↓マクロを実行
○シート2 完成表(希望)
売上番号 金額 氏名 Item1 Item2
------------------------------------------------
11-1 1,000 佐藤 300 700
11-1 1,500 佐藤 500 500
11-1 1,000 佐藤 500 1,000
55-2 4,500 上田 (空白)
22-4 3,000 松本 2,000 1,000
==========================================
下記マクロを実行した結果:
重複番号の"Item"列が1行しか転記されない->重複最終行のみ
(ユニークの番号同士については問題なく転記される)
=============================================
Sub TEST01()
Dim sht1, sht2
Application.ScreenUpdating = False
Set sht1 = Worksheets("Sheet1")
Set sht2 = Worksheets("Sheet2")
d = sht1.Range("A5536").End(xlUp).Row
On Error Resume Next
For i = 2 To d
'条件設定
If sht1.Cells(i, "A") = sht2.Cells(i, "A") Then
ElseIf sht1.Cells(i, "B") = sht2.Cells(i, "B") Then
End If
If sht1.Cells(i, "C") <> sht2.Cells(i, "C") Then
'Sheet2で該当行を検索
For r = 2 To 1000
If sht1.Cells(i, "A") = sht2.Cells(r, "A") Then Exit For
Next r
'該当行をSheet2へ転記
sht2.Cells(r, "D") = sht1.Cells(i, "C")
sht2.Cells(r, "E") = sht1.Cells(i, "D")
End If
Next i
Application.ScreenUpdating = True
End Sub
どうぞよろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんにちは。
んー、なんていうか、そういう処理をする場合は、
何でもかんでもVBAの力技に任せるのではなくて、
ある程度、扱い易いシートデザインを用意しておくのが本筋とは思います。
例えば、実質的な主キーは、
A列とB列を連結(実戦では区切り文字を挟みます)したもの、なのですから、
予め、実質的な主キーをひとつのフィールドとして用意しておくとか、
それだけでもVBAの処理は易しくなり、
VBA側の設計も幅が出てきて易しくなります。
VBAだけでなくて全体の設計を見直した方がベターではあります。
色々事情はおありでしょうから、このことは先の話として、置いといて、
本題に直接的にお答えします。
要は、
同じ(ユニークでない)キーに対して、
複数のデータがあり、それらを、順番にピックアップして、
ひとつの表にまとめたい、ということだと理解しています。
これはこれで、'表計算'や'データベース'のアプリケーションにとっては、
例外的で苦手とする処理のひとつだったりして、
VBA書くのも簡単ではないと思います。
とりあえず、
★Dictionaryオブジェクト
★Collectionオブジェクト
★二次元配列
等、普通は初級では扱わないような手法で、
スクリプトを書くのが(私にとって)簡単な方法で一案、書いてみました。
実質的な主キーの扱いについては、
.Cells(i, "A").Text & vbCr & .Cells(i, "B")
のように、セルには入力できない改行文字を区切り文字を使って、
A列とB列を連結しています。
実質的な主キーに対応したデータを
Dictionaryオブジェクトのアイテムに置いたCollectionオブジェクトに
追加したり削除したりして、
同じ(ユニークでない)キーに対応した複数のデータを順番に出力します。
技術的な解説は一度では難しいので省きますが、
★マークを付けたキーワードについて、調べてみて、
その上でお尋ねになりたいことがあれば、ひとつひとつお応えします。
何をどうやっても難しい要求を実現するのは、難しい、
これは仕方ないことですが、少しでもマシ(技術的により簡単)な
やり方を思いついたら、もしかしてまた回答するかもしれません。
' ' ===============================
Sub Re8929559()
Dim objDict As Object ' As Scripting.Dictionary '
Dim sTemp As String
Dim d As Long
Dim i As Long
Set objDict = CreateObject("Scripting.Dictionary") ' = New Scripting.Dictionary
With Worksheets("Sheet1")
d = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To d
sTemp = .Cells(i, "A").Text & vbCr & .Cells(i, "B")
If VarType(objDict(sTemp)) = vbEmpty Then
Set objDict(sTemp) = New Collection
End If
objDict(sTemp).Add .Range(.Cells(i, "C"), .Cells(i, "D")).Value, CStr(objDict(sTemp).Count)
Next i
End With
Application.ScreenUpdating = False
With Worksheets("Sheet2")
d = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To d
sTemp = .Cells(i, "A").Text & vbCr & .Cells(i, "B")
If objDict.Exists(sTemp) Then
.Range(.Cells(i, "D"), .Cells(i, "E")).Value = objDict(sTemp)(1)
objDict(sTemp).Remove 1
End If
Next i
End With
Application.ScreenUpdating = True
End Sub
' ' ===============================
丁寧なアドバイス参考になります。希望通りの表になりました。
オブジェクトと配列について調べてみましたが、基礎知識が不足しているので不明な点自体が分からないという状態です。基礎的なことをもっと学習する必要を感じています。セルの結合は全く思い浮かびませんでしたので目からウロコでした。質問して良かったです。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
チョコミントアイス
得意ですか?不得意ですか?できれば理由も教えてください。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
架空の映画のネタバレレビュー
映画のCMを見ていると、やたら感動している人が興奮で感想を話していますよね。 思わずストーリーが気になってしまう架空の感動レビューを教えて下さい!
-
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
VBA DictionaryオブジェクトのItemについての質問です。
Excel(エクセル)
-
Excel VBAにて
その他(Microsoft Office)
-
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
EXCELのSheet番号って変更でき...
-
VBA別シートの最終行の次行へ転...
-
マクロ実行後に別シートの残像...
-
VBA 別ブックからの転記の高速...
-
VBA 空白行に転記する
-
Unionでの他のシートの参照につ...
-
VBA 実行時エラー1004 rangeメ...
-
【VBA】複数シートのデータを1...
-
エクセルVBA:軸の設定でエラー...
-
Excel VBA オートフィルターで...
-
100万件越えCSVから条件を満た...
-
VBAで変数の数/変数名を動的に...
-
前回質問の続きになりますが、...
-
Count Ifのセルの範囲指定に変...
-
エクセル 複数シートの同一セ...
-
グラフマクロで系列を変数にす...
-
1004RangeクラスのPasteSpecial...
-
ExcelのVBマクロを、バックグラ...
-
FindNextがうまくいかない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
EXCELのSheet番号って変更でき...
-
VBA 空白行に転記する
-
マクロ実行後に別シートの残像...
-
VBA別シートの最終行の次行へ転...
-
Changeイベントで複数セルへの...
-
Count Ifのセルの範囲指定に変...
-
ExcelのVBマクロを、バックグラ...
-
VBA 実行時エラー1004 rangeメ...
-
VBAで変数の数/変数名を動的に...
-
VBA 別ブックからの転記の高速...
-
Excel VBA オートフィルターで...
-
100万件越えCSVから条件を満た...
-
複数シートの複数列に入力され...
-
【VBA】特定の条件でセルをコピー
-
Excel2013で切り取り禁止
-
楽天RSSからエクセルVBAを使用...
-
アクセスからエクセルへ出力時...
-
グラフマクロで系列を変数にす...
-
FindNextがうまくいかない
おすすめ情報