マクロで2シートのセル値を比較した時に空白値がスルーされる | |
---|---|
[194604] マクロで2シートのセル値を比較した時に空白値がスルーされる- ■親トピック/記事引用/メール受信=OFF■ □投稿者/ かずやん -(2022/01/13(00:24)) □U R L/ 本来コードを書くべきですが、都合により文書ベースになり恐縮です。 マクロで2つのシートそれぞれの任意の列を ペアになる形で配列に格納した上で、それぞれの各行を読み込み、 キーが合致する場合、それぞれのセル値を 比較した上で差分あれば一方からもう一方へ セル値を上書きする、ということを行っています。 総じて上手く稼働するのですが、比較時に上手くできない ケースがあります。 比較元 比較先 結果 @セル値あり 空白 比較元のセル値で上書き A空白 空白 空白 Bセル値あり セル値あり 比較元のセル値で上書き C空白 セル値あり ✕セル値あり ※空白に上書きできない 上記のとおり、Cの比較元が空白、比較先に値がある場合、上書きできません。この原因と対策を知りたい、というのが主旨です。 ただし、比較に先だってC以外の行のセル値を合わせて変更しておくと、 Cでも上書きできてしまうという不可思議な状況です。 構文はFor文が3つにネストしており、 一つ目のFor:2列の配列を用意し、比較対象の列のペアを順次読み込む 二つ目のFor:配列1の各行を読み込む 三つ目のFor:配列2の各行を読み込む この中でキーマッチングを行い、合致した場合、 セル値を比較した上で差分ありだと上書き、としています。 まずは上記レベルの記載で何かご指摘ありましたら 指南頂けますと助かります。 |
[194605] Re[1]: マクロで2シートのセル値を比較した時に空白値がスルーされる- ■記事引用/メール受信=OFF■ □投稿者/ kazuo -(2022/01/13(09:46)) □U R L/ とりあえず差分があろうがなかろうが上書きしてみて下さい。 Sub test() Dim 比較元 As Range, 比較先 As Range Dim 比較元列 As String, 比較先列 As String Dim 比較元キー As String, 比較先キー As String Dim 元(), 先() Dim r As Range, r2 As Range Dim i As Long Set 比較元 = Worksheets(1).Range("A1:AA1000") 'A1基準で書いています Set 比較先 = Worksheets(2).Range("A1:J500") ' 比較元列 = "B,C,Z,AA" '下記列と対のこと 比較先列 = "D,F,G,J" ' 比較元キー列 = "A" 比較先キー列 = "A" ReDim 元(UBound(Split(比較元列, ","))) ReDim 先(UBound(元)) For i = 0 To UBound(元) 元(i) = 比較元.Columns(Split(比較元列, ",")(i)).Value '元データを配列に 先(i) = 比較先.Columns(Split(比較先列, ",")(i)).Value '先データを配列に Next For Each r In 比較元.Columns(比較元キー列).Cells 'キー検索 Set r2 = 比較先.Columns(比較先キー列).Find(r.Value, , xlValues, xlWhole) If Not r2 Is Nothing Then For i = 0 To UBound(元) 先(i)(r2.Row, 1) = 元(i)(r.Row, 1) '無条件に配列データ移行 Next End If Next For i = 0 To UBound(先) 比較先.Columns(Split(比較先列, ",")(i)).Value = 先(i) '対象列を無条件に書き込み Next End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[194606] Re[2]: マクロで2シートのセル値を比較した時に空白値がスルーされる- ■記事引用/メール受信=OFF■ □投稿者/ かずやん -(2022/01/13(14:37)) □U R L/ 早速ありがとうございます。 簡易的に試したところ、バッチリでした。 表現足りていなくて恐縮ですが、比較列が 実は1列(記載例ですとそれぞれA列)ではなく、 3列ございます。 このときの参考構文ご教示頂けますと、大変助かります。 |
[194607] Re[3]: マクロで2シートのセル値を比較した時に空白値がスルーされる- ■記事引用/メール受信=OFF■ □投稿者/ kazuo -(2022/01/14(08:07)) □U R L/ ところで >とりあえず差分があろうがなかろうが上書きしてみて下さい は実施されたのでしょうか?そして結果はどうだったのでしょうか? かずやんさんはご自身で作られたプログラムを完成させたく有りませんか? Sub test() Dim 比較元 As Range, 比較先 As Range Dim 比較元列 As String, 比較先列 As String Dim 比較元キー列() As String, 比較先キー列() As String Dim 元(), 先() Dim 作業列 As Range, r2 As Range Dim i As Long, j As Long Set 比較元 = Worksheets(1).Range("A1:AA1000") 'A1基準で書いています Set 比較先 = Worksheets(2).Range("A1:J500") ' 比較元列 = "B,C,Z,AA" '下記列と対のこと 比較先列 = "D,F,G,J" ' 比較元キー列 = Split("A,D,F", ",") '下記列と対のこと 比較先キー列 = Split("A,B,C", ",") ' Set 作業列 = 比較先.Columns("A").Offset(, 比較先.Worksheet.UsedRange.Columns.Count) Application.ScreenUpdating = False 作業列.Formula = "=" & 比較先キー列(0) & "1&"",""&" & 比較先キー列(1) & "1&"",""&" & 比較先キー列(2) & "1" ReDim 元(UBound(Split(比較元列, ","))) ReDim 先(UBound(元)) For i = 0 To UBound(元) 元(i) = 比較元.Columns(Split(比較元列, ",")(i)).Value '元データを配列に 先(i) = 比較先.Columns(Split(比較先列, ",")(i)).Value '先データを配列に Next For j = 2 To 比較元.Rows.Count 'キー検索(注:1行目は項目行と見なし、除外してました) Set r2 = 作業列.Find(比較元.Cells(j, 比較元キー列(0)).Value2 & "," & _ 比較元.Cells(j, 比較元キー列(1)).Value2 & "," & _ 比較元.Cells(j, 比較元キー列(2)).Value2, , xlValues, xlWhole) If Not r2 Is Nothing Then For i = 0 To UBound(元) 先(i)(r2.Row, 1) = 元(i)(j, 1) '無条件に配列データ移行 Next End If Next For i = 0 To UBound(先) 比較先.Columns(Split(比較先列, ",")(i)).Value = 先(i) '対象列を無条件に書き込み Next 作業列.ClearContents '作業列をクリアし、 Set r2 = 作業列.Worksheet.UsedRange '未使用に戻す Application.ScreenUpdating = True End Sub この記事にはVBAのコードが含まれています。 緑の太文字→注釈 茶色の太文字→条件分岐 赤の太文字→ループ 青の太文字→その他 |
[194613] Re[4]: マクロで2シートのセル値を比較した時に空白値がスルーされる- ■ / 記事引用/メール受信=OFF■ □投稿者/ かずやん -(2022/01/14(22:39)) □U R L/ 度々ありがとうございます。 記載頂いたソースについてこちらの環境に 組み込んだところ、無事に稼働、完成いたしました! 取り急ぎ稼働優先いたしましたが、 記載頂いたソースの組み立て方などは 別途改めて勉強させていただきます。 この度は大変助かりました。 また困り事ありましたらぜひにと思います。 |
このトピックに書きこむ |
---|