エクセルのセル内の文字色に関してのマクロを下記の通り書きました。


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点ほどご教授いただけると助かります。
よろしくお願いいたします。。。

このQ&Aに関連する最新のQ&A

A 回答 (12件中1~10件)

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かと。

この回答への補足

ごめんなさい。下記のURLでいけました。

今までの経緯を思うと、壊れるの前提で書いてしまいましたw

ありがとうございました。。。

補足日時:2011/12/01 16:08
    • good
    • 0
この回答へのお礼

たびたびありがとうございます。

このコードを試したところ、無事D欄・E欄ともに計算してくれました。

そして恐縮ながらもう一つ教えていただけると助かります。。。

Dの縦欄は、セル内背景色を分けているのと、文字色は1色です。
(なので、背景色ごとのセル分けで集計するための問1でした)

このセル内の背景色を4色で分けているのですが、中の文字色は関係なく、背景色の数字を数えるのはできますでしょうか?

%を出す為に、現在背景色を手計算で問1で教えていただいた数字で割っております。。。
この背景色も計算できると非常に助かります。。。
(現在のD欄とE欄の計算式が壊れないよう)

http://miyahorinn.fc2web.com/tips/s_02_02_04_02. …
とりあえず、これを元に作成してみますけど、問題があればご教授下さいませ。
よろしくお願いたします。。。

そしてありがとうございました。。。
助かりました。。。

お礼日時:2011/12/01 16:01

> 現在入れているマクロでD欄は正常に統計が取れます。


> E欄の統計を取るマクロを入れるとD欄が壊れる。

入れるとはどういう意味でしょうか?

同じ名前(Function SpecialCell)で

> なので、標準モジュール1を最初の奴
> 標準モジュール2を教えていただいた奴

としたのでしょうか。でしたらそれは無茶でしょうし"名前が適切ではありません。"
とエラーが出るのは当然です。

とりあえず名前を変えて試すか、私の示したコードだけで試してください。

丸付きの文字3文字でしたら

/3は不要で
=SpecialCell(E6:E126,3)
=SpecialCell(E6:E126,5)

でいけます。
    • good
    • 0
この回答へのお礼

>エラーが出るのは当然です。

すいません、基本素人なもので、とりあえず試してみただけですw

そして、やはりANo.7のコードに変えて、それまで計算していたD欄の統計部分の計算式を再計算するとコンパイルエラーがでます。。。

=SpecialCell(E6:E126,3)
でE欄のところに埋め込んでもやはり計算してくれませんでした。。。

ANo.11さんのコードを入れてみたところ1回答えが全ておかしくなりましたが、エラーではなかったため、再計算すると元に戻り、D欄&E欄も無事に計算できました。
こちらのコードでもう少々ごにょごにょしてみたいと思います。

長い間ご教授いただきありがとうございました。。。
また、よろしくお願いいたします。。。

お礼日時:2011/12/01 15:42

補足を読みました。


(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) などと、セル範囲を【文字列】で渡す事に変わりはありません。
    • good
    • 0

=SpecialCell("D10,D8,D29,D49,D51,D57",3)


のように、検査したいセルのアドレスをダブルクォーテーション「"」で囲んで下さい。


です。アドレスの指定している部分を「"」で囲んで「文字列」にしてください。
通常のセル範囲指定とは異なります。
    • good
    • 0

> 具体例が3文字なので1セット3文字と考えてます。



(1)を1セット3文字という意味です。

この回答への補足

あ、ごめんなさい。

括弧で出てきちゃうのですが、実際には丸がこみの数字で
(1)(2)(3)←これでワンセット3文字です。

ややこしくてすいません。

補足日時:2011/12/01 11:54
    • good
    • 0

> 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文字と考えてます。

> ちなみに標準モジュールに下記コードを追加して両方走らせると、

両方走らせるというのがちょっと意味がわかりません。

この回答への補足

早々の解答ありがとうございます。


