• ベストアンサー

excel_特定のセル範囲で同じ文字列が有ったら色

マクロ初心者です。 excel2002マクロ_特定のセル範囲で同じ文字列が有ったらその数によりセルを色分けしたい 特定のセル範囲で文字列が入っているところと空欄のところがあります。 空欄のところには、後から文字列が入るところと空欄のままのところがあります。 その範囲内で同じ文字列があった場合、2個の時、3個の時、4個の時、5個、6個、7個、8個、9個、10個以上の時に、それぞれ決めておいた色でセルを色分け表示したいです。 文字列の順番はランダムです。 excel2002なので、3種類までなら条件付き書式で設定できるのですが、それを超える場合は設定できません。 それで、これをマクロで設定できるでしょうか。 条件付き書式で設定した場合は、文字列を入力した時点でセルの色はすぐに反映されますが、マクロの場合もそのようにすることは可能でしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.4

回答1No.1No.2のおまけです。 色が多いので各色が何個の時の色なのかが分かりにくいと思いますので どこかに色見本的なセルを設けて たとえばN列のセルに色を付けてO列にその色が何個の時なのか記載しておいて N1に2個の時の色があるとしたら Case 2 mRng.Interior.Color = Range("N1").Interior.Color 以下同じようにし指定 とすれば分かりやすいかもしれません。

dos_2000
質問者

お礼

ありがとうございます。 自分用に色々試しているところです。

dos_2000
質問者

補足

「おまけ」にすると分かりやすくて良いですね。 非力なPCで使っているので、試しに範囲を一番下の65,536行までにしてみたところ、1回入力する度に数秒間ビジー状態になりました。 範囲をそこまで広げることは無いので問題にならないと思います。

その他の回答 (4)

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.5

> 試しに範囲を一番下の65,536行までにしてみたところ、1回入力する度に数秒間ビジー状態になりました。 色だとどうしてもセルに都度アクセスしないといけないので時間がかかりますね。 最初の方の Application.EnableEvents = False の後に Application.ScreenUpdating = False と 最後の Application.EnableEvents = True の前に Application.ScreenUpdating = True とすれば多少は変わるかもしれません。 あと、たぶん色なしの方が多いだろうなと思って検索時に結果を見て一つ一つ色なしにするより最初に範囲全て色なしにたほうが早いのじゃないかなと思って(試していないので私の思い込みの可能性もあります) Range("B3:C27").Interior.ColorIndex = xlNone としているのですが 色なしの方が少ないのでしたら Case Is >= 10 mRng.Interior.Color = vbCyan Case Else mRng.Interior.Color = xlNone End Select とCase Elseのところに色なし設定をすると多少かわるかもしれません。

dos_2000
質問者

補足

色なしの設定を変えて、範囲を65,536行にしてみたところ、ビジーがかなり長い時間になってしまいました。 空欄のところが多かったためかもしれません。 今使っている状態では100件になっていません。 今後増えていきますが、範囲は余裕をあまり大きくしないで使おうと思います。 ありがとうございました。

  • SI299792
  • ベストアンサー率48% (713/1473)
回答No.3

どのように色を指定するのかわからないし、9色指定するのは大変なので、ColorIndexを使いました。 2つ☞赤、3つ☞緑… 濃い色だと醜いので、その場合フォントを白にする機能を付けました。 範囲はA1~N12 にしてあります。変更して下さい。 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range)   Dim Area As Range   Dim Count As Integer '   Set Area = [A1:N12] '   If Intersect(Target, Area) Is Nothing Then     End   End If '   For Each Target In Area     Count = WorksheetFunction.CountIf(Area, Target)     Count = WorksheetFunction.Min(Count, 10) '     If Count < 2 Then       Target.Interior.Pattern = xlNone     Else       Target.Interior.ColorIndex = Count + 1     End If     Target.Font.Color = FontColor(Target.Interior.Color)   Next Target End Sub ' Function FontColor(ByVal IColor As Long) As Long   Dim SColor As Integer   Dim Mul As Integer '   Mul = 1 '   Do While IColor > 0     Mul = Mul Mod 3 + 1     SColor = SColor + (IColor Mod 256) * Mul     IColor = IColor \ 256   Loop   FontColor = vbWhite * -(SColor < 764) End Function シートモジュールに入れて下さい。 シート名の所を右クリック、コードの表示を選び、そこに入れて下さい。

dos_2000
質問者

お礼

ありがとうございます。 色々試しています。

dos_2000
質問者

補足

セルが濃い色だと黒い文字は見難いので白文字にするのは良いですね。 この部分だけ組み込ませてもらおうと思います。 ありがとうございました。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.2

