戻る  □一般操作のサロン  □ 使用方法  □ 新着記事  □ 新規に質問する!  □ トピック一覧  □ 検索  □ 過去ログ
[ 最新記事及び返信フォームをトピックトップへ ]
このトピック参照回数 :
マクロで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/

      度々ありがとうございます。
      記載頂いたソースについてこちらの環境に
      組み込んだところ、無事に稼働、完成いたしました!
      取り急ぎ稼働優先いたしましたが、
      記載頂いたソースの組み立て方などは
      別途改めて勉強させていただきます。
      この度は大変助かりました。
      また困り事ありましたらぜひにと思います。



このトピック内容の全ページ数 / [0]

このトピックに書きこむ
Name/
E-Mail/

└>このツリーのレス記事をメールで受信しますか? YES/ NO/
Title/
URL/
Comment/ 通常モード->  図表モード-> (←の場合適当に改行を入れて下さい)
タグが使用できます。例 ⇒ <font color="blue">文字</font>
解決!!ありがとうございました! 解決       保留中です・・・ 保留        迷宮入りorほかあたって見ます・・ 迷宮入       すいませ〜ん。誰か〜! Help! ←※回答者専用
解決したらチェック       保留(コードテスト中など・・)         解決不可orレスが全く付かなくてほかのサイトに行くときなど・・
削除キー/
(半角8文字以内) 


- Child Forum -
Edit:ゆう-G