早速いれてみたところ、、、
コンパイルエラー 名前が適切ではありません。
っと出ましてD欄の統計部分もダメになりました。
(#NAME)
いけそうな気がしたのですが、、、


>両方走らせるというがちょっと意味がわかりません。

現在入れているマクロでD欄は正常に統計が取れます。
E欄の統計を取るマクロを入れるとD欄が壊れる。

なので、標準モジュール1を最初の奴
標準モジュール2を教えていただいた奴

とやればうまくいけるかな?
っと思ったので試してみたらダメでしたw
という意味です。

補足日時:2011/12/01 11:54
    • good
    • 0

こんばんは!


せっかくコードをお考えのようなので、余計なお世話になるかもしれませんが・・・

セルを範囲指定した後に実行するマクロを考えてみました。
(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
    • good
    • 0
この回答へのお礼

ご教授ありがとうございます。

やってみました!
これはこれで面白いですね!

なのですが、すいません。
その出てきた数字をさらに集計しまとめなければいけないので、データとして張り付いていないとだめなのです。。。

でも、ありがとうございました。。。

お礼日時:2011/12/01 09:49

> 今までのを消して上記を入れてみましたが、、、


>
> 今まで出来ていた1色のところも0になりました。
> 3色のところも0になりました。。。

うーん…こちらで適当なデータを入れて試したら指定色の文字数分の数値がでるのですが…
具体的にどのようなデータなのでしょうか。

全部は無理としても

D10,D8,D29,D49,D51,D57

のデータだけでも示せますでしょうか。

この回答への補足

再度ありがとうございます。

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

ちなみに標準モジュールに下記コードを追加して両方走らせると、数値が正しく無いと出て表示自体が全部壊れてしまいました。。。

補足日時:2011/12/01 09:43
    • good
    • 0
この回答へのお礼

>例えば同一セル内で

分かりにくいので訂正。

セルが3個あって、1個のセル内に3つの数字があり、その3つの数字に色がついています。

お礼日時:2011/12/01 09:46

もう一点は



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

というコードでいかがでしょうか。

この回答への補足

ご教授ありがとうございます。

今までのを消して上記を入れてみましたが、、、

今まで出来ていた1色のところも0になりました。
3色のところも0になりました。。。


=SpecialCell(D5:D125,3)(1色のところ)
=SpecialCell(E5:E125,3)(3色のところ)

呼び出す引数の書き方がおかしいのでしょうか?

またご教授下さい。よろしくお願いいたします。

補足日時:2011/11/30 18:04
    • good
    • 0

このマクロは、ご自身で作成されたものですか?



> =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)
のように、検査したいセルのアドレスをダブルクォーテーション「"」で囲んで下さい。

この回答への補足

回答ありがとうございます。

>このマクロは、ご自身で作成されたものですか?

いえ、ほとんど素人ですので、ググッてググッてようやく見つけたマクロをいれてます。。。

第(1)の問いはNO2さんの括弧で囲む方法でいけました。

第(2)に関しては、教えていただいたマクロを今まで書いてあったのを消して再計算してみましたら、、、
今まで、=SpecialCell(D5:D125,3)
で出てきたところも0となってしまいできませんでした。。。

現状、セル内に1色の文字がある項目の計算は
=SpecialCell(D5:D125,3)
で出来てます。

セル内に1色~3色の文字がある項目の計算ができません。

(両方計算する必要があり、現在3色ある部分は目視計算)


またご教授いただければ幸いです。

補足日時:2011/11/30 18:00
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルで文字色がついているセル数をカウント

エクセル初心者です。
エクセルセルに
佐藤
鈴木
青山
渡辺
と入力されてあって佐藤と鈴木の文字の色が青だった場合文字色(青)がついているセルをカウントし,あるセルに2と表示することはできるのでしょうか。条件付書式や検索と思いましたがわかりません。よろしくお願いします。

Aベストアンサー

 質問者様お使いのエクセルのバージョンが不明なので何がアレですが
いちおう 2000 で作成した経験からアドバイスさせていただきます。


>文字色(青)がついているセルをカウントし,

1 残念ながらマクロを使わないと,ご希望のことは難しいようです。
  以下に手順を記しますので参考にしてください。

(1) [ツール]-[マクロ]-[VisualBasicEditor](またはAlt + F11)で
 VBE画面にします。

(2) VBE画面上で[挿入]-[標準モジュール]を選択します。
 するとコードウィンドウが出ますので、以下のコードを記します。
 (コピー&ペーストでもOK)

----------------------------------------------------------------
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
----------------------------------------------------------------

(3) 元のワークシートに戻って、カウント結果を表示させたいセルに、

赤字のカウントは =SpecialCell(A1:E5,3)
青字のカウントは =SpecialCell(A1:E5,5)
黄字のカウントは =SpecialCell(A1:E5,6)

 などとすればOKです。

 ただし、フォント色が黄でセル色が青などというのは、どちらにも
カウントされてしまうので注意が必要です。


 ☆参考:ブックの標準カラーパレットのインデックス番号
  (VBエディタのヘルプにて「ColorIndex」を検索、参照した)

  1 黒   2 白   3 赤   4 黄(薄)緑 5 青
  6 黄   7 桃色  8 水色  9 茶色   10 緑
  11 紺    (濃い緑)

以下 ~ 56 まであるようです。



2 別解(参考)
-----------------------------------------------------------
Function ColoredCell(rngArg As Range, rngSample As Range) As Long
For Each c In rngArg
If c.Interior.ColorIndex = rngSample.Interior.ColorIndex Then
ColoredCell = ColoredCell + 1
End If
Next
End Function
----------------------------------------------------------------
 使う際には =ColoredCell(A1:A10,A5) といったように、第1引数は
調べたい範囲、第2引数には指定する色の(サンプル)セルを当てる。
 ※SUMIF 関数の併用も可



2 実は、マクロを使わない方法があります。
  5~6年程前に、何処かで教わった記憶があります。

  色を判定する式(=GET.CELL(**,**))をブックに登録、判定結果を
 表示したいセルに、登録した式の定義名で記述する。
  その判定結果を SUMIF や COUNTIF 関数の引数として再利用する。

 以下は、その手順です。

 (1) 色を判定する式を登録
   メニューバー「挿入」→「名前」→「定義」名前の定義画面にて
  「参照範囲」欄に
   「=GET.CELL(検査の種類を指定する番号,判定したいセル番地)」
   名前欄に式の名前を(「文字の色」や「セルの色」等)付けて
  「追加」→「OK」で登録完了
☆検査の種類を指定する番号とは?
20→フォントは太字か否か?を判定
24→文字フォントの色を判定
63→セルの塗りつぶし色を判定
 
 なお、後から書式を変更しても結果が自動的には更新されないので、
NOW 関数を組み込み「F9」キーで更新させた方が良いようです。
 例「=GET.CELL(**,**)+NOW()*0」(0を足している為、値に影響なし)

 (2) 判定した結果を表示させる
   判定結果を表示したいセルに「=定義した名前」という式を入力
  すると色の種類すなわち色の番号を判定結果として表示してくれる
   色の番号(Excel のヘルプでカラーインデックスを参照できる)
   例☆黒字(無指定)=>0
     赤      =>3
     青      =>5
     緑      =>10
     薄緑     =>4
     ※その他も、実際に試してみれば結果は分かるはず

 (3) 判定した結果を、SUMIF や COUNTIF関数の引数として利用する。

 言葉で説明するのは非常に難しくこれで理解していただけるかどうか
自信がありませんが、この、色の判定式を登録してしまうという方法は
Excel97 から Excel2002までのバージョンで活用できることは確認済み
です。 もちろんこれも SUMIF 関数との併用(数字として計算する)が
可能です。
 実際のサンプルファイルを見ていただければいいのですが、なかなか
良い方法が思いつきません。

 Excel2007 で読み込んでも反映されましたが、2007でどう作成するの
かは、残念ながら 2007 での作成経験がないので説明できません。



 ところで、この OkWave には Office 系ソフト専門のカテゴリもあり
ます。 そっちの方が詳しい人が多いと思うので、今後は使用ソフトの
バージョンも併記してそちらで質問されるようにした方が解決が速いと
思われます。

http://okwave.jp/207/218/c232.html

 なお、老婆心ながら、その場合の複数カテゴリにわたる(多重投稿)
マルチポストには気をつけましょう。

参考URL:http://miyahorinn.fc2web.com/faq/faq030.html,http://hp.vector.co.jp/authors/VA016119/hajimete/udf1.html

 質問者様お使いのエクセルのバージョンが不明なので何がアレですが
いちおう 2000 で作成した経験からアドバイスさせていただきます。


>文字色(青)がついているセルをカウントし,

1 残念ながらマクロを使わないと,ご希望のことは難しいようです。
  以下に手順を記しますので参考にしてください。

(1) [ツール]-[マクロ]-[VisualBasicEditor](またはAlt + F11)で
 VBE画面にします。

(2) VBE画面上で[挿入]-[標準モジュール]を選択します。
 するとコードウィンドウが出ますので...続きを読む

Qエクセル・・色の着いたセルの個数を数える関数はある?

エクセルの表内で塗りつぶしされているセルだけを数える様な関数はありますか?
セルには文字や数値は入力されておらず、塗りつぶしているだけです。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

ユーザー定義関数で作ってみました。Ver4 マクロ関数で十分だと私は思いますが、Ver 4 マクロ関数ではケシカランというような方?は、以下のようなVBAでの解決方法が便利かなって思います。

VB Editor の標準モジュールに貼り付けてください。(挿入-標準モジュール)

なお、一般のブックの標準モジュールのユーザー定義関数に、Public キーワードをつけたところで、グローバル関数になるわけではありませんので、もしその点に不安のある方は、マニュアル等で、確認されたほうがよいかもしれませんね。

なお、以下は、引数のインデックスに0を入れると、配列出力するようにしてあります。

'------------------------------------
Function ColorCellCount(範囲 As Range, Optional インデックス As Integer = 1, Optional パターン As Integer = 0)
  Dim myRng As Range
  Dim myIndex As Integer
  Dim myPattern As Integer
  Dim myColor() As Integer
  Dim Ret() As Double
  Dim c As Range
  Dim i As Long
  Dim j As Long
  Set myRng = 範囲
  myIndex = インデックス
  myPattern = パターン
For Each c In myRng
   On Error Resume Next
   If myPattern = 0 Then
     i = WorksheetFunction.Match(c.Interior.ColorIndex, myColor, 0)
   Else
     i = WorksheetFunction.Match(c.Font.ColorIndex, myColor, 0)
   End If
   If i = 0 Then
     ReDim Preserve myColor(j)
     ReDim Preserve Ret(j)
      If myPattern = 0 Then
       myColor(j) = c.Interior.ColorIndex
      Else
       myColor(j) = c.Font.ColorIndex
      End If
      Ret(j) = 1
     j = j + 1
     On Error GoTo 0
     Else
      Ret(i - 1) = Ret(i - 1) + 1
   End If
  Next
  If myIndex <= 0 Then
   ColorCellCount = Ret()
  ElseIf myIndex > UBound(Ret) + 1 Then
   ColorCellCount = Ret(UBound(Ret()))
   Else
   ColorCellCount = Ret(myIndex - 1)
  End If
  Set myRng = Nothing
End Function

ワークシート上での使い方は、

A列
色付き
色なし
色なし
色付き
色付き

=ColorCellCount(A1:A5, 1 )

とすれば、上から数えて、1番目の色のセルの数が出ます。

=ColorCellCount(A1:A5, 2 )
を入れれば、色なしのセルの数が出ます。

=SUMPRODUCT(ColorCellCount(A1:A5, 0 ))

とすれば、全部の合計が出ます。

なお、
=ColorCellCount(A1:A5,1,1)

とすれば、文字の色を数えます。

こんにちは。

ユーザー定義関数で作ってみました。Ver4 マクロ関数で十分だと私は思いますが、Ver 4 マクロ関数ではケシカランというような方?は、以下のようなVBAでの解決方法が便利かなって思います。

VB Editor の標準モジュールに貼り付けてください。(挿入-標準モジュール)

なお、一般のブックの標準モジュールのユーザー定義関数に、Public キーワードをつけたところで、グローバル関数になるわけではありませんので、もしその点に不安のある方は、マニュアル等で、確認されたほうがよいかもし...続きを読む

Q【Excel】 色の一致するセル数をカウントしたい。

こんにちは。

ある条件にあてはまるセルに、書式でセルの色を設定してあります。
いくつかの条件で色分けしてあるのですが、これらのセルの色が「赤」は幾つ、「青」は幾つというふうに、
カウントすることは出来るのでしょうか。

よろしくお願いいたします。

Aベストアンサー

繰り返し何度も出てくる質問です。関数でと考えているなら、直接はできません。
VBAで中身たった1行のユーザー関数を作ればできます。
http://hp.vector.co.jp/authors/VA016119/hajimete/udf1.html
など
Googleで「エクセル セル 色 カウント」などで照会すると似た質問が出る。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1225959
にはCELL関数のことも載っているが、旧いバージョンの関数なので
私は、除外して言ってます。

Qエクセルで特定の色の数字だけ計算させることはできますか?

売上げ表内で、A社は赤、B社は青と売上げ数字が混在しています。
最終的にその月の売上げを社ごとに計算したいのですが、混在しているので、今は手計算しています。
せっかく色分けしているので、赤の数字だけを足す、
青の数字だけを足すということができれば楽なのになぁと思い質問させていただきました。
SUMIF関数などでできるのでしょうか?
エクセルは2003を使用しています。
アドバイスお願いいたします。

Aベストアンサー

こんにちは。KenKen_SP です。

通常、関数は値しか扱えません。つまり、フォント色やセル背景色などの書式
を関数で扱うことはできません。では、どうするか? 方法は2つあります。

1. 4.0マクロ関数を使う
  このカテゴリー内で GET.CELL で検索すると過去に類似の質問があります。
  参考にして下さい。

2. マクロ(VBA)を使う
  フォント色で集計を行うツールを作ってみました。お試し下さい。

  【手順】
  1)[Alt]+[F11]で Visual Basic Editor (以下 VBE )を起動
  2)[挿入]-[標準モジュール]
  3)2)で開いたスペースに以下のコードをコピー&ペースト
  4)VBE を閉じる

  【使い方】
  [ツール]-[マクロ]-[マクロ]で実行

