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

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

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

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

4回答

5016閲覧

VBAで色付きセルを条件にメッセージBOXを出したい。

tyano

総合スコア11

VBA

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2019/06/02 07:45

前提・実現したいこと

B4~D8にA~Cが入力された表があるとします。
表内の1行に2個以上同じ文字が入力されたら赤いセルになるよう、条件書式を入れています。

表に赤いセルが出現したタイミングで「名前が重複しています」というメッセージBOXを表示させたいです。

イメージ説明

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

VBA初心者で、添付写真のように見よう見まねで書いてみたのですが、上手くいきません。 ご教授いただければ幸いです。

該当のソースコード

Sub 重複確認() If Range("B4:D8").Interior.Color = RGB(255, 0, 0) Then AnswerNo = MsgBox("名前が重複しています", vbCritical) End If End Sub

試したこと

ネットで調べてみてもIF文で値をみて条件を出している記事は見るのですが、
色で条件をだしている記事を見かけなくて困っています。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答4

0

こんな感じで、
DisplayFormat プロパティ
を使います。

Excel

1Sub test() 2 Dim c As Range 3 4 For Each c In Range("B4:D8") 5 If c.DisplayFormat.Interior.Color = vbRed Then 6 MsgBox "重複があります。: " & c.Address(False, False) 7 Exit Sub 8 End If 9 Next 10End Sub

参考>>
条件付き書式で変更された書式を取得する

追記>>
セルに入力した時にチェックするなら、色がどうのとか関係ないですよね?

ExcelVBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 Dim rngEventArea As Range: Set rngEventArea = Me.Range("B4:D8") 3 4 If Target.CountLarge > 1 Then Exit Sub 5 Set Target = Intersect(Target, rngEventArea) 6 If Target Is Nothing Then Exit Sub 7 Set rngEventArea = Intersect(Target.EntireRow, rngEventArea) 8 9 If WorksheetFunction.CountIf(rngEventArea.Cells, Target.Value) > 1 Then 10 MsgBox "既に同じ値を入力済みです。", vbExclamation 11 Application.Undo 12 End If 13End Sub

あぁ、やってみてないけど、同じことがマクロなしでも、入力規則の機能でできるのでは?と思います。
マクロなしで出来るならマクロなしの方が、「元に戻す」がクリアされないので、
そちらの方がより良いかと思います。

投稿2019/06/02 08:27

編集2019/06/03 06:54
mattuwan

総合スコア2136

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

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

tyano

2019/06/02 11:45

早期にご回答いただき、ありがとうございます! DisplayFormat プロパティ!また知らない文が出てきてしまいました 笑 VBAの道は長く、険しいですね・・・。 ご提示いただいた文で確かにメッセージBOXを出せました! が、セルが赤くなったタイミングではなく、赤い状態でマクロを行った条件ででした。 難しいです。。。
Akashic

2019/06/02 12:26

負荷が高くなるのでお勧めはしませんが、VBAのコードを書いている上のところにリストが2つあり、WorkSheet , Change を選ぶと、関数が自動で作られます。(Private Sub Worksheet_Change(ByVal Target As Range)) この中に処理を書けば、マクロ実行時にではなく、ワークシートに変更があったときに実行されます。 https://www.moug.net/tech/exvba/0050131.html
tyano

2019/06/02 12:44

調べてみたら、イベントプロシージャ?という名前らしいですね。 上2つのリストは全然気にもかけていなかったので、勉強になりました! お忙しいところご回答いただき、ありがとうございます!
hatena19

2019/06/03 01:22

イベントプロシージャを使いこなせるようになるのが、VBA上級者へのステップですね。
guest

0

ベストアンサー

既に、回答がついていて、重複する部分もありますが、

表に赤いセルが出現したタイミングで「名前が重複しています」というメッセージBOXを表示させたいです。

「表に赤いセルが出現したタイミング」となると、Worksheet_Change を使うことになりますね。

vba

1Private Sub Worksheet_Change(ByVal Target As Range) 2 Dim rng As Range 3 Set rng = Intersect(Target, Range("B4:D8")) 4 If rng Is Nothing Then Exit Sub 5 6 Dim c As Range 7 For Each c In rng.Cells 8 If c.DisplayFormat.Interior.Color = vbRed Then 9 MsgBox "名前が重複しています", vbCritical 10 Exit For 11 End If 12 Next 13End Sub

