Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
VBA 比較チェックについて
投稿日時: 23/08/21 09:24:06
投稿者: yama1006
メールを送信

 
やりたいこと
 
給与データと勤怠データの比較をして異なるセルがある場合給与データのセルが赤くなるようなコードを組んであります。
 
問題は比較して異なるセルがない場合、エラーになってしまいます。
この場合、どの辺りを修正するべきなのでしょうか。
 
不一致がある場合はセルを赤くするというコードなのでそもそも一致している場合は何も起こらないと思ったのですが、実行時エラー91 オブジェクト変数またはwithブロック変数が設定されていません。と出てしまいます。
 
rng3.Interior.Color = vbRed
 
最後のこちらの部分でエラーが出てしまいます。
 
 
 
Option Explicit
 
Public Sub 比較()
    Sheets("給与データ").Cells.ClearFormats
    Sheets("勤怠データ").Cells.ClearFormats
     
    Dim lastrow As Long
     
    Dim lastcolumn As Long
     
    lastrow = Sheets("勤怠データ").Cells(Rows.Count, 1).End(xlUp).Row
     
    lastcolumn = Sheets("勤怠データ").Cells(6, Columns.Count).End(xlToLeft).column
     
 
    Dim rng1 As Range, rng2 As Range
    Set rng1 = Sheets("勤怠データ").Range("A5", Sheets("勤怠データ").Cells(lastrow, lastcolumn))
     
     
    Set rng2 = Sheets("給与データ").Range("A1").CurrentRegion
     
    Dim ary1() As Variant, ary2() As Variant
    ary1 = rng1.Value
    ary2 = rng2.Value
     
    Dim dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
     
    Dim r As Long, c As Long
    For r = 2 To UBound(ary1) '受入データ 2行目から最終行まで配列に格納
        For c = 3 To UBound(ary1, 2) '受入データ 3列目から最終列まで配列に格納
            dic(ary1(r, 2) & " " & ary1(1, c)) = ary1(r, c) '受入データkey社員番号と受入コードに紐づいた数値をitemとして配列に格納
        Next
    Next
     
    Dim rng3 As Range
    For r = 2 To UBound(ary2)
        For c = 2 To UBound(ary2, 2)
            If dic.Exists(ary2(r, 1) & " " & ary2(1, c)) Then 'dicに格納した社員番号と受入コードが元データと一致しているか
                If dic(ary2(r, 1) & " " & ary2(1, c)) <> ary2(r, c) Then '受入データの配列に格納したデータと元データの数値に不一致があるか
                    If rng3 Is Nothing Then
                        Set rng3 = rng2.Cells(r, c) 'rngが空白の場合エラーになるためunionを使用しない
                    Else
                        Set rng3 = Union(rng3, rng2.Cells(r, c)) '不一致のセルをまとめてrng3に格納
                    End If
                End If
            End If
        Next
    Next
     
    rng3.Interior.Color = vbRed
     
    MsgBox "差分をチェックしました"
     
End Sub

回答
投稿日時: 23/08/21 12:32:34
投稿者: Suzu

引用:
不一致がある場合はセルを赤くするというコードなのでそもそも一致している場合は何も起こらないと思ったのですが、実行時エラー91 オブジェクト変数またはwithブロック変数が設定されていません。と出てしまいます。

 
一致している場合には、rng3 には 1セルも入らないですよね。
その場合にも、
 
rng3.Interior.Color = vbRed
 
は実行されるのではありませんか?
 
Nothing のオブジェクトに対し、強いて言うなら
Nothing.Interior.Color = vbRed
 
とされるのでは?

回答
投稿日時: 23/08/21 17:14:01
投稿者: sk

引用:
比較して異なるセルがない場合、エラーになってしまいます。

引用:
rng3.Interior.Color = vbRed

If Not rng3 Is Nothing Then
    rng3.Interior.Color = vbRed
End If
 
---------------------------------------------------------
 
以上のようになさればよろしいのではないかと。

投稿日時: 23/08/22 21:44:38
投稿者: yama1006
メールを送信

ありがとうございます。解決できました!

投稿日時: 23/08/23 07:14:43
投稿者: yama1006
メールを送信

yama1006 さんの引用:
ありがとうございます。解決できました!