'以下コードです。


Sub フォント色別に数値集計()

  Dim rngTARGET As Range
  Dim rngTEMP  As Range
  Dim DIC    As Dictionary
  Dim rngCELL  As Range
  Dim lngC_IDX As Long
  Dim dblNUM  As Double
  Dim vntKEY  As Variant
  Dim i     As Long
  
  'ユーザーに集計範囲を指定してもらう
  If TypeName(Selection) = "Range" Then
    Set rngTEMP = Selection
  Else
    Set rngTEMP = ActiveCell
  End If
  On Error Resume Next
  Set rngTARGET = Application.InputBox( _
    Prompt:="フォント色別に数値を集計します。" _
        & vbCrLf & "集計範囲をマウスで選択して下さい。", _
    Title:="集計範囲の選択", _
    Default:=rngTEMP.Address, _
    Type:=8)
  Set rngTEMP = Nothing
  If rngTARGET Is Nothing Then Exit Sub
  On Error GoTo 0
  
  'フォント色別に集計開始
  Set DIC = CreateObject("Scripting.Dictionary")
  For Each rngCELL In rngTARGET
    With rngCELL
      If .Value <> "" And IsNumeric(.Value) Then
        lngC_IDX = .Font.ColorIndex
        If Not DIC.Exists(lngC_IDX) Then
          DIC.Add Key:=lngC_IDX, Item:=.Value
        Else
          dblNUM = .Value + DIC.Item(lngC_IDX)
          DIC.Item(lngC_IDX) = dblNUM
        End If
      End If
    End With
  Next rngCELL
  
  '結果出力
  On Error Resume Next
  Set rngTARGET = Application.InputBox( _
    Prompt:="集計が終了しました。結果の貼り付け先を指定して下さい", _
    Title:="結果出力", _
    Type:=8)
  If Not rngTARGET Is Nothing Then
    Set rngTARGET = rngTARGET.Cells(1, 1)
    i = 0
    Application.ScreenUpdating = False
    For Each vntKEY In DIC.Keys
      With rngTARGET
        With .Offset(i, 0)
          .Font.ColorIndex = vntKEY
          .Value = "FONT COLOR:= " & vntKEY
        End With
        .Offset(i, 1).Value = CDbl(DIC.Item(vntKEY))
      End With
      i = i + 1
    Next vntKEY
  End If

