エクセルで文字色を数える関数について

このQ&Aのポイント
  • エクセルのセル内の文字色を数えるための関数について説明します。
  • 関数を使用して特定の色の文字が含まれるセルを数える方法を紹介します。
  • 複数の色が含まれるセルの文字色を数える方法についてご説明します。
回答を見る
  • ベストアンサー

エクセルでの文字色を数える関数に関して。。。

エクセルのセル内の文字色に関してのマクロを下記の通り書きました。 Function SpecialCell(targetRange As Range, _ intColor As Integer) As Integer '赤は3,緑は4,青は5,黄は6 Dim myCell As Range For Each myCell In targetRange If myCell.Font.ColorIndex = intColor _ Or myCell.Interior.ColorIndex = intColor Then SpecialCell = SpecialCell + 1 End If Next End Function その後答えを求めるセルに =SpecialCell(D5:D125,3) これはちゃんと表示できます。 しかし、 =SpecialCell(D10,D8,D29,D49,D51,D57,3) このようにセルの個別ごとに求めようとすると #VALUE! が出ますので引数が間違っているのだとは思うのですが、 この場合はどうすればよろしいでしょうか? また、セル内に複数の色つき文字がある場合、 例えば同一セル内に (1)(2)(3) とあって、 (1)が赤 (2)が青 (3)がピンク とした場合、 =SpecialCell(D5:D125,3) これでは0と出てきてしまいます。。。 この場合はどういう風に数式をいれればよいのでしょうか? 以上2点ほどご教授いただけると助かります。 よろしくお願いいたします。。。

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

  • ベストアンサー
回答No.11