投稿2019/06/02 08:41

hatena19

総合スコア33715

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

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

tyano

2019/06/02 11:38

早期にご回答いただき、ありがとうございます! 試してみたのですが、緑の▶ボタン(ユーザーフォームの実行?)を押しても名前が無く、 マクロを実行することが出来ませんでした・・・。
tyano

2019/06/02 12:40

ユーザーフォームの実行は不要なんですね! そのままシートのマクロに記入したらいけました! お忙しいところありがとうございます!
guest

0

事前に条件書式を入れなくても確認できる方法です。
試してみてください

VBA

1Sub JufukuKakunin() 2 Dim i As Long, j As Long 3 For i = 4 To 8 4 For j = 2 To 4 5 If Application.WorksheetFunction.CountIf(Range(Cells(i, 2), Cells(i, 4)), Cells(i, j)) > 1 Then 6 Cells(i, j).Select 7 Cells(i, j).Interior.ColorIndex = 3 8 MsgBox "重複があります。" 9 Exit Sub 10 Else 11 Cells(i, j).Interior.ColorIndex = 0 12 End If 13 Next j 14 Next i 15End Sub

<別解を追記>
行単位の重複を調査したい範囲で一度に確認する場合の記載は以下となります。

VBA

1Sub JufukuKakunin2() 2 Dim i As Long, j As Long 3 Dim bF As Boolean 4 For i = 4 To 8 5 For j = 2 To 4 6 If Application.WorksheetFunction.CountIf(Range(Cells(i, 2), Cells(i, 4)), Cells(i, j)) > 1 Then 7 Cells(i, j).Interior.ColorIndex = 3 8 bF = True 9 Else 10 Cells(i, j).Interior.ColorIndex = 0 11 End If 12 Next j 13 Next i 14 If bF Then 15 MsgBox "名前が重複している箇所を赤字にしました。" 16 End If 17End Sub

投稿2019/06/02 08:19

編集2019/06/02 12:10
TanakaHiroaki

総合スコア1063

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

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

tyano

2019/06/02 11:49

早期にご回答いただき、ありがとうございます! 条件書式をVBAで行うことも出来るなんで凄すぎます! 確かに最初の表の状態であれば赤くなりましたが、複数の行で文字が被っている場合は 最初の行のみが赤くなり、2行目以降は白色セルのままになってしまいました。。。
TanakaHiroaki

2019/06/02 11:54

このマクロは、上から1行ずつ左列から右列に確認していき、最初に文字の重複が見つかったセルを赤くして終了するようにしています。 いろんなやり方がありますので、目的に合うよう修正してみてください。
TanakaHiroaki

2019/06/02 12:17

別解を追記しましたので、試してみてください。 条件書式を用いることが必須でなければ、この方法がシンプルに実現できると思います。
tyano

2019/06/02 12:42

別解の追記もありがとうございます! 条件書式、入力規制、VBAと色々な方法があることがわかりました! まだまだVBAは全然わかりませんが、慣れるように勉強します。 ありがとうございました!
guest

0

色で判定しなくても、条件付き書式の条件(色を付けている条件)で判定するで良いのではないでしょうか?

投稿2019/06/02 07:51

Akashic

総合スコア298

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

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

tyano

2019/06/02 07:54

確かに、色がつけばそれはそれでわかるのですが、勉強の一環として、 色でメッセージBOXを出せるのか気になっております。
Akashic

2019/06/02 08:02

なるほど、そういうことですね。 色でメッセージ自体は、記載のコードで判断できています。 メッセージがでないのは、Range("B4:D8")の部分が原因で、Range("B4:D8")だとその部分全て(15セル)が赤じゃないとif条件がTrueになりません。 画像の状態だと、Range("B4:C4")にするとメッセージが出ると思います。
tyano

2019/06/02 11:40

早期にご回答いただき、ありがとうございます! なるほど!だからメッセージが出なかったんですね! その中のどれかが、となるとこのIF文では難しいですね・・・。
hatena19

2019/06/03 01:26

セル範囲を絞ったとしても、Interior.Color では条件付き書式で変化した色は取得できません。 DisplayFormat.Interior.Color でないと。 すでに回答に出てますが、念のために。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問