エクセル(VBA)で検索条件に文字色を含める方法

このQ&Aのポイント
  • エクセル(VBA)を使用して、検索条件に文字色を含める方法について知りたいです。特定の文字色を持つセルを検索し、その条件を組み合わせてセルの数を数えたいと思っています。
  • エクセル(VBA)のバージョンは2007を使用しており、複数の条件を組み合わせて、特定の文字色を持つセルの数を数えたいと考えています。検索条件には黒文字(自動)、黒文字(自動)太字、赤文字、青文字が含まれます。
  • エクセル(VBA)を使用して、特定の文字色を持つセルを検索し、条件を組み合わせて数える方法について知りたいです。黒文字(自動)、黒文字(自動)太字、青文字の文字色を持つセルを検索し、条件を組み合わせて数えたいと思っています。
回答を見る
  • ベストアンサー

エクセル(VBA) 検索条件に文字色を含める

エクセルについて質問です。 エクセルのバージョンは2007を使用しています。 基本的にはCOUNTIFS関数やSUMPRODUCT関数の考え方で複数条件を満たすセルの個数を数えたいのですが その検索条件のうちのいくつか(正確には3つの列)において、特定文字が何色かを見たいのです。 具体的には下の添付ファイルの備考A~備考Cの列のように、その3つの列のセルの中にそれぞれ黒文字(自動)、黒文字(自動)太字、赤文字、青文字が混在しており、その文字列の羅列の規則性としては 1.セル内の文字列は必ず、上で挙げた4種のフォントスタイルのうちのいずれかの # で始まる。 2.#A #B #C (#D) のように、セル内の文字列は一連の小文字列が半角スペースで区切られているとともにその一連の小文字列の最初の文字は必ず # もしくは (# であり、またその一連の小文字列は同一色同一の太さである。 3.(#A) のような、() で囲んだ一連の小文字列は黒文字(自動)スタイルだけであり、また1.でも述べたようにセル中の文字列の最初に来ることはない。 となっております。 そこでそれぞれの列について、黒文字(自動)もしくは黒文字(自動)太字もしくは青文字の # で始まるセルを検索し(つまり赤文字の # で始まるセルと何も記述のない空白のセルを除く)、 その3列を and もしくは or 条件で組み合わせ、更に1、2個条件を加えて該当する行の数をCOUNTIFS関数やSUMPRODUCT関数のように数え、返したいと思っております。 恐らくVBAを利用することとなると思います。まだまだVBAを自分で一から構築することは難しいのですが、ある程度VBAを読み解き理解していくことは可能なレベルですので、どうか大まかな構文の枠組みだけでもご教授いただけると幸いです。 よろしくお願いいたします。

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

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

こんにちは! 単純に、セル内に「赤」のフォントがない行のG列に「1」を表示するようにしてみました。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, j As Long, k As Long, c As Range, myFlg As Boolean Range("G:G").ClearContents For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row If WorksheetFunction.CountA(Range(Cells(i, "D"), Cells(i, "F"))) > 0 Then For j = 4 To 6 If Cells(i, j) <> "" Then For k = 1 To Len(Cells(i, j)) If Cells(i, j).Characters(Start:=k, Length:=1).Font.ColorIndex = 3 Then myFlg = True Exit For End If Next k End If Next j If myFlg = False Then Cells(i, "G") = 1 End If myFlg = False End If Next i End Sub 'この行まで ※ フォント色は手動でつけているという前提です。(条件付き書式ではない) これでG列にその行のセルで「赤」のフォントが1個もない場合は「1」が表示されますので 後はSUM関数等で対応してみてください。m(_ _)m

aquagraphics
質問者

お礼