回答No.1は一列だけ対応してますが 複数列の範囲を数えるのなら Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B3:C27")) Is Nothing Then Exit Sub End If Application.EnableEvents = False Dim mRng As Range Range("B3:C27").Interior.ColorIndex = xlNone For Each mRng In Range("B3:C27") Select Case WorksheetFunction.CountIf(Range("B3:C27"), mRng.Value) Case 2 mRng.Interior.Color = vbYellow Case 3 mRng.Interior.Color = vbBlue Case 4 mRng.Interior.Color = vbGreen Case 5 mRng.Interior.Color = vbRed Case Is >= 10 mRng.Interior.Color = vbCyan Case Else End Select Next Application.EnableEvents = True End Sub 複数列対応だけど数える範囲はそのセルと同じ列だけ(No.1の対応範囲を広げるだけ) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B3:C27")) Is Nothing Then Exit Sub End If Application.EnableEvents = False Dim mRng As Range Range("B3:C27").Interior.ColorIndex = xlNone For Each mRng In Range("B3:C27") Select Case WorksheetFunction.CountIf(Range(Cells(3, mRng.Column), Cells(27, mRng.Column)), mRng.Value) Case 2 mRng.Interior.Color = vbYellow Case 3 mRng.Interior.Color = vbBlue Case 4 mRng.Interior.Color = vbGreen Case 5 mRng.Interior.Color = vbRed Case Is >= 10 mRng.Interior.Color = vbCyan Case Else End Select Next Application.EnableEvents = True End Sub

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

範囲が分からないのでB3:B27としてます。該当シートのマクロに以下をコピペしてみてください。実行されたら手入力の時のように元の戻すはききません。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B3:B27")) Is Nothing Then Exit Sub End If Application.EnableEvents = False Dim mRng As Range Range("B3:B27").Interior.ColorIndex = xlNone For Each mRng In Range("B3:B27") Select Case WorksheetFunction.CountIf(Range(Cells(3, mRng.Column), Cells(27, mRng.Column)), mRng.Value) Case 2 mRng.Interior.Color = vbYellow Case 3 mRng.Interior.Color = vbBlue Case 4 mRng.Interior.Color = vbGreen Case 5 mRng.Interior.Color = vbRed 'この間に残りを同じように指定して下さい Case Is >= 10 mRng.Interior.Color = vbCyan Case Else End Select Next Application.EnableEvents = True End Sub 色は以下のサイトで VBAカラー一覧(組み込み定数、RGB値、16進数)|色見本あり https://excel-toshokan.com/vba-color-list/