Terminate:
  On Error GoTo 0
  Application.ScreenUpdating = True
  Set rngTARGET = Nothing
  Set DIC = Nothing

End Sub

こんにちは。KenKen_SP です。

通常、関数は値しか扱えません。つまり、フォント色やセル背景色などの書式
を関数で扱うことはできません。では、どうするか? 方法は2つあります。

1. 4.0マクロ関数を使う
  このカテゴリー内で GET.CELL で検索すると過去に類似の質問があります。
  参考にして下さい。

2. マクロ(VBA)を使う
  フォント色で集計を行うツールを作ってみました。お試し下さい。

  【手順】
  1)[Alt]+[F11]で Visual Basic Editor (以下 VBE )を起動
  2)...続きを読む

Q背景色のカウント方法

いつもお世話になります。
Win7 Excell2010 です。

背景色のついたセルを関数でカウントしたく色々と調べました。
マクロでは知識不足の私なのでなんとか関数でと思ったのですができないようです。
何かいい方法で関数ではやはり無理でしよう

カウントするには関数か若しくはVBAでご指導仰ぎたいです。
私としては申し訳ないですが知識がなく是非ご協力いただけないでしょうか。

お願いは、例えば
B7 ~ B17 で “青色” B125=1
C7 ~ C17 で “青色” C125=2
D7 ~ D17 で “赤色” D125=1
 のようにカウントができればいいです。