tom04さま 早速ご回答くださりありがとうございます。 まずは別件になりますが、以前ここで質問させていただいた帳票出力の件で教えていただいたマクロは今でも多少手を加えたりしつつ大事に利用させていただいており、おかげさまで業務もかなり楽になっております。たいへん便利なものを本当にありがとうございました。 さて今回の件では正確に申しますと「セル内に赤のフォントがない」かどうかではなく「セル内の先頭の文字が(常に#なのですが)赤のフォントでない、もしくはセル内が空白である」かそうでないかで分類したいため多少コードは違ってくるだろうと思いますが 今後自分でこのマクロを使いこなしメンテナンスすることができるようにするためにも、何とかここからのアレンジは自分自身で頑張ってみようと思います。 今後アレンジしていく中でどうしてもわからない、うまくいかないところが出てきましたら再度ここで別の項を設けて質問させていただきたいと思っておりますのでもし見かけられましたら再度ご教授いただけると幸いです。今回もほんとうにありがとうございました。

その他の回答 (4)

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

補足 For j = 1 To 3 Range("G" & j) = MyText(j - 1) Next j より その上の最後にところで Next Range("G" & i + 1) = MyText(i) Next i と入れ込んだほうが単純ぽいですね。

aquagraphics
質問者

お礼

kmetu さま 早速の御回答ありがとうございます。私のやろうとしていることが煩雑でまた私の伝達能力不足でいろいろとご迷惑をおかけいたしました。実はこのD列~F列の中の該当条件を満たす行数を直接数えるのではなく、あくまでその3列は更にあと1、2個ある条件と組み合わせていく必要があるので多少ここからアレンジを加えていく必要があるのですが、いただいたコードを参考にさせていただきこの後はなんとか自分で頑張って思い通りのものをデザインしていきたいと思っています。 今後デザインしていく中でどうしてもうまくいかない、またわからないところが出てきましたら再度ここで別に質問させていただきたいと思っております。ですので、もし見かけられましたら再度ご教授いただけると幸いです。この度はほんとうにありがとうございました。

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

すみません行の数だったんですね 文字列の個数を計算してました 行の数でしたら Sub Sample() Dim MyText(3) As Integer, MyStart As Integer, MyLength As Integer, MyCount As Integer Dim c As Range For i = 0 To 2 For Each c In Range(Cells(2, 4 + i), Cells(9, 4 + i)) MyStart = InStr(c.Value, "#") MyLength = Len(c.Value) - InStr(MyStart, c.Value, " ") MyCount = 1 MyFlg = True If c.Value <> "" Then Do Select Case c.Characters(MyStart, MyLength).Font.Color Case vbRed MyFlg = False Case Else End Select If MyLength <> 0 Then MyStart = InStr(MyLength, c.Value, "#") End If If MyStart <> 0 Then MyLength = InStr(MyStart - 1, c.Value, " ") End If MyCount = MyCount + MyLength Loop Until Len(c.Value) < MyCount End If If MyFlg = True And c.Value <> "" Then MyText(i) = MyText(i) + 1 End If Next Next i For j = 1 To 3 Range("G" & j) = MyText(j - 1) Next j End Sub G1から下にD列E列F列の順で行数を書き出します。

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

補足です こちらより Select Case c.Characters(MyStart, MyLength).Font.ColorIndex Case Is <> 3 こちらの方が分かりやすいかもしれません Select Case c.Characters(MyStart, MyLength).Font.Color Case Is <> vbRed それとデータのないセルを考えてなかったので Do の前に If c.Value <> "" Then を Loop Until Len(c.Value) < MyCount の後に End If を追加してください。

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

赤を除くということで G1に赤を除いたその個数を表示します。 Sub Sample() Dim MyText As Integer, MyStart As Integer, MyLength As Integer, MyCount As Integer Dim c As Range For Each c In Range("D2:F9") MyStart = InStr(c.Value, "#") MyLength = Len(c.Value) - InStr(MyStart, c.Value, " ") MyCount = 1 Do Select Case c.Characters(MyStart, MyLength).Font.ColorIndex Case Is <> 3 MyText = MyText + 1 Case Else End Select If MyLength <> 0 Then MyStart = InStr(MyLength, c.Value, "#") End If If MyStart <> 0 Then MyLength = InStr(MyStart - 1, c.Value, " ") End If MyCount = MyCount + MyLength Loop Until Len(c.Value) < MyCount Next Range("G1") = MyText End Sub

関連するQ&A

  • EXCEL 2003で条件に合った合計を求めたい

    ______A ____B____ C_____D 1___111___ 1 ___10___ 60 2___111___ 2 ___10 3___222___ 2 ___10 4___333___ 1 ___10 5___333___ 2 ___10 6___333___ 3 ___10 7___444___ 1 ___10 8___444___ 3 ___10 9___555___ 1 ___10 Excel 2003環境において、上記A1:C9を対象に関数で下記条件を元に数式をD1に入力して値を求めたいです。 条件: A列の同じ値のセルを一つのグループとし、かつその中で、B列で1から始まる連番となっているグループを対象にC列のセルを合計する。 上記のセル範囲で条件に合う行は1,2,4,5,6,9行目で答えは60になります。 SUMPRODUCT関数やIF関数を併用してみましたが、うまく作ることができませんでした。 なんとか作業列やVBAを用いずに一つの数式で済ませたいです。 よろしくお願いします。

  • エクセル 複数条件に合うデータを数えたい

    エクセル 複数条件に合うデータを数えたい エクセルでA列に何らかの値が入っていて(=空欄でない)、かつB列の値が“○”の数を数えたいです。 =SUMPRODUCT(($A:$A="*")*($B:$B="○"))と入れましたがSUMPRODUCTはワイルドカードが使えないようで結果は「0」となってしまいダメでした。 エクセル2007を使ってるので =COUNTIFS($A:$A,"*",$B:$B,"○")としたらできたのですが2002を使っている人と共有したいので2002でも使える関数を使いたいです。 どうしたらいいのでしょうか?

  • Excel2007でCOUNTIFS前ゼロ否定条件

    Excel2007 のCOUNTIFS関数での否定条件の 指定方法について教えてください。 VBAのマクロの中で  (略)  For i = 1 to 10    Cells(i, "B").Formula = "=COUNTIFS(" & "A1:A10, $C$" & i & ")"  Next i   のような形で COUNTIFSを利用しています。    COUNTIFSの条件に <>を使って否定条件を指定したいのですが、以下の  ように期待した動作になりません。     例   A      B       C        D            1 '080  一般品    <>'080      =COUNTIFS(A1:A5,C1)  2 '020  一般品    <>一般品  =COUNTIFS(B1:B5,C2) 3 '040  一般品 4 '060   特別品  5 '080    一般品  セルC1の記述を変えた結果は以下の通りです。       C1      D1      備考 1)  <>'080   5    3 が入ってほしい。 2)  <>080   5    ' の有無で結果は変わらず。     '(シングルクォーテーション)は接頭辞で上記結果には無関係と理解。 3)  "<>'080"   0    "<>'080" 全体を条件値として認識してしまう。 4)  '080      2   当然 5)  <='060    3   当然   ちなみに C2に <>一般品 と条件を設定すると D2には1と期待通りの値が入ります。  1)2) の結果から A列に記述されている'080と セルC1の式に書か  れた '080 が、なぜか別の値と評価され 結果 D1が 5 となっていると理解しています。 A列のシングルクォーテーションは削除、A列の書式を文字列とし 文字列"080"とIF関数で比較すると以下の結果でした。   A    B     B列の式            1 080   FALSE  IF(A1<>"080",TRUE,FALSE)   2 020   TRUE IF(A2<>"080",TRUE,FALSE) 3 040   TRUE IF(A3<>"080",TRUE,FALSE) 4 060    TRUE  IF(A4<>"080",TRUE,FALSE) 5 080    FALSE IF(A5<>"080",TRUE,FALSE)   Excelの「数式」メニュー -「ワークシート分析」-「数式の検証」で C1セルに <>'080 、<>080、"<>'080" 、<='060 を指定した時、それぞれ 1) COUNTIFS(A1:A5,"<>'080")   2) COUNTIFS(A1:A5,"<>080")   3) COUNTIFS(A1:A5,"""<>'080""") 5) COUNTIFS(A1:A5,"<='060")  と評価されています。   また VBAのテクニックを解説するWebなどでは、"<>"と値'080を& でつなげる方法も紹介されていましたが、上記の場合結局 COUNTIFS(A1:A5,"<>080") → 5 と評価されて  しまいます。      文字列同士で比較すれば、期待する結果になりそうですが 条件の書き方には工夫がいりそうです。どのように記述すればよいでしょうか   お知恵をお借りしたくいと思います。どうかよろしくお願い致します。 以上

  • スプレッドシートの条件付き書式で2条件を適用したい

    Googleスプレッドシートの条件付き書式を利用して、添付画像のように、 1. B列の値が0ならば、A列のセルをピンク色にする。 2. C列の値が0ならば、A列の文字を太字にする。 というふうにしたいと考えています。 しかし、現時点で私は「1」しか実現できていません。 というのも、条件付き書式で 範囲に適用→A1:A3 書式ルール→カスタム書式「=B1=0」 書式設定のスタイル→セルをピンク色に とすればまずセルをピンクにはできますが、「+条件を追加」ボタンから 範囲に適用→A1:A3 書式ルール→カスタム書式「=C1=0」 書式設定のスタイル→文字を太字に を設定しても、こっちは無視されるのです。どうすればよいでしょうか。

  • エクセル VBA ある条件でセルに色をつけたいのですが、

    エクセル VBA ある条件でセルに色をつけたいのですが、 例えば、A2からA50に文字列が入っていて、ある処理を終えると、空白を除くセルに薄い水色(33)をつけます。ここまでは、VBAで作成できました。 次に、空白を除くセルが、すべて薄い水色になったら、A1を薄い黄(36)にしたいのです。 教えてください。よろしくお願いします。

  • EXCEL 検索条件をハイライト

    EXCELでシート1に A行に番号(型番)(A-1、A-2、A-3・・・・・)が入っています。 シート2のA行に検索条件になるリストがあります。 A-3、A-10 などなど この検索条件に合致したシート1のA行のセルをハイライトしたいのですが、良い方法はありますでしょうか? つまり、この場合、例えばVBAなら実行すると、シート1のA-3という文字列が入ったセルと、A-10という文字列が入ったセルがハイライト(背景の色が変わる)される、といった具合の結果を必要としています。 よろしくお願い致します。

  • エクセル、VBA、抽出複数検索について

    エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

  • エクセル2002のVBAで太文字を検索したいのですが、

    エクセル2002のVBAで太文字を検索したいのですが、 <状況> B列にチェックしたい文字が入力されています <やりたいこと> B列に入力されている文字の中から、太文字のみを抜き出して、 太字の見つかった行のG列に太文字のみを抜き出して複写したい <自作マクロの現状> セル全体の太文字検索は下記のマクロ「太字検索チェック1」で完成しましたが、 セルに記載してある文字の中で「一部は普通文字、のこり一部は太文字」と混在 しているセルの中身から太文字部分のみを別のセルに抜き出したいのですが、 そのマクロを「太字検索チェック2」のように書きました。 しかし「太字検索チェック2」の「 If dat.Font.Bold = True Then」の部分で 「型が違う・・・」のエラーで先に進みません。 どなたか、セルの中身の太文字のみを抜き出すマクロを教えてください よろしくお願いします   Sub 太字検索チェック1() i = 3 Worksheets("テスト").Activate For Each myRng In Range("B:B") セル = "b" & i If Range(セル).Font.Bold = True Then Cells(i, 7) = Cells(i, 2) ’太字のCells(i, 2)を Cells(i, 7) にコピー End If i = i + 1 If i = 1703 Then ’1703番地で終了 Exit For End If Next End Sub Sub 太字検索チェック2() i = 3 Worksheets("テスト").Activate For Each myRng In Range("B:B") 内容 = Cells(i, 2) 文字数 = Len(内容) For p = 1 To 文字数 dat = Mid(内容, p, 1)       X=8+P If dat.Font.Bold = True Then  ’1文字づつ太字を検索 Cells(i, X) = dat        ’太字なら→Cells(i, X) にコピー End If Next i = i + 1 If i = 1703 Then Exit For End If Next End Sub

  • EXCEL VBA 別シートの文字をシート内で検索

    excel2003 VBAで SHEET2に格納されているセルの文字をSHEET1のB列1~9000程度までの文字列の中で一致または部分一致するものがあればそのセル(B列のセル)をSHEET3に順次A列に出力したいのですが、うまくできません。SHEET2に格納されている場所はA列で(SHEET1、SHEET2の文字とも増える可能性あり) 宜しくお願いします。

  • エクセルの関数で教えてください。

    色々調べて重複しない関数は分かったのですが、 例: SUMPRODUCT((A1:A10="○○")/COUNTIFS(A1:A$10,A1:A$10&"",C1:C101,C31:C10&"")) この条件にさらに下記内容を追加してカウントしたいです。 B列が0と未入力以外 どうか助けて下さい!

専門家に質問してみよう