質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

864閲覧

〖VBA〗マクロを使用してシート間の検索をして一致しない場合、背景に色付けをしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/11/07 22:03

前提・実現したいこと

前回質問した内容とほぼ同一ですが、再度教えていただける方がいましたらお願い致します。

Sheet1、Sheet2があり
Sheet1のE列に記載されている会員番号を検索値とし
Sheet2のA列に記載されている会員番号を検索し一致しない場合に
Sheet1のE列の該当セルの背景色のみ変更したい。

発生している問題・エラーメッセージ

エラーはないですが背景色がつくセルが異なったりします。

該当のソースコード

Sub 会員以外の回答者() Dim x As Long Dim i As Long With Sheets("Sheet2") x = .UsedRange.Cells(.UsedRange.Count).Row For i = x To 2 Step -1 If Sheets("Sheet1").Range("E:E").Find(What:=.Cells(i, 1)) Is Nothing Then '一致しない場合 .Cells(i, 5).Interior.Color = RGB(0, 0, 255) 'E列の背景を青色に End If Next i End With End Sub

補足情報(FW/ツールのバージョンなど)

Office 2019を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問文のやりたいことをまとめると

検索値 Sheet1のE列の値
検索範囲 Sheet2のA列
一致しない場合に背景色を変更するセル Sheet1のE列の該当セル

コードでは下記のようになってます。

検索値 Sheet2のA列の値
検索範囲 Sheet1のE列
一致しない場合に背景色を変更するセル Sheet2のE列の該当セル

シートが両者で逆になってますが、どちらがやりたいことですか。

Findの書式は下記だということを理解してますか。

検索範囲.Find(What:=検索値)

投稿2020/11/08 00:17

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

日本語で書いてあることを信用するとして、こういうことですか?

VBA

1Sub 会員以外の回答者() 2 Dim x As Long 3 Dim i As Long 4 5 With Sheets("Sheet1") 6 x = .UsedRange.Cells(.UsedRange.Count).Row 7 .Range("E2:E" & x).Interior.Pattern = xlNone 8 For i = x To 2 Step -1 9 If Sheets("Sheet2").Range("A:A").Find(What:=.Cells(i, 5), LookAt:=xlWhole) Is Nothing Then '一致しない場合 10 .Cells(i, 5).Interior.Color = RGB(0, 0, 255) 'E列の背景を青色に 11 End If 12 Next i 13 End With 14End Sub 15

Sheet1
Sheet2

VBA

1Sub 回答者の重複は色付け() 2 Dim i As Long, j As Long, x As Long 3 4 With Sheets("Sheet1") 5 x = .Cells(Rows.Count, 5).End(xlUp).Row 'Sheet1 E列最大行 6 .Range("E2:E" & x).Interior.Pattern = xlNone 7 For i = x To 2 Step -1 '最終行から2行目まで 8 For j = i - 1 To 2 Step -1 'iの前のから2行目まで 9 If Cells(i, 5) = Cells(j, 5) Then 10 Cells(i, 5).Interior.Color = RGB(255, 0, 0) 'E列の該当セルは背景を赤色 11 Exit For 12 End If 13 Next j 14 Next i 15 16 End With 17End Sub 18 19

ちなみに、キー(社員番号等)の重複チェックをするような場合は、Scripting.Dictionaryを使うと
簡単にかつ高速に処理が行えます。
上のマクロは2重のfor文なので、行数が10000行程度になると劇的に遅くなります。
Scripting.Dictionaryを使った場合は、1重のfor文で済むので、それほど遅くなりません。
10000行以上で試してみると違いが体感できるかと。

VBA

1'Scripting.Dictionary版 2Sub 回答者の重複は色付け2() 3 Dim sh1 As Worksheet 4 Dim maxrow As Long 5 Dim wrow As Long 6 Dim dicT As Object 7 Dim key As String 8 Set dicT = CreateObject("Scripting.Dictionary") 9 Set sh1 = Worksheets("Sheet1") 10 maxrow = sh1.Cells(Rows.Count, "E").End(xlUp).row 'Sheet1 E列最大行 11 sh1.Range("E2:E" & maxrow).Interior.Pattern = xlNone 12 For wrow = 2 To maxrow 13 key = sh1.Cells(wrow, "E").Value 14 If dicT.exists(key) = False Then 15 dicT(key) = True 16 Else 17 Cells(wrow, "E").Interior.Color = RGB(255, 0, 0) 'E列の該当セルは背景を赤色 18 End If 19 Next 20End Sub 21

投稿2020/11/08 03:16

編集2020/11/08 13:32
tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/08 11:28 編集

ご回答ありがとうございます。 いただいた内容で問題なく対応できました。ありがとうございます。 大変恐縮ですが、もう1点伺いたいです。 先程の処理をするのと同時に、Sheet1のE列で同じ会員番号がいないか重複チェックを行いたいです。 下記コードですと実行結果に反映されないのですが、原因わかりますでしょうか。 ``` Sub 回答者の重複は色付け() Dim i As Long, j As Long With Sheets("Sheet1") x = .UsedRange.Cells(.UsedRange.Count).Row '最終行を取得 For i = x To 2 Step -1 '下から2行目まで For j = i + 1 To 1000 If Cells(i, 5) = Cells(j, 5) Then Cells(i, 5).Interior.Color = RGB(255, 0, 0) 'E列の該当セルは背景を赤色 Exit For End If Next j Next i End With End Sub ```
tatsu99

2020/11/08 11:40

回答に追記しました。
退会済みユーザー

退会済みユーザー

2020/11/08 15:26

ご丁寧にありがとうございます。 実行したい事ができ大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問