関連するQ&A

  • 範囲内である文字列が含まれていたら,違うセルに表示させる

    A4:A10という範囲(同じ行)の中に,ある文字列が含まれていたら,違うセルに○と表示する,それ以外は空欄という式をつくるにはどうしたら良いでしょうか。 文字列は同じ行の中で同じ文字が1回以上登場することはありません。 A B C あ い う か き く・・・ D E F い え お き く こ・・・ G H I う お い こ け き・・・ 1行目の文字列(あいうかきく)の行の中に「あ」が含まれていたらAセルにアと表示し, 3行目文字列(うおいこけき)に「う」があったらIにウと表示する。それ以外は空欄。 アルファベットのセルには色をつけたりといった書式条件ではなく特定の文字列を表示させたいです。 「IF(B42="あ","ア",""」の場合,B42のセルの中身が「あ」だったらアと表示する,それ以外は空欄。という意味になりますでしょうか? これで,B42セルだけではなくB42:B50という範囲の中に「あ」という文字列があったら…と思いましてご相談です。宜しくお願いします。

  • Excelのセル内の文字列の文字色変更について

    申し訳ございません、どなたか教えていただけないでしょうか。 エクセルのセル内の文字列を、ある特定の文字列の時に文字色を変えたい。 例えば、赤、青、黄、桃、緑という文字列をセルの中に入れた時、 その文字の色がそれぞれ、 「赤」の時:赤色の文字色 「青」の時:青色の文字色 「黄」の時:黄色の文字色 「桃」の時:桃色の文字色 「緑」の時:緑色の文字色 というように自動的に設定をしたいのです。 条件付き書式では、3種類までならできますが、4種類以上だとダメですよね。 できればマクロではなく、セルの書式設定「ユーザー定義」で設定したいのですが、 公式はございますでしょうか。 数値によって色を変更する方法は、いろいろなサイトで確認しましたが、 文字列で色を変えるという方法がなかったもので質問をいたしました。 よろしくお願いいたします。

  • 5つの範囲にあるセルに色をつけるにはどうしたらよいですか

    エクセルについて教えて下さい。 書式の中にある【条件付き書式の設定】を使用し、 1<予算残<5,000 5,001<予算残<10,000 10,001<予算残<50,000 ↑この上記3つの範囲にあるものをセルに色を付けています。 このほかに 500,000<予算残<1,000,000 1,000,001<予算残<1,500,000の範囲にあるものも セルに色を付けたいと思っています。 この5つの範囲でセルに色を付けることができれば、 条件付き書式の設定以外でも構わないです。 どのようにしたらよいか教えて頂けないでしょうか。

  • エクセルで特定の文字列を含むセルを自動的に塗りつぶしたい

    ということなのですが。条件付き書式、あるいはマクロなどで解決できないでしょうか? 特定の文字列に「等しい」セルを塗りつぶすというのは、かんたんにできるようなのですが、「含む」になると、過去ログから見つけられませんでした。 300ファイルくらいあるデータから、特定の文字を含むセルをマーキングし、情報を抽出せねばなりません。 どなたか知恵をかしてくださいませ!

  • 【VBA】特定の範囲で同じ値を含むセルの色を変える

    Excelのマクロに関して質問です。 特定の範囲(複数行と複数列)内で重複した値(セル内の最初の4文字が同じもの)を含むセルの色を変えたいです。 さらに、重複した値ごとに色分けをしたいです。例えば重複した値[1111]と重複した値[1112]の時では、前者が赤色で後者は青色、更に他の重複する値はまた別の色でというように、 要は、どのセルとセルが重複しているか色分けをして一目瞭然にしたいです。 ※なお特定の範囲は以下の変数を利用します。 dataRow = Workbooks(booksName).Worksheets(sheetsName).Range("A2").End(xlDown).Row 'データの入っている最終行を取得 dataColum = Workbooks(booksName).Worksheets(sheetsName).Range("A1").End(xlToRight).Column 'データの入っている最終列を取得 どなたか知恵をお貸し下さい。よろしくお願いします。

  • 【VBA】特定の範囲で同じ値を含むセルの色を変える

    Excelのマクロに関して質問です。 特定の範囲(複数行と複数列)内で重複した値(セル内の最初の4文字が同じもの)を含むセルの色を変えたいです。 さらに、重複した値ごとに色分けをしたいです。例えば重複した値[1111]と重複した値[1112]の時では、前者が赤色で後者は青色、更に他の重複する値はまた別の色でというように、 要は、どのセルとセルが重複しているか色分けをして一目瞭然にしたいです。 ※なお特定の範囲は以下の変数を利用します。 dataRow = Workbooks(booksName).Worksheets(sheetsName).Range("A2").End(xlDown).Row 'データの入っている最終行を取得 dataColum = Workbooks(booksName).Worksheets(sheetsName).Range("A1").End(xlToRight).Column 'データの入っている最終列を取得 どなたか知恵をお貸し下さい。よろしくお願いします。.

  • 【VBA】特定の範囲で同じ値を含むセルの色を変える

    Excelのマクロに関して質問です。 特定の範囲(複数行と複数列)内で重複した値(セル内の最初の4文字が同じもの)を含むセルに色をたいです。 さらに、重複した値ごとに色分けをしたいです。例えば重複した値[1111]と重複した値[1112]の時では、前者が赤色で後者は青色、更に他の重複する値はまた他の色でというように、 要どのセルとセルが重複しているか色分けをして一目瞭然にしたいです。 ※なお特定の範囲は以下の変数を利用します。 dataRow = Workbooks(booksName).Worksheets(sheetsName).Range("A2").End(xlDown).Row 'データの入っている最終行を取得 dataColum = Workbooks(booksName).Worksheets(sheetsName).Range("A1").End(xlToRight).Column 'データの入っている最終列を取得 どなたか知恵をお貸し下さい。よろしくお願いします。

  • 特定文字列を色分けする

    WIN XP エクセル2003です。 条件付書式で下記のような条件で色分けは出来ないでしょうか。 表内に3文字・4文字・6文字・10文字など、複数の文字列があったとします。 「6文字の文字列のみ色づけする」 という書式設定はどうしたら出来ますでしょうか。 ご教授宜しくお願いします。

  • Excelで文字列セルにて条件式を設定するには

    Excelにて、書式設定が「文字列」のセルに以下の条件を設定するにはどうすればよいでしょうか。 どなたか教えてください。 Excelのマクロ機能を使用して、CSVデータを取り込み、シート上の所定のセルにCSVデータを出力させている既存システムがあるのですが、出力の際に次のような条件を追加したいと考えています。 なお、マクロの修正にて対応できればいいのですが、システムの設定上、マクロをいじることができないため、なんとかシート上で条件式にて対応したいと考えています。 列Bのセルに、隣の列Aの値をみて出力する内容を変えるための条件式を設定したい。 なお、列A,Bともに条件を設定する対象は複数行を想定。ともに書式は文字列。 例) ・A1の値が空欄でないとき、B1には取り込んだCSVデータの値を表示。 ・A2の値が空欄のとき、B2には固定で”あああ”と表示(現行ではA2のデータ元CSVがスペースの場合、B2のデータ元も必ずスペース。よって、A2、B2ともに空欄になっている)。 とりあえず、列BにIF文の条件式を設定してみたのですが、文字列セルのため、設定した条件がそのまま表示されてしまいます。 なにかよい方法はないでしょうか。よろしくお願いします。

  • エクセルで特定の範囲の文字列を抜き出したいのですが関数がわかりません。

    エクセルで特定の範囲の文字列を抜き出したいのですが関数がわかりません。 抽出の条件は「セルの中の【 】でくくられた部分」(【】も含む)です。 各セル内の文字列はすべてこの【】から始まる文章で構成されているのですが、 【】内の文字数はそれぞれ違うという状態です。 文字数が固定の場合の関数は思いつくのですが、異なる場合がよくわかりません。 よろしくお願いします。

専門家に質問してみよう