プロが教えるわが家の防犯対策術!

VBAで行き詰っています。

下記基本データがあります。
Sheet1に存在しないSheet2の文字列を赤字にしたいです。
FINDを使って不一致の場合、そのセルを赤字にするという処理をFOR~NEXTで繰り返して
行くのかなと考えているのですが、どのようにすれば良いかご教授頂けないでしょうか。

Sheet1
H列4行目~最終列4行目まで不特定の文字列が入力されている。

Sheet2
B列1行目~最終列1行目まで不特定の文字列が入力されている。

質問者からの補足コメント

  • 変更してみたのですがエラーでした。
    何か間違っているでしょうか?

    With Sheets("Sheet2")
    For i = 2 To lastColLO
    If Not WorksheetFunction.CountIf(Sheets("Sheet1").Range("H4", Cells(lastColBU, "H")), .Cells(1, i).Value) > 0 Then
    .Cells(1, i).Font.ColorIndex = 3
    End If
    Next
    End With

    No.3の回答に寄せられた補足コメントです。 補足日時:2020/03/06 13:38

A 回答 (4件)

コード、ありがとうございます。


If Not WorksheetFunction.CountIf も 
If .Cells(1, i).Value <> Sheets("Sheet1").Range("H4", Cells(4, lastColBU)).Find(What:=.Cells(1, i).Value, LookAt:=xlWhole).Row Then Cells(1, i).Font.ColorIndex = 3

If Not WorksheetFunction.CountIf(Sheets("Sheet1").Range("H4",   Cells(lastColBU,    "H")) このCellsにはシートを明示します。

こんな感じIf Not WorksheetFunction.CountIf(Sheets("Sheet1").Range("H4", Sheets("Sheet1").Cells(lastColBU, "H")), .Cells(1, i).Value) > 0 Then

下記のIf .Cells(1, i).Value <> Sheets("Sheet1").Range("H4", Cells(4, lastColBU)).Find(What:=.Cells(1, i).Value, LookAt:=xlWhole).Row Then Cells(1, i).Font.ColorIndex = 3
Findに関しては、 あるかどうかを確かめる場合
If Range(Sheets("Sheet1").Range("H4"), Sheets("Sheet1").Cells(4, lastColBU)).Find(.Cells(1, i).Value, LookAt:=xlWhole) Is Nothing Then .Cells(1, i).Font.ColorIndex = 3
こんな感じです

#3のサンプル(For Eachの場合)

Option Explicit
Sub sample()
Dim r As Range, trgRange As Range
Dim lastColBU As Long: lastColBU = Sheets(1).Cells(4, Columns.Count).End(xlToLeft).Column
Dim lastColLO As Long: lastColLO = Sheets(2).Cells(1, Columns.Count).End(xlToLeft).Column
  Set trgRange = Range(Sheets(1).Cells(4, 8), Sheets(1).Cells(4, lastColBU))
  With Sheets(2)
    For Each r In Range(.Cells(1, 2), .Cells(1, lastColLO))
      If WorksheetFunction.CountIf(trgRange, r.Value) = 0 Then r.Font.ColorIndex = 3
    Next
  End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
ご教授の内容で処理が出来そうです。
大変助かりました。

お礼日時:2020/03/06 16:13

VBAの場合、行き詰っているところまでのコードを示したり、


試してダメな事を具体的に掲示するようにした方が、あなたの為にも良い事だと思います。
考えて作ったコードを否定したり非難されているように読める回答、アドバイスもあるかも知れませんが
そんな事は、気にする必要はありません。文章だときつく感じる事もありますが、
おそらく的を得たアドバイスでしょう。どんな天才、秀才でも初めはありますし、知らないから質問しているのですから
出来るだけコードを示し、やりたい事、不具合などを加えましょう。

本題
値があるか無いかを判断するだけなら、WorksheetFunction.CountIf で良いと思います。
>Sheet1に存在しない
なので、Sheet2の設定範囲をFOR~NEXTで繰り返し、Sheet1の設定範囲に値がなければ 
.Font.Color = RGB(255,0,0)や.Font.ColorIndex = 3 でフォント色を設定すればOK

FOR~NEXTに関しては、For Each Range変数 In Range範囲 が良いと思います。
 
範囲は例えば、Sheets(2).Range(Cells(1, 2), Cells(1, 最終列))

最終列に関しては、例:シートインデックス2の1行目最終行番号
Sheets(2).Cells(1, Columns.Count).End(xlToLeft).Column で取得できます。

WorksheetFunction.CountIfは、条件で
If Not WorksheetFunction.CountIf(シート1の範囲, Range変数.Value) > 0 Then ’Notをなくし=0でも同じ(無いと言う意味)

For内 をRange変数で取得していれば、
Range変数.Font.ColorIndex = 3  '.Font.Color = RGB(255, 0, 0) で色の付け処理

10行前後のプロシージャなので、上手く組み立ててくださいね。
この回答への補足あり
    • good
    • 1
この回答へのお礼

VBA初心者で申し訳ございません。
今、下記のように実施しようとしていました。
lastColLOはSheet2の最終列
lastColBUはSheet1の最終列がそれぞれ格納されています。

With Sheets("Sheet2")
For i = 2 To lastColLO
If .Cells(1, i).Value <> Sheets("Sheet1").Range("H4", Cells(4, lastColBU)).Find(What:=.Cells(1, i).Value, LookAt:=xlWhole).Row Then Cells(1, i).Font.ColorIndex = 3
Next
End With

WorksheetFunction.CountIfは使ったことないので調べながら試してみます。

お礼日時:2020/03/06 13:29

見つからなかったと言う事でFindメソッドを使うのはどうなのかな?


通常見つかった場合にそのセルに対して何かをしたいって時に使うと私は思ってます。

単にSheet1に存在するかしないかだけならCOUNTIF関数でも良いのではないかと。
あとは完全一致かあいまい検索かにもよるでしょうけど。
    • good
    • 0
この回答へのお礼

VBA初心者で申し訳ございません。
今、下記のように実施しようとしていました。
lastColLOはSheet2の最終列
lastColBUはSheet1の最終列がそれぞれ格納されています。

With Sheets("Sheet2")
For i = 2 To lastColLO
If .Cells(1, i).Value <> Sheets("Sheet1").Range("H4", Cells(4, lastColBU)).Find(What:=.Cells(1, i).Value, LookAt:=xlWhole).Row Then Cells(1, i).Font.ColorIndex = 3
Next
End With

お礼日時:2020/03/06 13:26

まず、どこまでできてんの?

    • good
    • 0
この回答へのお礼

VBA初心者で申し訳ございません。
今、下記のように実施しようとしていました。
lastColLOはSheet2の最終列
lastColBUはSheet1の最終列がそれぞれ格納されています。

With Sheets("Sheet2")
For i = 2 To lastColLO
If .Cells(1, i).Value <> Sheets("Sheet1").Range("H4", Cells(4, lastColBU)).Find(What:=.Cells(1, i).Value, LookAt:=xlWhole).Row Then Cells(1, i).Font.ColorIndex = 3
Next
End With

お礼日時:2020/03/06 13:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!