よろしくお願いします。

Aベストアンサー

こんばんは!

7~17行目の色付けは手作業でしょうか?それとも条件付き書式によって色付けされているのでしょうか?
Excel2010以降であれば、
条件付き書式で色付けされているセルが判断できる「DisplayFormatオブジェクト」が使えます。

一例です。
A列の124行目以降のセルを検索したい色にあらかじめ塗りつぶしておいてください。

Sheetモジュールです。
尚、1行目は何らかのデータが入っているという前提です。
(A列の最終行を取得するために、ダミーでもよいので1行目に何らかのデータが必要です)

まず、手作業で色を付けている場合のコードです

Sub 条件付き書式なし()
Dim i As Long, j As Long, k As Long, endRow As Long, endCol As Long
endRow = ActiveSheet.UsedRange.Rows.Count
endCol = Cells(5, Columns.Count).End(xlToLeft).Column
If endRow > 123 Then
Range(Cells(124, "B"), Cells(endRow, endCol)).ClearContents
End If
For j = 2 To endCol
For i = 124 To endRow
For k = 7 To 17
If Cells(k, j).Interior.Color = Cells(i, "A").Interior.Color Then
Cells(i, j) = Cells(i, j) + 1
End If
Next k
Next i
Next j
Range(Cells(124, "B"), Cells(endRow, endCol)).SpecialCells(xlCellTypeBlanks) = 0
End Sub

