VBAで条件付き書式の文字色を変更する方法

このQ&Aのポイント
  • VBAを使用してセルの条件付き書式に基づいて文字色を変更する方法を学びます。
  • 質問者は、条件付き書式で変化した文字色を認識せずに作動しないと述べています。
  • 質問者はどの部分を修正すれば良いかを尋ねています。
回答を見る
  • ベストアンサー

VBAで条件付き書式の文字色

下記のコードを、条件付き書式で変化した文字色によって作動させたいのですが、変化した赤字を認識せずに作動しません。 どこを修正したら良いでしょうか? Private Sub CommandButton1_Click() Dim cell As Range For Each cell In Range("L28,P28,T28,X28,AB28,AF28,AJ28,AN28,AV30,BC30,BG30,BK30,BO30,BS30,CE28") If cell.Font.ColorIndex = 3 Then ' 赤文字の場合 ユーザフォーム1.Show ' ユーザフォーム1を表示する Exit Sub End If Next cell Range("CI28").Value = "ok" ' セル"CI28"に"ok"を入力する End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kon555
  • ベストアンサー率52% (1750/3357)
回答No.1

 条件付き書式の場合はDisplayFormatを使います。今のコード「If cell.Font.ColorIndex = 3 Then」だと通常の文字色を識別しているので動作しないのだと思います。  参考ページ『条件付き書式の「文字色」を取得』 https://daitaideit.com/vba-displayformat/#mokuzi1-3

kubotaman
質問者

お礼

ありがとうございます! If cell.DisplayFormat.Font.ColorIndex = 3 Then これでいけました!

その他の回答 (2)

  • NuboChan
  • ベストアンサー率47% (745/1583)
回答No.3

