Excelで大量のデータを管理している場合に、特定の文字だけ色を変えて目立たせたい時があります。
例えば、ログ情報などをEXCELで管理している際に「エラー」という文言だけを目立たせたい場合です。
↓以下のような形で色を付けたい
大量にデータが存在していた場合は、1件ずつ対応するのが非常に面倒なので、自動で対応する方法を考えてみました。
セル全体の色を変えたい場合は、置換で対応
「Excel 特定の文字 色」とかで検索すると沢山出てくる方法ですが、置換を使用すると簡単に色付をすることができます。
まず、「CTRL + H」を押下して検索と置換ウィンドウを開きます。
そして、置換後の文字列の「書式」を選択して、色を変更します。この時、置換後の文字列は検索する文字列と同じ値を設定します。
実施すると以下のようになります。セル全体の色が変わってしまいますが、これで要件を満たせる場合は最もお手軽な方法です。
ユーザーが入力した文字に特定の文字があった場合、色を変える
次に、Excelに予め入力されている文字ではなく、ユーザー入力時に文字色を変更する方法を記載します。
例えば入力を禁止したい文字列がある場合に、ユーザーにわかりやすくするために有効です。
この場合は条件付き書式を使用します。
色を変えたいセルを範囲指定している状態で、ホームタブの条件付き書式をクリックします。
新しいルールを選択します。
新しい書式ルールで「数式を使用して、書式設定するセルを決定」を選び、以下の式を入力します。
=COUNTIF(A1,"*エラー*")
※上記式のA1はセルの色を変えたい範囲の左上のセルを選択します。
そして、書式ボタンで色を選択します。すると「エラー」という文言が含まれる行が赤色に変更されます。
これは置換した場合と違い、セルの値が変更されるたびに評価されます。なので前述したとおり、ユーザーの入力値をチェックしたい場合に最適です。
セル全体ではなく文字の色だけを変える
最後に、冒頭に記載した例のようにセルの値全部ではなく、セル内の特定文字の色だけを変更したい場合について記載します。
これは、EXCELの標準機能や関数では対応が難しいためVBAを使用することにしました。
作成したコードが以下となります。
Public Sub setColor()
'検索するキーワード
Const KEYWORD = "エラー"
'色を塗るセルが格納されている列
Const COL_TARGET = 1
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject("VBScript.RegExp")
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
'1行目から使用最終行を対象にする
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_TARGET).End(xlUp).Row
Set regResult = .Execute(ActiveSheet.Cells(i, COL_TARGET))
For j = 0 To regResult.Count - 1
'指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
1行目の値に「エラー」という文言があれば、エラーという文言のみを赤色にしています。(CONSTで定義している部分)
正規表現でマッチさせたものをすべて赤くしているので、下記のように2回文言が出現したら、全て赤色にしています。
はじめまして。
まさにやりたいことの記述が見つかり、非常に助かりました!
ただ、記述をすべて理解できてはおりません・・・。
For j = 0 To regResult.Count – 1
の「-1」は何を意味していますか。
「j=1」ではなく「j=0」から始めるのは、検索ワードが1つもないセルがありうるから、という解釈で正しいでしょうか。
regResultには、セル内で検索ワードがヒットした位置などが格納されるのですが
これを取り出すときに0から始まるというルールだからです。
最初にヒットした位置はregResult(0).FirstIndex
2つ目にヒットした位置はregResult(1).FirstIndex
3つ目にヒットした位置はregResult(2).FirstIndex
こんな感じで一つずつずれます。
ご説明をありがとうございます!
セル内で3つヒットした場合にregResult(2)を指定するには、3-1=2ということですね。
-1のかわりに、-0にしてみたり、1を削除してみたりして試すと、次行でstopしてしまい、正しく書式置換できないならまだしもエラーになるために悩んでおりました。
とても助かりました。
ありがとうございました!
はじめまして。ご質問よろしいでしょうか
検索したいキーワードなのですが
複数のキーワードを設定することはできますでしょうか
もし複数の単語を赤くする記述がございましたらご教授いただけますでしょうか
例えば
B1セルに「エラー」
B2セルに「登録」
B3セルに「正常」
とあり、その複数単語を同時に染めたいのですが
いろいろやってみても、分からず相談しました
上で書いたサンプルを修正するとしたら以下のような感じですね。
|で区切ることによって複数の単語に対応できます。
Public Sub setColor()
‘検索するキーワード
Const KEYWORD = “エラー|登録|正常”
‘色を塗るセルが格納されている列
Const COL_TARGET = 2
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
‘1行目から使用最終行を対象にする
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_TARGET).End(xlUp).Row
Set regResult = .Execute(ActiveSheet.Cells(i, COL_TARGET))
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
2021年11月7日にヒロユキ様が回答されている、複数のキーワード(エラー、登録、正常)をB列に設定する方法を試したところ、キーワードだけでなく別部分も含め赤字となりました。
例:セルに以下文章を入力
エラーが出たので、登録しなおしてみた。
↓
文章最後の「。」以外は全て赤字となる。
あくまで、キーワードのみを色付けさせたいのですが、対処方法はございますでしょうか。
すみません。ご指摘の通り不具合があってキーワードのみ色が変わる動きになっていませんでした。
修正してみました。以下でいかがでしょうか。
希望のことができました
とても勉強になりまし
ありがとうございました
VBA(sub名:setColor)参考にさせていただきました。誠にありがとうございます。
若干、作りをこちらで変更していますので、以下のエラーが該当しない場合は大変失礼致します。
【実行時エラー5017 アプリケーション定義またはオブジェクト定義のエラーです。】
キーワードに 例”(テスト)” ”(”が全角で、”)”が半角の場合で
19行目でエラーが発生してしまいました。
全角と半角を逆にしても同様です。
どちらとも全角、もしくは どちらとも半角ではエラーとなりません。
もし、改善方法があればお教えいただければありがたいです。
よろしくお願い致します。
VBAの正規表現の機能を使っているのですが、正規表現だと「半角括弧の前には円マークをつけなければいけない」ルールがあるので、 “(テスト\)”のようにします。
あと、キーワードが1文字多くなってしまうので、Length:=Len(KEYWORD) – 1)に変えています。
Public Sub setColor()
‘検索するキーワード
Const KEYWORD = “(テスト\)”
‘色を塗るセルが格納されている列
Const COL_TARGET = 1
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
‘1行目から使用最終行を対象にする
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_TARGET).End(xlUp).Row
Set regResult = .Execute(ActiveSheet.Cells(i, COL_TARGET))
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD) – 1).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
他にも正規表現でそのまま使えない文字があり、以下サイトが参考になりました。
https://qiita.com/katsukii/items/1c1550f064b4686c04d4
ヒロユキ様
返信と、解決のコード記載していただき、誠にありがとうございました。
キーワードが正規表現を含むものと、含まないものの混在した複数のキーワード(配列にセットした複数ワード)での操作としている為、今回は、正規表現が含んだ”(“もしくは”)”は除いたキーワードで処理する方法に致しました。
誠にありがとうございました。
ヒロユキ様
はじめまして
探していたものが見つかり、参考にさせていただきました
ありがとうございます
特定のワードを直接入力した場合や関数でそのワードのみを返した場合はしっかりと色付けされるのですが、違うワードと特定のワードを組み合わせたものを関数で返すと、何も色付けされなくなってしまいます。
改善方法等があればお教えいただきたいと思います。
どうぞよろしくお願いします。
たしかに仰るとおりの動きになりましたね。。。
現状、自分の知識だと解決策はなさそうです><
というのも関数で返したものについては
文字色を一部だけ変更することは出来ないらしいです。
OKWAVEの回答に載っていました。
https://okwave.jp/qa/q1899625.html
ご返答、ありがとうございます
そうですか、、
リンク先の説明、とてもよく分かりました
ご教示いただきありがとうございます!!
VBAを使用させていただきました。大変参考になりました。
お示しいただいたVBAは、対象の列が指定してあります。
私の用途では対象の行を指定して文字色を変えたいのです。そのため自力で修正を試みたのですが、初心者のためうまくいきません。
ご教授いただけないでしょうか。
記載したVBAのコードだと、COL_TARGET が何列目を対象にするかを設定しています。
左から2列目を対象にしたいときは「Const COL_TARGET = 1」の部分を「Const COL_TARGET = 2」に変更すればいけると思います。
もし固定した列ではなくて、毎回入力で変更したい場合は以下のような感じですかね
Public Sub setColor()
‘検索するキーワード
Const KEYWORD = “エラー”
COL_TARGET = InputBox(“色を塗る列を指定してください”)
If COL_TARGET = “” Then
‘キャンセルされた
Exit Sub
ElseIf IsNumeric(COL_TARGET) Then
COL_TARGET = CInt(COL_TARGET)
Else
COL_TARGET = Range(COL_TARGET & “1”).column
End If
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
‘1行目から使用最終行を対象にする
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_TARGET).End(xlUp).row
Set regResult = .Execute(ActiveSheet.Cells(i, COL_TARGET))
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
ヒロユキ様、早速ありがとうございます。
私の書き方が不十分でした。申し訳ありません。
私の用途では、ある指定の行のみがが、色付けの対象なのです。
そのため、1行目から使用最終行を対象にするのではなく、1「列」目から使用最終「列」を対象にする方法を求めて色々改変しております。
「対象の行」と書いてくれているのに、勘違いしましたね。。。
行指定だと以下のような感じになると思います。
Public Sub setColor()
‘検索するキーワード
Const KEYWORD = “エラー”
‘色を塗るセルが格納されている行
Const ROW_TARGET = 1
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
‘1列目から使用最終列を対象にする
For i = 1 To ActiveSheet.Cells(ROW_TARGET, Columns.Count).End(xlToLeft).column
Set regResult = .Execute(ActiveSheet.Cells(ROW_TARGET, i))
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
ActiveSheet.Cells(ROW_TARGET, i).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
ありがとうございます。
職場に行って試してみたところ、バッチリできました。
私のものは、‘1列目から使用最終列を対象にする の下に書いているカッコ内のROW_TARGETを下のようにカッコ内の後半に書いていたためうまくいかなかったことが分かりました。
文法の難しさを感じましたが、違いが分かると面白いですね。
本当にありがとうございました。
For i = 1 To ActiveSheet.Cells(Columns.Count ,ROW_TARGET).End(xlToLeft).Column
Set regResult = .Execute(ActiveSheet.Cells(i,ROW_TARGET))
ActiveSheet.Cells(i,ROW_TARGET).Characters(Start:=regResult(j).FirstIndex + 1,
VBAを使用させていただきました。 非常に参考になりました。
また質問なのですが、このVBAは特定の文字(VBA内で指定した文字)となっていますが例えば、B列を指定してB列にあるすべての文字列と一致する、違う列にある文字の色を変えることはできるのでしょうか。
(表現がわかりずらく申し訳ございません。)
大変お手数ですが、ご教授いただけないでしょうか。
B列にキーワードを何個か書いて、それを全て処理させる感じですかね。
それであれば以下でできるかと思います。
コメント欄スペース使えなくしているので見づらいですが…
Public Sub setColor()
‘キーワードが格納されている列(2列目)
Const COL_KEYWORD = 2
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_KEYWORD).End(xlUp).Row
‘検索するキーワード
Dim keyword As String
keyword = ActiveSheet.Cells(i, COL_KEYWORD).Value
Call setColorMain(keyword)
Next i
End Sub
Private Sub setColorMain(keyword As String)
‘色を塗るセルが格納されている列
Const COL_TARGET = 1
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = keyword
.IgnoreCase = True
.Global = True
‘1行目から使用最終行を対象にする
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_TARGET).End(xlUp).Row
Set regResult = .Execute(ActiveSheet.Cells(i, COL_TARGET))
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(keyword)).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
B列に幾つかのキーワードを入れて
A列の文字に色を塗る方法を知りたいのですが
それは
2022年3月30日 9:05 PM
に書かれている方法でよろしいでしょうか?
そのまま実行しようとすると
Public Sub setColor()
ここでエラーが出てしまうのですが、どこを修正すればよろしいでしょうか
エラーがあったとのこと、すみません。
他のコメントで頂いたバグも修正したバージョンで再作成してみました。
こちらでどうでしょうか。
Const COL_KEYWORD = 2
↑この値を変更することでキーワードの列を変更できるようにしています。現在は2列目(B)を指定しています。
ご回答ありがとうございました。
お教えいただいた方法を会社で試したところ無事できました。
大変助かりました!!ありがとうございました。
キーワードを指定するとキーワードより後ろがすべて赤色に表示されます。
キーワードで指定した文字のみを赤くしたいのですがどうしたらいいでしょうか。
スクリプトはコピペで行いキーワードの指定のみ変更を加えて他は変更を加えていません。
自分のExcel(Office365)だと書いてあるスクリプトで指定した文字だけ赤くなっているんですよね。
Excelのバージョンで関数の動きが違うときもあるので、それかもしれないですが、再現しないのでちょっとわかりそうにないです><
文字数を指定しているのは以下の部分なのですが
Lengthの値と同じ文字数を赤くしているので、Lengthの値を数値で指定すれば行けるかもしれないです。例えばキーワードが4文字なら以下のように4を指定します。
(変更前)
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
↓
(変更後)
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=4).Font.Color = -16776961
お世話になります。
1列目だけを変換:Const COL_TARGET = 1
1行目だけを変換:Const ROW_TARGET = 1
のご教授をいただいておりますが、行列全部(シート全部)のセル対象を変換する場合、
簡単な記述方法は御座いますでしょうか?やはりFor分で回さないとダメでしょうか?
よろしくお願いいたします。
結局ループはさせてるのですが、個人的には以下のようにFor Eachを使うのがスマートな書き方がします。
Const SHEET_TARGETで指定しているワークシートで使用しているセルをループさせています。
Public Sub setColor()
‘検索するキーワード
Const KEYWORD = “エラー”
‘色を塗るセルが格納されているシート名
Const SHEET_TARGET = “Sheet1”
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets(SHEET_TARGET)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
For Each cell In sh.UsedRange
Set regResult = .Execute(cell)
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
cell.Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
Next j
Next cell
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
はじめまして。
初心者質問で申し訳無いのですが、
‘検索するキーワード
Const KEYWORD = “エラー”
この部分についてで今はエラーのみですが文字色の指定をエラーと何かと言う風に2つ以上の複数にする事は可能ですか?
教えて頂けると幸いです。
以下でどうでしょうか。例として”正常”or”エラー”を検索します。
「Const KEYWORD = “エラー|正常”」の部分の縦線が文字の区切りになります。
Public Sub setColor()
‘検索するキーワード
Const KEYWORD = “エラー|正常”
‘色を塗るセルが格納されている列
Const COL_TARGET = 1
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
‘1行目から使用最終行を対象にする
For i = 1 To ActiveSheet.Cells(Rows.Count, COL_TARGET).End(xlUp).Row
Set regResult = .Execute(ActiveSheet.Cells(i, COL_TARGET))
For j = 0 To regResult.Count – 1
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=regResult(j).Length).Font.Color = -16776961
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End Sub
ありがとうございます!!!
思ってたものになりました!最高です!助かりました!!
はじめまして、VBA非常に参考になりました。
質問なのですが特定のセル内の特定文字の色だけを変えたいのですがその場合はどのようにしたら良いでしょうか?
例えば、A5セルだけの特定の文字だけ色を変えたいといった感じです。
VBA初心者なので難しくてわからなかったのでご教授の程お願いします。
コメント欄でもVBAソース見やすく貼る方法確立した!!
本題ですが、以下ではどうでしょうか。
Const TARGET = “A5″というところで対象のセルを指定しています。
ありがとうございます!
とても参考になりました。
早速会社のほうで試してみたいと思います。
はじめまして、エクセルのセルの一部の文字列の色を変える方法を探していたところこのページにたどりつきました。もしご存じだったらご教授いただきたいのですが…
次のような表で
A列 B列
1 エラー これはエラーです。
2 正常 今日は正常です。
3 問題 たくさんの問題があります。
B列の各セルの中の文について、すぐ左のA列に設定したキーワードと同じ文字列だけを赤色にしたいのですが、ここで紹介されている内容を応用することで実現可能だったりしますでしょうか?
列指定があると関数でなんとかしたくなるけどVBAしか思いつかないですね。。。
VBAならこんな感じでどうでしょうか。
さっそくありがとうございました。さっそく試させていただいたところ、見事に部分的に色を変えることが出来ました。もう何て言ったらいいか、手作業で数日以上かかるような作業を一瞬でできるようになったので、感謝の言葉しかありません。
VBAのすごさとそれをあやつるヒロユキ様の見事なスキルを見せつけられた気分でした。
はじめまして
Sheet1とSheet2に同じデータを貼り付けて(A列からC列は別だが、D列以降は同じ)、Sheet1のセル内の1部の文字を変更した場合、その文字だけ色を変えたいのですが、ご教授いただけますでしょうか?
D列以降は最初は同じ状態だけど、変更されるので変更されたら色を付けるということですよね。(A~C列は違うので無視)
文字の差分は難しくて完全に判別する方法ない気もするのですが、自分なりに考えて作ってみました。
うまくいかないケースもあるかもしれないです。。。
下記コードをSheet1のコードに貼ると動くと思います。
説明が下手でうまく伝わるかわからないので、サンプルで作ったEXCELもアップロードしておきます。
サンプルファイル
はじめまして。
VBA初心者で恐縮ですが、設定に悩んでいることがありいくつか質問をさせていただきたいです。下記長文となりますが、ご対応いただけますと幸甚です。
状況)
sheet1のデータを数式にてsheet2に表示しています。
sheet1にてセル内の特定の文字のみ色を設定しているのですが、sheet2にも同じように文字色を変更したいと思っています。
ですが、数式や条件設定では上記の内容は実行出来ないので、sheet2を開いた際に実行されるようなマクロを設定したいと思いました。
ヒロユキ様の各種回答を参考にさせていただき、マクロ設定を組んでみたのですが上手く実行出来ず、悩んでおります。
教えて頂きたいこと)
①特定のシートを開いた際に実行されるような内容を一緒に組むことは可能でしょうか。
②文字色を変更したいキーワードがいくつかあるのですが、|にて区切る旨は把握できたのですが、こちら文字数が各種異なっていても問題ないでしょうか。また※もキーワードに含んでも問題ない文字でしょうか。
③ ②の内容に付随するかもしれませんが、以前他の方への回答の中で
【キーワードが1文字多くなってしまうので、Length:=Len(KEYWORD) – 1)に変えています。】という内容がありましたが、
キーワードの文字数が異なる場合は、どのように設定するのが良いでしょうか。
長文となってしまい申し訳ございません。
よろしくお願いいたします。
繰り返し申し訳ございません。上記匿名の者です。
質問に漏れがありましたので、追走させていただきました。
状況)に説明させていただきましたが、
別sheetデータを数式にて反映させている場合、特定のキーワードを文字列にて指定しようとすると、こちらのVBAでは反映させることは出来ないでしょうか。
これが根本的問題でした…
試してみたのですが、数式の場合は1文字でも他の色にしようとすると、全部その色に変わってしまいました。
もしかしたら回避する方法があるのかもですが、自分の知識だと無理そうです。
ここが重要なところだと思うので、もうアウトな気がしますが、一応ほかは実現可能だと思います。
>>①特定のシートを開いた際に実行されるような内容を一緒に組むことは可能でしょうか
これは、Sheet2のコードにWorksheet_Activateという関数を作ることで実現できます。(下記画像のところです。)
Sheet2を開いたときにWorksheet_Activateに記載した処理が実行されます。
※余談ですがVBAを実行するとUnDo(ctrl + Z)で戻せなくなるので個人的には自動実行はできる限りやらないですね。
>②文字色を変更したいキーワードがいくつかあるのですが、|にて区切る旨は把握できたのですが、こちら文字数が各種異なっていても問題ないでしょうか。
Length:=regResult(j).Lengthの形にすればいけました。
前述の通り数式だと無理そうなので、一旦文字列に直してやってみました。
突然のご連絡恐れ入ります。
VBAで赤色に変更されることは理解いたしました。
では、赤色ではなくその他の色に変更した際はどのように修正すればよろしいでしょうか。
ド素人の質問で大変恐縮ではございますが、ご確認の程よろしくお願いいたします。
ブログ記事に載せたサンプルの以下コードで色を指定しているので、この値を変更します。
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
※自分の書いたコードが良くなかったのですが、「-16776961」は赤を示しています。「-16776961」ではなく「vbRed」と書くこともできます。
例えば、青い色にする場合は以下になります。
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = vbBlue
赤紫(マゼンタ)にする場合は以下になります
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = vbMagenta
質問です。
論文作成者リストから、職員全員の氏名を色分けするやり方を知りたいのですが、VBAの仕組みが素人で、どこにどれを当てはめて良いかがわかりません。
細かく説明していただくことはできますか?
色ではなく太字でした
まずVBAで特定の文字だけを太字にするのはできそうにない感じがしました
なのでセル全体を太字にする場合で考えたのですが
論文作成者リストが1列目、職員の名前が「田中太郎、佐藤次郎」の場合は以下コードになります。
コメントでコードの説明を入れてみました。
やりたいことと違うかもしれないですが、
もし論文作成者リストのセルに名前がズバリ入っていて、職員かどうかを見分けたいだけなら自分ならVBAを使わずにExcel関数を使いますね。
A列が論文作成者リストでC列が職員の場合に、A1を検査するには以下を使います。
=IF(COUNTIF(C:C,A2),”職員”,”職員以外”)
ありがとうございます。
一つのセルに、ローマ字表記の論文作成者の名前が何十人と記載されている中、職員の名前をさがし太文字にする作業なんです。
目視でやっているため、ミスが多くて、回避できる方法を探しています。
以前コメントで太文字はできなさそうと記載してしまったのですが、試すと太文字にすることはできました。
もし職員全員の名前が固定のようでしたら、以下のような感じではどうでしょうか。
KEYWORDに職員の名前をカンマ区切りで指定します。
現在選択中のセルを対象にして処理を行います。
はじめまして。
質問させていただきます。
同じセルに、●●、▲▲、◾️◾️の単語があり、
●●は赤色、▲▲は青色、◾️◾️は緑色にしたい場合はどのようにしたらよいでしょうか?
ご教示のほどよろしくお願いいたします。
以下のようではどうでしょうか。
Const KEYWORD1に●●、Const KEYWORD2に▲▲、Const KEYWORD3に◾️◾️を設定する感じです。
ちょっと力技ですが、3色くらいなら問題なさそうなので単純に色塗り処理を3回繰り返してます。
色についてですが、セルのfont.colorにvb〇〇と記載することで色設定が可能です。
ソース内ではvbRed、vbBlue、vbGreenを使っています。
他にvbYellow、vbMagenta、vbCyanなどいろいろあります。
ありがとうございます。
これで事務作業が時短になります!
もう一つ質問よろしいでしょうか。
紫にするにはどのように記載すればよいでしょうか。
よろしくお願いいたします。
紫はvb〇〇という定数がないのですよね。。。
そこで自由に色を指定できるコードにしてみました。
例として1つ目のキーワードを紫、2つ目をピンク、3つ目を緑にしてます。
紫を指定しているのは以下コードです。
KEYWORD1_COLOR = getRBG(128, 0, 128) ‘紫 = 128, 0, 128
getRBG関数に渡す数値を0~255の間で変えることで色が変わります。
1つ目の数値が赤、2つ目の数値が青、3つ目の数値が緑の強さを表しています。
なので仮に真っ赤にするには、255,0,0になります。
代表的な色を作るには、数値をどうしたらいいかは以下サイトが参考になりました。例えばオレンジなら255,165,0みたいです。
https://itsakura.com/html-color-codes
ありがとうございます。
とても勉強になりました。
これからも使わせていただきたいと思います。
はじめまして。
VBA初心者で恐縮ですが質問させて下さい。
VBAを使用させて頂き指定の文字だけのセルは文字の色が変更されるのですが
文字列の中に指定の文字が含まれる場合には色が変更されません
また変更されたものの後ろに違う文字を入れればその文字も色が変わってしまいます。
Excel365を使用しています。
ご教授頂けましたら幸いです。
自分の環境ですと、文字列の中に指定の文字が含まれる場合も色変更できました。
記事に掲載したVBAプログラムですが、下記の「Length=」の部分で何も自分色を変えるかを指定しています。
(Len(KEYWORD)で指定した文字列の長さを取得していて、その数値をLengthに設定しています。)
‘指定された単語があれば赤色にする
ActiveSheet.Cells(i, COL_TARGET).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = -16776961
見当違いでしたらすみませんが、この部分が怪しいので確認してみてください。
また後ろに違う文字を入れると、Excelが勝手にその文字の色も変えてしまうみたいです。おそらく便利に使うための機能だと思うのですが、ちょっと回避策は分からなかったです。。。
あまり力になれない返信ですみません。
ヒロユキ様ご返信ありがとうございます。
やはりキーワードのみのセルしか色が変わってくれないようです。
わざわざご返信いただけたのに解決できずに申し訳ございません。
はじめまして。
VBAについて全くの初心者なので、素人ながらに質問させてください。
一つのセル内に複数の単語があり、同じようなセルが縦に10行ほど(例:C5~C14)並んでいる表を業務で扱っています。その表から一つの単語を探すために毎度Ctrl+Fで検索をかけているのですが、1セルに1単語というような作りではないため、当たり前ですが、単語が含まれているセルを検索結果扱いとされてしまいます。検索結果の単語のみを赤文字に色付けするようなことをしたいのですが、できますでしょうか?
以下のコードでC5~C14の特定の単語のみを赤字に変更できました。
範囲をD5~D14に変える場合は、TARGET_RANGE = “D5:D14″にします。
やりたいことと違ってたらすみません><
お返事ありがとうございます。
上記のコードなのですが、試してみたところ検索前から全単語が常時赤文字で表示
されるようになりました。検索前(通常時)→黒文字のまま、Ctrl+Fで検索→検索に
引っかかった単語のみを赤文字、といった使用は可能でしょうか?
なるほど検索したあとに色を付ける感じですか。
調べてみたのですが、Ctrl+Fで検索した後に色を付ける方法はなさそうでした。。。
下記のような形で自作でダイアログを表示して検索しているような動きにすることはできました。
範囲を選択してマクロを実行すると、選択している範囲を検索します。
マクロをCtrl + 任意のキーで呼び出せるようにもできるので、Ctrl+Fのかわりにこちらを使うようにはできます。
上記のVBAでCtrl+Fよりかなり検索しやすくなりました!何度も質問してすいません。上記の場合だと、毎回範囲を選択しているのですが、VBA上で常に同じ範囲を固定選択することは可能でしょうか?4行目に当たる部分に「Const TARGET_RANGE = “C●:C●”」を追記しても機能しなかったのですが、挿入する位置が悪いのでしょうか?五月雨になってしまいすみません。
すみませんー。コメント見逃していて遅くなりました。。。
同じ範囲を固定選択するなら以下のような感じになると思います。
3行目の「Set target = ActiveSheet.Range(“C4:C15”)」の部分で指定しているので、C4:C15を変更すれば範囲が変わります。
初めまして、コメント失礼します。
「検索キーワード3個、検索列を行にする、文字色の変更」は皆さまのご質問を合わせて修正できました。もう一つご教授いただきたいのですが、私の場合ですと、検索セル行の文字がドロップダウンリストにより選択するようにしています。リストにより選択し直すと、対象文字の色が変更されません。セルの文字列を変更しても色が変わるようにできないでしょうか。ご教授いただけたら幸いです。
最近あまりブログ見てなかったので遅くなりました…
ドロップダウンリストが変更されたときに、任意のVBA処理を実行することができるので、その時に作成されたプログラムを実行すれば自動で変わってくれる動きが実現できると思います。
例えばドロップダウンがSheet1のA1にある場合は、下記画像のようにSheet1のコードに以下のように記載します。
「’ここに呼び出したい処理を書く」のところで文字の色を変更する処理をcall で呼び出せば行けると思います。(処理名がsetColorの場合は、call setColorで呼び出す。)
度々申し訳ございません。
当方、空白(表示なし)も必要でして、検索文字の色を白色にして、印刷されないようにしています。ドロップダウンリストの一つとして「空白」を設け、キーワードにも「空白」としいます。その空白を選択すると、実行通り白色に変化します。しかし、またそのセルで別の文字列を選択し直すと、セルのすべての文字列が白色になってしまいます。(空白以外の文字列の選択後は、正しく表示されます)続いてご教授願えればと思います。
実現したいことと違っていたらすみませんが、空白の選択肢の時だけ白色にする処理に入りたいということですよね。
下記のように書くと空白の場合と空白以外の場合で条件分岐ができます。(Targetに選んだ選択肢が設定されているのでそれで分岐させる。)
それで空白の場合だけ白色にする処理をcallするようにすれば実現できないでしょうか。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
‘ドロップダウンリストがあるセルのアドレス
Const DROP_ADDRESS As String = “D34:AH34”
If Target.Address DROP_ADDRESS Then
‘ここに呼び出したい処理を書く
‘検索するキーワード
Const KEYWORD = “上|中|下|空白”
‘色を塗るセルが格納されている行
Const ROW_TARGET = 34
Dim regexp As Object
Dim i As Long
Dim j As Long
Dim regResult As Object
Set regexp = CreateObject(“VBScript.RegExp”)
With regexp
.Pattern = KEYWORD
.IgnoreCase = True
.Global = True
‘1列目から使用最終列を対象にする
For i = 1 To ActiveSheet.Cells(ROW_TARGET, Columns.Count).End(xlToLeft).Column
Set regResult = .Execute(ActiveSheet.Cells(ROW_TARGET, i))
For j = 0 To regResult.Count – 1
‘指定された単語があれば白色にする
ActiveSheet.Cells(ROW_TARGET, i).Characters(Start:=regResult(j).FirstIndex + 1, Length:=Len(KEYWORD)).Font.Color = RGB(255, 255, 255)
Next j
Next i
End With
Set regResult = Nothing
Set regexp = Nothing
End If
End Sub
表現至らずすいません。
例えば「Const KEYWORD = “上|中|下|空白”」~//~
「.Font.Color = RGB(255, 255, 255)」の文で、ドロップダウンリストより、
「〇〇上」を選択(正しく「上」のみ白色)その後、同セルで「○○○中」を選択は正しく「中」のみ白色表示されますが、ドロップダウンリストより「空白」を選択(「空白」が白色」)でいいのですが、その次に同セルで「○○○中」を選択すると、「○○○中」すべてが白色に処理されます。正しくキーワードのみ処理するにはどのようにすればいいのでしょうか。長文すみません。
補足です。「空白」は熟語で、画像は真白です
ヒロユキ様 ご返信ありがとうございます。
大変勉強になりました。処理が実行できました。早速使いたいと思います♪
なるほどですね。
今、キーワードは常に「上|中|下|空白」にしているのですがドロップダウンで指定した値を使う必要があると思うので、修正してみました。
あと白色にした文字をもとに戻す処理も必要なので、白色に塗る前にクロにする処理を入れています。
また、すみませんが前に記載したWorksheet_SelectionChangeだと動いてくれないこともあったのでWorksheet_Changeにしました。
何度も何度もありがとうございました。
思っていたものが出来上がりました。本当にありがとうございました。
感謝です╰(*°▽°*)╯
初めまして。
皆様と同じく、VBA初心者かつやりたいことを実装してくださっていたので
参考にさせていただいています。
大変ありがたいです。
一点、自分でも調査していたのですがわからず何か解決策があればと思い、
コメントさせていただきました。
【やりたいこと】
・キーワード(英単語(★))で検索
・ヒットすれば赤文字かつ太文字
★に関しまして、
英単語を例えば”he”とした場合、”he”のみを強調したいのですが、
Theの”he”も強調表示されてしまいます。
“The(わかりにくいですが、全角半角を使うとこのようなイメージです)”
この辺り、解決策などもしございましたらご教示いただけないでしょうか。
検索キーワードを大文字固定にすればいける?と考えて、
HE
にしてみたのですが、事象は変わらずでして。。
英単語というのをプログラムにどう認識させるかが難しいのですが、以下のようなパターンの場合に赤太字にするという形なら、Theが塗られてしまうのは防げると思います。
■赤字にするパターン
・キーワードの先頭が大文字で、キーワードの後がスペース(行頭の場合)
・キーワードがスペースで囲まれている(文中の場合)
・キーワードの前がスペースで、あとがドット(文末の場合)
もしかしたら考慮漏れがあるかもしれないですが。。。
VBAで書くと以下になるかと思います。
こちらのサイトをみて、まさにやりたいことなのですが、ひとつだけ分からなくって、教えて頂けたら幸いです。
A列は色を置き換えられたのですが、私がやりたい列が「X列」に入ってる「解約」の文字を赤にする。ということで、X列に指示をするにはどこを変更すればよいでしょうか?
すみません、ブログをあまり見てなかったので遅くなりました。
他の列にするにはソース内にある下記を変更することになります。
‘色を塗るセルが格納されている列
Const COL_TARGET = 1
今は1なのですが、これは左から1列目という意味で、A列が対象となります。
「Const COL_TARGET = 2」に変更するとB列が対象、「Const COL_TARGET = 3」に変更するとC列が対象となります。
Xは数えるのが面倒ですが、多分24だと思います。(数え間違ってたらすみません。)
直ぐに試しました。完璧です!本当にありがとうございます!!助かりました。