次に条件付き書式によってセルが色付けされている場合のコードです。
(内容はほとんど一緒です)

Sub 条件付き書式で色付け()
Dim i As Long, j As Long, k As Long, endRow As Long, endCol As Long
endRow = ActiveSheet.UsedRange.Rows.Count
endCol = Cells(5, Columns.Count).End(xlToLeft).Column
If endRow > 123 Then
Range(Cells(124, "B"), Cells(endRow, endCol)).ClearContents
End If
For j = 2 To endCol
For i = 124 To endRow
For k = 7 To 17
If Cells(k, j).DisplayFormat.Interior.Color = Cells(i, "A").Interior.Color Then
Cells(i, j) = Cells(i, j) + 1
End If
Next k
Next i
Next j
Range(Cells(124, "B"), Cells(endRow, endCol)).SpecialCells(xlCellTypeBlanks) = 0
End Sub

※ 空白セルには「0」を表示するようにしていますが、「0」が目障りであれば
最後の
>Range(Cells(124, "B"), Cells(endRow, endCol)).SpecialCells(xlCellTypeBlanks) = 0
の1行を削除してください。m(_ _)m

こんばんは!

7~17行目の色付けは手作業でしょうか?それとも条件付き書式によって色付けされているのでしょうか?
Excel2010以降であれば、
条件付き書式で色付けされているセルが判断できる「DisplayFormatオブジェクト」が使えます。

