いつもお世話になっております。
下記のコードは
'A列にありB列にないデータを作成
'B列にありA列にないデータを作成
をつくるコードです。ググって見つけました。
ここで'A列とB列どちらにもあるデータを作成
するにはどうしたらよいのかおしえてくれませんでしょうか
Public Sub データ比較()
Dim row As Long
Dim row2 As Long
Dim dicA As Object '連想配列
Dim key As Variant
Dim sh As Worksheet
Dim time1 As Variant
Dim time2 As Variant
Dim maxrow1 As Long
Dim maxrow2 As Long
time1 = Time
Set dicA = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh = ActiveSheet
maxrow1 = sh.Cells(Rows.Count, 1).End(xlUp).row ' A列最終行を求める
maxrow2 = sh.Cells(Rows.Count, 2).End(xlUp).row ' B列最終行を求める
For row = 2 To maxrow1
key = sh.Cells(row, 1).Value
dicA(key) = row
Next
row2 = 2
For row = 2 To maxrow2
key = sh.Cells(row, 2).Value
If dicA.Exists(key) = True Then
dicA.Remove (key)
Else
sh.Cells(row2, 3).Value = key
row2 = row2 + 1
End If
Next
'A列にありB列にないデータを作成
row2 = 2
For Each key In dicA
sh.Cells(row2, 4).Value = key
row2 = row2 + 1
Next
time2 = Time
MsgBox ("処理完了 所要時間(秒)=" & Second(time2 - time1))
End Sub
No.8
- 回答日時:
※この回答は、“締め切られた質問への回答追加”として、2021/02/12 09:49 に回答者の方よりご依頼をいただき、教えて!gooによって代理投稿されたものです。
---
折角のDictionaryオブジェクトの勉強なのであれば、Itemも利用しないと勿体ないと思い遅れましたが回答します。
Itemには基準列(D列)に対して条件による加算値を入れました。
項目行は既にあるとの前提です。
Sub megu()
Dim myDic As Object
Dim r As Range, key
Set myDic = CreateObject("Scripting.Dictionary")
For Each r In Intersect(Rows("2:" & Rows.Count), Range("A1").CurrentRegion)
If r.Value <> "" Then
If Not myDic.Exists(r.Value) Then
myDic.Add r.Value, r.Column
Else
myDic(r.Value) = 0
End If
End If
Next
For Each key In myDic.Keys
Cells(Rows.Count, 4 + myDic(key)).End(xlUp).Offset(1).Value = key
Next
Set myDic = Nothing
End Sub
ご参考になれば幸いです。
いつも有難うございます。
Intersect(Rows("2:" & Rows.Count), Range("A1").CurrentRegion)
myDic.Add r.Value, r.Column
個々の部分とても参考になりました。
ありがとうございます。
No.7
- 回答日時:
直接の回答ではないので削除されるかもですが。
No.6さんへ
>2次配列はRedim(拡張)出来ませんので
経験上3次元でも使えましたよ。
ただし拡張できるのは一番最後の次元でしたね。
なので行数を変更したいなどで
ReDim Preserve r( n , 3)
とやるとエラーですが、
ReDim Preserve r( 3 , n)
とすれば問題ないかと。
セルに書き出す際には行列反転が必要になりますけど。
ReDim Preserve r( 3 , n)
いまからやってみます。セルに書き出す際には行列反転
となるとwf.transpose(wf.transpose)みたいなかんじですか
実行します。
ありがとうございました
No.6
- 回答日時:
こんにちは、
横から失礼します。
Remove (key)なので
If key <> "" Then を加えた方が、、
ぶどうとさん、皆さん申し訳ありません。
スレッドお借りします。
ぶどうとさんへの前回 https://oshiete.goo.ne.jp/qa/12193741.html
の実行時エラーは、2次配列はRedim(拡張)出来ませんのであらかじめ
対象ワード個数を関数などで取得して配列宣言してください。
初歩的なミスでしたすみません。
失礼しました。。
No.3ベストアンサー
- 回答日時:
以下のようにしてください。
Public Sub データ比較()
Dim row1 As Long
Dim row2 As Long
Dim row3 As Long
Dim dicA As Object '連想配列
Dim key As Variant
Dim sh As Worksheet
Dim time1 As Variant
Dim time2 As Variant
Dim maxrow1 As Long
Dim maxrow2 As Long
time1 = Time
Set dicA = CreateObject("Scripting.Dictionary") ' 連想配列の定義
Set sh = ActiveSheet
maxrow1 = sh.Cells(Rows.Count, 1).End(xlUp).row ' A列最終行を求める
maxrow2 = sh.Cells(Rows.Count, 2).End(xlUp).row ' B列最終行を求める
For row1 = 2 To maxrow1
key = sh.Cells(row1, 1).Value
dicA(key) = row1
Next
row2 = 2
row3 = 2
For row1 = 2 To maxrow2
key = sh.Cells(row1, 2).Value
If dicA.Exists(key) = True Then
dicA.Remove (key)
sh.Cells(row3, "D").Value = key '両方にあるケース
row3 = row3 + 1
Else
sh.Cells(row2, "F").Value = key '仕入一覧のみにあるケース
row2 = row2 + 1
End If
Next
'A列にありB列にないデータを作成
row2 = 2
For Each key In dicA
sh.Cells(row2, "E").Value = key '果物一覧のみにあるケース
row2 = row2 + 1
Next
time2 = Time
MsgBox ("処理完了 所要時間(秒)=" & Second(time2 - time1))
End Sub
わたしも考えてみましたが、とんでもない
方向に行ってしまいました。
どうしたらこんな風にできるように
なるものなのでしょうか。
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) 追記する列を増やしたい 2つのデータを検索・照合して元データにないデータを下記マクロで商品名を追記し 9 2022/10/05 10:50
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
B列の最終行までA列をオート...
-
【VBA】2つのシートの値を比較...
-
Excelで、あるセルの値に応じて...
-
VBAを使って検索したセルをコピ...
-
rowsとcolsの意味
-
データグリッドビューの一番最...
-
エクセルVBAにて =A1=B1とすれ...
-
URLのリンク切れをマクロを使っ...
-
VBAで、特定の文字より後を削除...
-
マクロ 最終列をコピーして最終...
-
マクロ 関数を使った抽出でエラ...
-
EXCEL VBAマクロについて質問です
-
VBAコンボボックスで選択した値...
-
エクセルVBAでデータをカウント...
-
エクセルVBA シートモジュール...
-
VBAでのリスト不一致抽出について
-
最終列の右へSUM関数を作成する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
B列の最終行までA列をオート...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
【VBA】2つのシートの値を比較...
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
エクセルVBAにて =A1=B1とすれ...
-
VBAでのリスト不一致抽出について
-
データグリッドビューの一番最...
-
マクロについて。S列の途中から...
-
VBA UserFormからの転記で
-
targetをA列のセルに限定するに...
おすすめ情報
はいお願いいたします。