kmetu さんの「セル範囲を()で囲む」を私のソースに適用させてもらって(^^; ん? (1) は【丸囲み数字1】ですか?では Function SpecialCell(TargetRange As Range, intColor As Integer) As Integer   '赤は3,緑は4,青は5,黄は6   Dim myCell   As Range   Dim intIDX   As Integer   Dim strVALUE  As String   For Each myCell In TargetRange     If myCell.Font.ColorIndex = intColor Then       SpecialCell = SpecialCell + 1       GoTo SkipFor     End If     If myCell.Interior.ColorIndex = intColor Then       SpecialCell = SpecialCell + 1       GoTo SkipFor     End If     If myCell.Value <> "" Then       For intIDX = 1 To Len(myCell.Value)         If myCell.Characters(intIDX, 1).Font.ColorIndex = intColor Then           SpecialCell = SpecialCell + 1         End If       Next     End If    SkipFor:   Next   End Function これで、=SpecialCell((D10,D8,D29,D49,D51,D57),3) のように書けばOKかと。

naccha
質問者

お礼

たびたびありがとうございます。 このコードを試したところ、無事D欄・E欄ともに計算してくれました。 そして恐縮ながらもう一つ教えていただけると助かります。。。 Dの縦欄は、セル内背景色を分けているのと、文字色は1色です。 (なので、背景色ごとのセル分けで集計するための問1でした) このセル内の背景色を4色で分けているのですが、中の文字色は関係なく、背景色の数字を数えるのはできますでしょうか? %を出す為に、現在背景色を手計算で問1で教えていただいた数字で割っております。。。 この背景色も計算できると非常に助かります。。。 (現在のD欄とE欄の計算式が壊れないよう) http://miyahorinn.fc2web.com/tips/s_02_02_04_02.html とりあえず、これを元に作成してみますけど、問題があればご教授下さいませ。 よろしくお願いたします。。。 そしてありがとうございました。。。 助かりました。。。

naccha
質問者

補足

ごめんなさい。下記のURLでいけました。 今までの経緯を思うと、壊れるの前提で書いてしまいましたw ありがとうございました。。。

その他の回答 (11)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.12

> 現在入れているマクロでD欄は正常に統計が取れます。 > E欄の統計を取るマクロを入れるとD欄が壊れる。 入れるとはどういう意味でしょうか? 同じ名前(Function SpecialCell)で > なので、標準モジュール1を最初の奴 > 標準モジュール2を教えていただいた奴 としたのでしょうか。でしたらそれは無茶でしょうし"名前が適切ではありません。" とエラーが出るのは当然です。 とりあえず名前を変えて試すか、私の示したコードだけで試してください。 丸付きの文字3文字でしたら /3は不要で =SpecialCell(E6:E126,3) =SpecialCell(E6:E126,5) でいけます。

naccha
質問者

お礼

>エラーが出るのは当然です。 すいません、基本素人なもので、とりあえず試してみただけですw そして、やはりANo.7のコードに変えて、それまで計算していたD欄の統計部分の計算式を再計算するとコンパイルエラーがでます。。。 =SpecialCell(E6:E126,3) でE欄のところに埋め込んでもやはり計算してくれませんでした。。。 ANo.11さんのコードを入れてみたところ1回答えが全ておかしくなりましたが、エラーではなかったため、再計算すると元に戻り、D欄&E欄も無事に計算できました。 こちらのコードでもう少々ごにょごにょしてみたいと思います。 長い間ご教授いただきありがとうございました。。。 また、よろしくお願いいたします。。。

回答No.10

補足を読みました。 (1)(2)(3)で・・・という事なら、「)」「(」を無視して 123 だけ判定すれば良いですね(^^) なので Function SpecialCell(RangeString As String, intColor As Integer) As Integer   '赤は3,緑は4,青は5,黄は6   Dim TargetRange As Range   Dim myCell   As Range   Dim intIDX   As Integer   Dim strVALUE  As String   Set TargetRange = ActiveSheet.Range(RangeString)   For Each myCell In TargetRange     If myCell.Font.ColorIndex = intColor Then       SpecialCell = SpecialCell + 1       GoTo SkipFor     End If     If myCell.Interior.ColorIndex = intColor Then       SpecialCell = SpecialCell + 1       GoTo SkipFor     End If     If myCell.Value <> "" Then       '"("と")"を取り除く       strVALUDE = Replace(Replace(myCell.Value,"(",""),")","")       For intIDX = 1 To Len(strVALUE)         If myCell.Characters(intIDX, 1).Font.ColorIndex = intColor Then           SpecialCell = SpecialCell + 1         End If       Next     End If      SkipFor:   Next    End Function 関数の書き方は =SpecialCell("A1,D1,C1",3) などと、セル範囲を【文字列】で渡す事に変わりはありません。

回答No.9

=SpecialCell("D10,D8,D29,D49,D51,D57",3) のように、検査したいセルのアドレスをダブルクォーテーション「"」で囲んで下さい。 ↑ です。アドレスの指定している部分を「"」で囲んで「文字列」にしてください。 通常のセル範囲指定とは異なります。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.8

> 具体例が3文字なので1セット3文字と考えてます。 (1)を1セット3文字という意味です。

naccha
質問者

補足

あ、ごめんなさい。 括弧で出てきちゃうのですが、実際には丸がこみの数字で (1)(2)(3)←これでワンセット3文字です。 ややこしくてすいません。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.7

> E欄の統計を取る際に、例えば同一セル内で > > (1)(2)(3)(左から、赤・黒・青) > (1)(2)(3)(左から、黒・黒・赤) > (1)(2)(3)(左から、青・赤・青) > > これの回答を > 赤 3個 > 青 3個 > ピンク 0個 > > というような集計をしたくて、ご相談しました。。。 Function SpecialCell(targetRange As Range, _ intColor As Integer) As Integer '赤は3,緑は4,青は5,黄は6 Dim myCell As Range Dim myFlg As Boolean Function SpecialCell(targetRange As Range, _ intColor As Integer) As Integer '赤は3,緑は4,青は5,黄は6 Dim myCell As Range For Each myCell In targetRange For i = 1 To Len(myCell.Value) If myCell.Characters(Start:=i, Length:=1).Font.ColorIndex = intColor _ Or myCell.Interior.ColorIndex = intColor Then SpecialCell = SpecialCell + 1 End If Next Next End Function 前回のコードに元にあったOr myCell.Interior.ColorIndex = intColorを足してます。 (足さなくてもE列に関しては同じですが) で =SpecialCell(E6:E126,3)/3 =SpecialCell(E6:E126,5)/3 これでこちらでは希望の数値が出ました。具体例が3文字なので1セット3文字と考えてます。 > ちなみに標準モジュールに下記コードを追加して両方走らせると、 両方走らせるというのがちょっと意味がわかりません。

naccha
質問者

補足

早々の解答ありがとうございます。 早速いれてみたところ、、、 コンパイルエラー 名前が適切ではありません。 っと出ましてD欄の統計部分もダメになりました。 (#NAME) いけそうな気がしたのですが、、、 >両方走らせるというがちょっと意味がわかりません。 現在入れているマクロでD欄は正常に統計が取れます。 E欄の統計を取るマクロを入れるとD欄が壊れる。 なので、標準モジュール1を最初の奴 標準モジュール2を教えていただいた奴 とやればうまくいけるかな? っと思ったので試してみたらダメでしたw という意味です。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

こんばんは! せっかくコードをお考えのようなので、余計なお世話になるかもしれませんが・・・ セルを範囲指定した後に実行するマクロを考えてみました。 (Sheet2を作業用のSheetとして使用していますので、Sheet2は使用していないという前提です) Sheet1のマクロにしていますので、画面左下にあるSheet1のSheet見出し上で右クリック → コードの表示 → ↓のコードをコピー&ペーストし、範囲指定した後にマクロを実行してみてください。 Sub test() Dim c As Range Dim i As Long Dim str As String Dim ws As Worksheet Set ws = Worksheets(2) Application.ScreenUpdating = False For Each c In Selection For i = 1 To Len(c) str = Mid(c, i, 1) If WorksheetFunction.CountIf(ws.Columns(1), c.Characters(Start:=i, Length:=1) _ .Font.ColorIndex) = 0 And c.Characters(Start:=i, Length:=1).Font.ColorIndex <> xlAutomatic Then ws.Cells(Rows.Count, 1).End(xlUp).Offset(1) = _ c.Characters(Start:=i, Length:=1).Font.ColorIndex End If Next i ws.Cells(Rows.Count, 2).End(xlUp).Offset(1) = WorksheetFunction.Count(ws.Columns(1)) ws.Columns(1).Clear Next c ws.Cells(Rows.Count, 2).End(xlUp).Offset(1) = WorksheetFunction.Count(ws.Columns(1)) ws.Columns(1).Clear MsgBox ("3色使用セルは" & WorksheetFunction.CountIf(ws.Columns(2), 3) & "個です。") ws.Columns(2).Clear Application.ScreenUpdating = True End Sub ※ セル内のフォント色は「自動」以外の物を数えるようにしてみました。 ※ 上記コードは「3色」の場合のコードですので、2色の場合は >MsgBox ("3色使用セルは" & WorksheetFunction.CountIf(ws.Columns(2), 3) & "個です。") の行を >MsgBox ("2色使用セルは" & WorksheetFunction.CountIf(ws.Columns(2), 2) & "個です。") に変更してマクロを実行してみてください。 以上、参考になれば良いのですが・・・m(_ _)m

naccha
質問者

お礼

ご教授ありがとうございます。 やってみました! これはこれで面白いですね! なのですが、すいません。 その出てきた数字をさらに集計しまとめなければいけないので、データとして張り付いていないとだめなのです。。。 でも、ありがとうございました。。。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

> 今までのを消して上記を入れてみましたが、、、 > > 今まで出来ていた1色のところも0になりました。 > 3色のところも0になりました。。。 うーん…こちらで適当なデータを入れて試したら指定色の文字数分の数値がでるのですが… 具体的にどのようなデータなのでしょうか。 全部は無理としても D10,D8,D29,D49,D51,D57 のデータだけでも示せますでしょうか。

naccha
質問者

お礼

>例えば同一セル内で 分かりにくいので訂正。 セルが3個あって、1個のセル内に3つの数字があり、その3つの数字に色がついています。

naccha
質問者

補足

再度ありがとうございます。 Dの縦欄は、セル内背景色を分けているのと、文字色は1色です。 (なので、背景色ごとのセル分けで集計するための問1でした) Eの縦欄は背景色は無くて全てのセルに(1)(2)(3)数字が3個あり、その内1位なら赤、2位なら青、3位ならピンク、それ以外は黒と入力と文字色分けは手入力です。 E欄の統計を取る際に、例えば同一セル内で (1)(2)(3)(左から、赤・黒・青) (1)(2)(3)(左から、黒・黒・赤) (1)(2)(3)(左から、青・赤・青) これの回答を 赤 3個 青 3個 ピンク 0個 というような集計をしたくて、ご相談しました。。。 最初からセルを分けてれば問題は無かったのでしょうが、そこまで気が回りませんでした。。。 セル分けをするとなると、もう膨大な量のデータになりそうなので、、、 現在手入力で数えてますが、その内間違えそうですw ちなみに標準モジュールに下記コードを追加して両方走らせると、数値が正しく無いと出て表示自体が全部壊れてしまいました。。。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.4

もう一点は Function SpecialCell(targetRange As Range, _ intColor As Integer) As Integer '赤は3,緑は4,青は5,黄は6 Dim myCell As Range For Each myCell In targetRange For i = 1 To Len(myCell.Value) If myCell.Characters(Start:=i, Length:=1).Font.ColorIndex = intColor Then SpecialCell = SpecialCell + 1 End If Next Next End Function というコードでいかがでしょうか。

naccha
質問者

補足

ご教授ありがとうございます。 今までのを消して上記を入れてみましたが、、、 今まで出来ていた1色のところも0になりました。 3色のところも0になりました。。。 =SpecialCell(D5:D125,3)(1色のところ) =SpecialCell(E5:E125,3)(3色のところ) 呼び出す引数の書き方がおかしいのでしょうか? またご教授下さい。よろしくお願いいたします。

回答No.3

このマクロは、ご自身で作成されたものですか? > =SpecialCell(D10,D8,D29,D49,D51,D57,3) Functionで定義している引数が2つ(targetRange As Range, intColor As Integer)しかないのに、それ以上書いてもエラーになるだけです。上記の様な指定をしたいなら、マクロを修正するしかありません。 > セル内に複数の色つき文字がある場合 マクロ内では、セル全体の文字書式(.Font.ColorIndex)しか判定していませんので、これもマクロを修正しないとダメです。 ご質問の内容は「どういう風に数式をいれればよいのでしょうか?」なので、セルに入れる数式の方法ですが。。。 残念ながら、回答としては「質問者さんのやりたい事が出来るマクロでは無い」です(^^; マクロを直すとすれば、こういう感じでしょうか。 Function SpecialCell(RangeString As String, intColor As Integer) As Integer   '赤は3,緑は4,青は5,黄は6   Dim TargetRange As Range   Dim myCell   As Range   Dim bolFlag   As Boolean   Dim intIDX   As Integer   Set TargetRange = ActiveSheet.Range(RangeString)   For Each myCell In TargetRange     bolFlag = False     If myCell.Font.ColorIndex = intColor Then bolFlag = True     If myCell.Interior.ColorIndex = intColor Then bolFlag = True     If myCell.Value <> "" Then       For intIDX = 1 To Len(myCell.Value)         If myCell.Characters(intIDX, 1).Font.ColorIndex = intColor Then bolFlag = True       Next     End If          If bolFlag Then SpecialCell = SpecialCell + 1   Next    End Function 動作確認してませんが(^^; =SpecialCell("D10,D8,D29,D49,D51,D57",3) のように、検査したいセルのアドレスをダブルクォーテーション「"」で囲んで下さい。

naccha
質問者

補足

回答ありがとうございます。 >このマクロは、ご自身で作成されたものですか? いえ、ほとんど素人ですので、ググッてググッてようやく見つけたマクロをいれてます。。。 第(1)の問いはNO2さんの括弧で囲む方法でいけました。 第(2)に関しては、教えていただいたマクロを今まで書いてあったのを消して再計算してみましたら、、、 今まで、=SpecialCell(D5:D125,3) で出てきたところも0となってしまいできませんでした。。。 現状、セル内に1色の文字がある項目の計算は =SpecialCell(D5:D125,3) で出来てます。 セル内に1色~3色の文字がある項目の計算ができません。 (両方計算する必要があり、現在3色ある部分は目視計算) またご教授いただければ幸いです。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

=SpecialCell((D10,D8,D29,D49,D51,D57),3) セルの指示を括弧で囲むといけますね。

naccha
質問者

お礼

ありがとうございます! 括弧で囲むとすんなりいきました! 助かりました!

関連するQ&A

  • Excel2002 色文字カウント コード

    色のついた文字セルをカウントするコードを検索し、 実際にやってみましたが、黒文字だけカウントできませんでした。 下記の「黄は6」のところを「黒は1」に変更してやりました。 その後、シートにもどって 色ごとに、=SpecialCell(A2:A14,3)としてカウントしました。 黒を他の色と同様に「=SpecialCell(A2:A14,1)」でカウント するために、どこを修正すれば宜しいでしょうか? 教えてください。よろしくお願いします。 ------------------------------------------- Function SpecialCell(targetRange As Range, _ intColor As Integer) As Integer '赤は3,緑は4,青は5,黄は6 Dim myCell As Range For Each myCell In targetRange If myCell.Font.ColorIndex = intColor _ Or myCell.Interior.ColorIndex = intColor Then SpecialCell = SpecialCell + 1 End If Next End Function -------------------------------------------

  • エクセルVBAについて

    現在、エクセル2010を使用し文字色が黒だったら1と加算しそれ以外は0というVBAを VBA素人ながら、コピペしながら組んでいました。 以下 'ColorIndex = 1 は、黒です 3は赤 黄色は7 青は 5 '============================================ Function fcolor(a As Range, b As Integer) Dim c As Range, cu As Integer, frg As String Application.Volatile For Each c In a With c.Font If b = 1 Then If .Color = vbBlack Then cu = cu + 1 Else If .ColorIndex = b Then cu = cu + 1 End If End With Next fcolor = cu End Function という風にし、範囲を=fcolor(D3:E37,1)としていますが、 本当なら”0”と表記されるべきなのですが”66”となってしまいます。 VBAど素人なのでよろしくお願いします。

  • VBA? 色のついた文字のセルを数えたい

    色のついた文字の記載があるセルをカウントしたく 色々調べました。結局VBAで設定する方法にしたのですが 設定しテストをするとどうしてもカウント数が合いません。 全くの初心者の為何が間違っているのか全く分かりません。 どなたか教えて下さい。 VBAも全く知らない者でしたので 調べて以下のものをそのまま貼り付けました。 Function CCount(Rng As Range, idx) Dim R As Range Dim Cnt As Long Application.Volatile For Each R In Rng   If R.Font.ColorIndex = idx Then Cnt = Cnt + 1 Next R CCount = Cnt End Function Function GetIndx(Rng As Range) If Rng.Count > 1 Then   GetIndx = vbNullString   Exit Function End If GetIndx = Rng.Font.ColorIndex End Function 何が間違っているのでしょうか?

  • エクセル VBA セルの色をSheet1とSheet2の両方を変えたいのですが・・・

    最近困っているところが表題の通りなのですが Sheet1のB2を右クリックするとB2のセルの色を変えて Sheet2のB2のセルも色を変えたいというものです。 現状で Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Dim RngA As Range, myRngA As Range Set Rng = Range("B3:W3,b7:w8,b12:w12,d13:w13,d17:w18,d22:w23") Set myRng = Intersect(Target, Rng) If myRng.Interior.ColorIndex = xlColorIndexNone Then myRng.Interior.ColorIndex = 37 Else If myRng.Interior.ColorIndex = 37 Then myRng.Interior.ColorIndex = 45 Else myRng.Interior.ColorIndex = xlColorIndexNone End If End If Cancel = True End Sub とここまではあるのですが、これをどう改造すればSheet2の同じセルの色もかわるのでしょうか? 宜しくお願いいたします

  • セル色を取得するユーザー関数

    セル色を取得するユーザー定義関数として、 Function CellColor(objCell As Range) As Integer  Application.Volatile  CellColor = objCell.Interior.ColorIndex End Function 上記のコードを標準モジュールに貼り付け、例えばB2セルに「=CellColor(A2)」という計算式を入力すると、B2セルにA2セルの塗りつぶし色のColorIndex値が表示されるようになります。 これをB2セルに例えば「=CellColor()」というように入力すれば B2セルにB2セルの塗りつぶし色のColorIndex値が表示されるようにするには、 どのようなユーザー関数を作ればよいでしょうか? よろしくお願いします。

  • Excel2007に関する質問です。

    列内の赤い文字(※セルは塗りつぶされていません)がついているセルの個数を数えたいのですが、その文字の色は条件付き書式(ルールを組んでいます)で色をつけています。 通常、セルの書式設定から色を変えた場合には、それらのセルの個数を数えるマクロは、過去の質問では以下のようになるそうです。 Function COUNTCOLOR(data As Range, color As Integer) Application.Volatile Count = 0 For Each c In data If c.Font.ColorIndex = color Then Count = Count + 1 End If Next c COUNTCOLOR = Count End Function それで使うときは =COUNTCOLOR(A:A,3) この場合だと赤文字のセルを数えることができるそうです。 ですが、ルールによって文字の色が変わっているセルをカウントできません。あくまでルールであり、書式上は通常の黒色になっています。どうしたら、ルールで色を付けたセルの個数を数えるマクロを組めるのでしょうか?? よろしくお願いします!!

  • エクセル 複数シート( VLOOKUP ユーザー定義関数

    複数シート(範囲)を指定できるVLOOKUP関数をユーザー定義で作りたいと思ってます。下記のコードではうまく動かないので教えてください。 Function VLOOKUPM(検索値 As Variant, 対象シート As String, 対象セル As Range, 列番号 As Integer) As Variant Dim i As Integer Dim r As Range Dim sh As Variant Application.Volatile sh = Split(対象シート, ",") For i = 0 To UBound(sh) Set r = Sheets(sh(i)).Range(対象セル) If 検索値 = r Then VLOOKUPM = r.Offset(0, 列番号) Exit Function End If Next End Function

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • IF関数で表示される特定の文字の色を変えたい

    IF関数で表示される特定の文字の色を変えたい Excelです。 例えば、 =if(a1=0,"abc012","def345") という関数を作って、このabcの色だけ赤に変えたいです。 マクロで Sub Macro1() Dim rng As Range Dim ptr As Integer Const tStr As String = "abc"  For Each rng In ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 23)   ptr = InStr(rng.Value, tStr)   If ptr > 0 Then    rng.Characters(Start:=ptr, Length:=Len(tStr)).Font.ColorIndex = 3   End If  Next rng End Sub と組んだのですが、普通にabcと打つと赤に変わるのですが、IF関数で表示されるabcは赤に変わりません。 どうすればいいか教えてください。

  • EXCELユーザー関数でISERRORを使うには?

    皆様、いつもお世話になっています。 0で除算すると、エラーになるのですが、それを回避するユーザー関数を作ろうと思っています。 下記のように作ったのですが、#VALUE!と、表示され、上手くエラーを回避出来ていません。 どのように、改良したら良いか教えて下さい。 Function DD(A As Integer, B As Integer) Dim RT As Range RT = A / B If Application.WorksheetFunction.IsError(RT) Then DD = "" Else DD = RT End If End Function

専門家に質問してみよう