横から失礼します。 私のexcelのverは、excel2021ですが、 以下の条件付き書式では、「If cell.Font.ColorIndex = 3 Then」で動作しています。 Option Explicit Sub test() Dim cell As Range For Each cell In Range("A:A") If cell.Font.ColorIndex = 3 Then MsgBox "cells = " & cell.Address End If Next End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問するなら (1)どういう意図・目的でしたことなのかを文章で説明すべきではないか。 (2)エクセルやVBAのどういう仕組みを使ったのか。 あるセルの条件付き書式を変えたことをイベントとして、捉えることは、 エクセル(VBA)に設けられていないのではないか。 「ない」とか「できない」と言えるのは、相当詳しくないと言えないので、小生は資格がないかもしれないが。 (APIやクラスを使う方法はあるとしても、除外するとして)。 ー だから条件付き書式の条件が、特定のセルの値(が特定値より大になった)などの関連なら、 (1)セルの値の変化のイベントを捉え、 (2)セルの番地が、該当するかどうかを調べ (3)条件値に該当するかどうかを調べ(値の大小条件と仮定して) (4)本件では、文字色が赤色以外かどうかを調べる (5⦆何か思うことをする るということになるのかな。 ーー 人間に、該当するかどうかの判断をさせて、特定のボタンを押すなどの手もあると思うが、どうかと思う。 ーー 小生の勝手な仮定で、D1,E2、F3セルに注目する場合で、 値が20を超える場合に文字色を赤と設定している場合、変化を捉えるのは、 そのシートモジュールに Private Sub Worksheet_Change(ByVal Target As Range) Set Rng = Union(Range("D1"), Range("E2"), Range("F3")) If Not Intersect(Target, Rng) Is Nothing Then 'MsgBox "該当セルが変化しました" If Target > 20 Then MsgBox "セルの文字色が変化しました" MsgBox "或る処理をします" End If End If End Sub

関連するQ&A

  • エクセル VBA Worksheet_Changeとコピー&ペースト

    いつも皆様には大変お世話になっております。 早速の質問ですが Worksheet_Changeを使ってマクロを組んでいるのと フォームを使ってマクロを組んでいます フォームのほうからのマクロで Sheet1のセルをコピーしてSheet2のセルに貼り付けをしたいのですが、 貼り付けができません。 フォームのほうからのマクロじゃなく手動でコピー&ペーストも利きません。コピーはできるのですがSheet2に変えたところ貼り付けができなくなってしまいます。 Worksheet_Changeのマクロを消すと動きました。どうにかならないでしょうか? ちなみにWorksheet_Changeの中のマクロは Private Sub Worksheet_Change(ByVal Target As Range) If Range("J48") = Range("J68") Then Range("J48").Interior.ColorIndex = xlColorIndexNone Else Range("j48").Interior.ColorIndex = 26 End If If Range("V48") = Range("V68") Then Range("V48").Interior.ColorIndex = xlColorIndexNone Else Range("V48").Interior.ColorIndex = 26 End If End Sub となっています。 何かいい解決法がありましたらご教授のほどよろしくお願いいたします。

  • エクセルVBAでクリックしたセルのみ書式を変えたいのです。

    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Row <= 11 And Target.Column <= 11 Then With Selection .Interior.ColorIndex = 3 .Font.ColorIndex = 2 .Font.Bold = True End With End If End Sub これで出来るのですが、問題は別のセルに移動しても書式は変ったままなのです。(当り前ですが) 書式を変えるのはあくまで選択されている間だけにしたいのです。 どのようにすればよいのでしょうか? エクセル97です。

  • エクセルVBA 双方向での書式のリンク方法

    エクセルVBAにて双方向での書式のリンクをさせたいと考えています。 具体的にはセルの背景色の双方向リンク方法について教えていただきたいです。ここで双方向での背景色のリンクとは別々のシート上のセルの背景色をどちら側の変更であっても、もう一方に変更を反映させることです。 【シート1】 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet2").Range("$A$1").Value = Sheets("Sheet1").Range("$A$1").Value Sheets("Sheet2").Range("$A$1").Interior.ColorIndex = Sheets("Sheet1").Range("$A$1").Interior.ColorIndex End If End Sub 【シート2】 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("Sheet1").Range("$A$1").Value = Sheets("Sheet2").Range("$A$1").Value Sheets("Sheet1").Range("$A$1").Interior.ColorIndex = Sheets("Sheet2").Range("$A$1").Interior.ColorIndex End If End Sub 上記のコードを記述しています。値のリンクはできているのですが背景色のリンクがどうしてもうまくできません。どちらかの変更と同時にもう一方の背景色も変更されるようにするにはどうすればよいでしょうか? どんな方法でもかまいませんのでお詳しい方よろしくお願いします。

  • マクロでの条件付書式について

    私は、下記のようなO列の値を変更するとそれに伴ってセルの色が変化するマクロを作成しました。 下記の通りで、色は変わるのですが、 (1)セルO8をコピー (2)セルO9:O10を範囲選択 (3)貼り付け とすると 「型が一致しません」 というエラーがでてしまいます。 いろいろと調べたのですが、原因が分かりませんでした。 マクロに関しては、初心者で初歩的な事かも知れないのですがご教授お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("O8:O5000")) Is Nothing Then Exit Sub Select Case Target.Value Case Is = "連絡待ち" Target.Interior.ColorIndex = xlNone Case Is = "取引連絡中" Target.Interior.ColorIndex = 23 Case Is = "取置き" Target.Interior.ColorIndex = 3 Case Is = "入金連絡あり" Target.Interior.ColorIndex = 4 Case Is = "発送準備中" Target.Interior.ColorIndex = 7 Case Is = "発送待ち" Target.Interior.ColorIndex = 17 Case Is = "発送済み" Target.Interior.ColorIndex = 16 Case Else Target.Interior.ColorIndex = xlNone End Select End Sub

  • VBA スタック容量が足りない・・・

    こんばんわ! エクセルのVBAを使った管理システムを作ろうと思うのですが、色々考えて下記のような状態にしてみたのですが、ユーザーフォームをモードレスにするとスタック容量が足りなくなります。 Sub aaa_date() If Range("a1") = 1 Then bbb_date.Show ElseIf Range("a1") = 2 Then ccc_date.Show ElseIf Range("a1") = 3 Then ddd_date.Show End If Call aaa_date End Sub bbb_date(ユーザーフォーム)に↓ Private Sub CommandButton1_Click() Range("a1") = 2 Unload Me End Sub Private Sub CommandButton2_Click() Range("a1") = 3 Unload Me End Sub ccc_date(ユーザーフォーム)に↓ Private Sub CommandButton1_Click() Range("a1") = 1 Unload Me End Sub Private Sub CommandButton2_Click() Range("a1") = 3 Unload Me End Sub ddd_date(ユーザーフォーム)に↓ Private Sub CommandButton1_Click() Range("a1") = 1 Unload Me End Sub Private Sub CommandButton2_Click() Range("a1") = 2 Unload Me End Sub ※bbb_dateとccc_dateとddd_dateはそれぞれにあるボタンを押すとA7セルの値を変更するようにして、aaa_dateでどのフォームを表示するのかを選択しています。 ※実際にはもっと沢山ユーザーフォームがあります。 上記の状態では動作するのですが、エクセルの表に値を入力したいので、bbb_dateとccc_datとddd_datをvbModeless(モードレス状態)にすると、スタック容量が足りませんと出ます。 別のやり方でもよいですので、ユーザーフォームを切り替える良い方法があったらお願いします。

  • エクセルVBAの記述法(Worksheet_Changeで)

    入力があればセルが黄色のなり、入力がなければ無色とするマクロです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Value <> "" Then Target.Interior.ColorIndex = 6 Else Target.Interior.ColorIndex = xlNone End If End Sub このように書くと、通常は正しく動きますが、ドラッグした場合や、複数セルを一度にクリアした場合、エラーになってしまいます。 ただしく作動させるにはどう直せばいいのでしょうか?

  • excel vba 遅延のソースゴード

    excel vba で動作させたものを動作の遅延をさせたいのですが、本コーナーで教えて頂いた下記の コードをどの様に使えばいいのでしょうか。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Sample()   Range("A1") = 0   For i = 1 To 10     Sleep 500 '500msec(0.5秒)待機     Range("A1") = i   Next i End Sub ーーーーーーーーーーーーーーーーーー (bf38:bn38)を赤  (bo38:by38)を緑にします。この動作を赤から緑になるまでに少し遅延させたいのです。mt2008さんに教えて頂きましたが解決できませんでした。継続して再質問させていただきたかったのですが、方法がわかりませんでしたので、このような形になりましたお許し下さい。 Range("BF38:Bn38").Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 3 End With Range("Bo38:By38").Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 4 End With End Sub

  • VBAで条件付き書式設定

    エクセルの一覧表で2行目から4行ずつ上から商品名、商品コード、会社、商品項目とあって、列がAからXまであります。 以前、商品名ごとに自動で色づけしていた時に使っていたVBAです。 Sub 色分け() Dim Target As Range For Each Target In Range("b2:e2,b5:e5,b8:e8,b11:e11,b14:e14,b17:e17,b20:e20,b23:e23") Select Case True Case InStr(Target.Value, "〇〇") > 0 Target.Resize(4, 1).Interior.ColorIndex = 24 Case InStr(Target.Value, "△△") > 0 Target.Resize(4, 1).Interior.ColorIndex = 38 Case Else Target.Resize(4, 1).Interior.ColorIndex = xlNone End Select Next End Sub この色付け条件を4行目の商品項目ごとに変更したいのですが、方法が分からないので教えてください。 なんかすぐ出来そうな気がするんですけど、丸2日やっても分かりませんでした。 よろしくお願いします。

  • このVBAソースのどこが間違ってるか教えてください

    Dim csp As Integer 'ストップ Dim css As Integer 'ストップorスタート Sub Quest2() If css = 0 Then css = 1 Quest2a Else cstp = 1 css = 0 End If End Sub Sub Quest2a() Sheets("Sheet1").Select Range("B1:J10").Select Selection.Interior.ColorIndex = x1None Range("a1").Select cstp = 0 Do r = 1: c = 5 For i = 0 To 15 If i < 9 Then Cells(r, c).Interior.ColorIndex = x1None r = r + 1 If i < 5 Then c = c + 1 Else c = c - 1 End If Cells(r, c).Interior.ColorIndex = 3 Else Cells(r, c).Interior.ColorIndex = x1None r = r - 1 If i < 13 Then c = c - 1 Else c = c + 1 End If Cells().Interior.ColorIndex = 3 End If 'タイミング For tm1 = 1 To 1000: For tm2 = 1 To 100: Next If cstp = 1 Then Exit For End If Next DoEvents If cstp = 1 Then Exit For End If If r = 3 And c = 5 Then Cells(r, c).Interior.ColorIndex = x1None End If Next DoEvents If cstp = 1 Then Exit Do End If Loop Cells(10, 9) = Cells(r, c) Cells(10, 9).Interior.ColorIndex = 8 End Sub

  • VBAで2つのプロシージャーをつなげるには

    VBAでSub ~ End Subまで書き終えて、一つのプロシジャーを完成させたあと、 その下に、もう一つのプロシジャーを作り、連続してマクロを動かしたいと思ってます。 例に例えると、 Sub test() Dim MyRange As Range Set MyRange = Columns("c").Find(What:="﨑") If MyRange Is Nothing Then Debug.Print "環境依存文字ははみつかりません" Else MyRange.Font.ColorIndex = 3  End If Dim MyCells As Range Set MyCells = Columns("c").Find(What:="髙") If MyCells Is Nothing Then Debug.Print "環境依存文字ははみつかりません" Else MyCells.Font.ColorIndex = 3 End If End Sub      Sub sample()    Dim i As Long   For i = 1 To Cells(Rows.Count, "I").End(xlUp).Row    If InStr(1, Cells(i, "I"), "VBA", vbTextCompare) > 0 Then   Cells(i, "M") = "YES"   End If   Next   End Sub 上記のような2つのマクロをつなげて1つの実家行えるようにするにはどうしたらよろしいのでしょうか。 どうしても実行時に上のマクロと下のマクロが別々に表示されてしまします。 (ちなみに、上側のマクロは環境依存文字を探すマクロ、下側はVBAの文字を見つけ出すマクロです。) どなたかご存知の方いらっしゃいましたら、教えて頂けないでしょうか。 よろしくお願い致します。

専門家に質問してみよう