一例です。
A列の124行目以降のセルを検索したい色にあらかじめ塗りつぶしておいてください。

Sheetモジュールです。
尚、1行目は何らかのデータが入っているという前提です。
(A列の最終行を取得するために、ダミーでもよいので1行目に何らかのデータが必要です)

まず...続きを読む

QexcelのCOUNTIF関数で、『範囲=色のついたセル』に設定したいです。

excelのCOUNTIF関数で、『範囲』の設定で、『ある一定の範囲内の色のついたセル』を
範囲として選択したい場合、どのように操作したらよいでしょうか?

たとえば、A1~A30までのセルの中で、A9、A10、A18、A19、A20、A29、A30のセルが赤で、
そのうちのA10、A18、A29、A30に「○」の記号が入っていて、その○の数を調べたい場合です。

ご存知の方、よろしくお願いいたします。

Aベストアンサー

ワークシート関数ではセルの「色番号」は取得できません。
マクロ(ユーザ定義関数)が必要です。

ユーザ定義関数で「背景色が赤で、文字列が○のセル」を数えることも可能ですが、質問は「例えば」で書かれていそうなので、あまりきっちりとマクロを書くと修正が必要になりそうです。
そこで汎用的に使えそうな「手抜きバージョン」で回答します。

まず以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。

Function Cidx(ByVal trg As Range) As Integer
 With trg.Cells(1, 1).Interior
   If .ColorIndex = xlNone Then
     Cidx = 0
   Else
     Cidx = .ColorIndex
   End If
 End With
End Function

次にVBE画面を閉じてワークシート画面に戻り、
 =Cidx(A1)
の式を1行目の空いている列(例えばB列)に入力し、30行分下にコピーします。するとA列のセルの「色番号」が表示されます(背景色なしは0)
ただしセルに値を入力した後で背景色を変更した場合は、ユーザ定義関数の結果は自動的に変わりません。Alt+Ctrl+F9で強制再計算させる必要がありますのでご注意ください

後は別の関数で赤色(色番号=3)で「○」印があるセルをカウントします
 =SUMPRODUCT((A1:A30="○")*(B1:B30=3)*1)

ワークシート関数ではセルの「色番号」は取得できません。
マクロ(ユーザ定義関数)が必要です。

ユーザ定義関数で「背景色が赤で、文字列が○のセル」を数えることも可能ですが、質問は「例えば」で書かれていそうなので、あまりきっちりとマクロを書くと修正が必要になりそうです。
そこで汎用的に使えそうな「手抜きバージョン」で回答します。

まず以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい...続きを読む

Q(EXCEL)CELLの色をカウントする。

エクセルの関数で、CELLの色パターンを数えたりできるのでしょうか。例.セルのパターンが赤色のものをカウントするなど。

Aベストアンサー

#1さんの方法が本道だと思いますが、
「なぜ、そのセルを赤にしたのか?」を判定条件にしたらCOUNTIF関数等でもカウントできませんか?

QExcel 書式を関数で判断。

Excelで、「もしA1が緑色ならば」などと、書式を関数で判断させるにはどうすればよいのでしょうか。

Aベストアンサー

#1の回答通り関数はありません。マクロでなら可能です。

ここでは「色の付いたセルを合計」という質問が結構出ています。
http://okwave.jp/kotaeru.php3?q=2000523

Qエクセルでの指定文字 カウントについて

エクセルで並んだデータでの指定した名前だけの個数をカウントするにはどうすればいいのでしょうか?

山田 高橋 佐藤
高橋 梅田 赤田
 西 山田 梅田
佐藤 山田 梅田

名前が並んだデータで「高橋」という名前が何個あるのかをカウントしたいのですがどうすればいいのでしょうか?

Aベストアンサー

 データは入力されているセルの範囲を「A1:C4」とすれば、

=COUNTIF(A1:C4,"高橋")

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報