• ベストアンサー

エクセルVBAでセルに色を付けるには

エクセル2010の質問です。 例えばA列に入力した文字のバイト数が38より多い場合、セルに色を付けたいのです。 条件付き書式で =LENB($A2:$A1048576)>38 でもよかったのですが シート内のデータをクリアすると条件付き書式までクリアされてしまい困っています。 VBAで出来るのが一番なのかなと思っていますが、ご教授お願い致します。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

#2、cjです。補足欄へのレスです。 > 最初の質問後に追加がありまして、 > A列に入力した文字数のバイト数が38よりも多い場合にセルに色を付けて、 > さらに、I列に入力した文字のバイト数が24より多い場合もセルに色を付けたいのです。 > 色々試してみましたが、上手く出来ません。 結構難しいことをしようとしていますから、うまく出来なくても無理ないです。 #2から考えると、基本設計から変えないと対応出来ませんね。 ということで、書き直しました。   今後も列を増やすことがあるかも知れませんから、   各ブロック(列)ごとに構文を揃えてあります。   ' ' A列ーーーーーーーー   から   ' ' ーーーーーーーーーー   まで   をコピーしたものを貼り付けて   ▼列の指定、■バイト数の指定、★色の指定、   の3カ所(見出しの列名も含めれば4カ所)書き換えてみてください。 ' ' =============シートモジュール============ Private Sub Worksheet_Change(ByVal Target As Range)   Dim rPrSum As Range   Dim r As Range   ' ' A列ーーーーーーーー   Set rPrSum = Intersect(Target, Range("A:A"))  '  ▼列の指定   If Not rPrSum Is Nothing Then     For Each r In rPrSum       If LenB(StrConv(r.Value, vbFromUnicode)) > 38 Then  '  ■バイト数の指定         r.Interior.Color = &H6699FF  '  ★色の指定       Else         r.Interior.ColorIndex = xlColorIndexNone       End If     Next   End If   ' ' ーーーーーーーーーー   ' ' I列ーーーーーーーー   Set rPrSum = Intersect(Target, Range("I:I"))  '  ▼列の指定   If Not rPrSum Is Nothing Then     For Each r In rPrSum       If LenB(StrConv(r.Value, vbFromUnicode)) > 24 Then  '  ■バイト数の指定         r.Interior.Color = &H6699FF  '  ★色の指定       Else         r.Interior.ColorIndex = xlColorIndexNone       End If     Next   End If   ' ' ーーーーーーーーーー   Set rPrSum = Nothing End Sub ' ' ================================= 理解に自信持てなさそうな関数、メソッド、プロパティなどがもしあれば、 VBE画面上で、各キーワードにカーソルを当てて、F1 キーを押すなどして、 VBAのヘルプの内容程度は、浚っておいてください。 今回課題の色付け対象セルを.Clearメソッドで 値消去する場合は、そちらのマクロの記述に関して   Application.EnableEvents = False   範囲.Clear   Application.EnableEvents = True のように、前後に書き加えた方が、無駄な処理をせずに済みますし、 思わぬ結果になってしまうことを避ける意味もありますし、何かとトラブルを減らせます。   イベントの発行を抑止して、   クリアして、   イベントの発行を再開 という意味なのですが、範囲.Clearを実行時には、 上記Private Sub Worksheet_Changeを実行させなくていい(させない方がいい) ということです。 以下、蛇足になりますが、、、。 システムのデザインの面で妥協点を見つけられるのであれば、 VBAで色付けする代りに条件付き書式で対応する方が簡単で管理しやすい、 (なるべくシートイベントに頼らないほうがいい) というのは、私も賛同できる考え方です。 でも例えば、他のアプリケーションからコピペしたものなどは、 背景色以外の様々な書式設定を踏襲することを避ける意味で、 .ClearContentsメソッドではなく、.Clearメソッドを用いる方が、 却って効率的なケースはあると思います。  # 仮にですけれど、.Clearに代るメソッドに、引数を指定して、   条件付き書式以外のすべてをクリアできる、   なんて、新しい機能を誰か作ってくれたなら、もっと簡単なのでしょうけれども。 一応、そういう想定(事情は色々あるでしょう、という意味)で、 私はオーダー通りにお応えしていますので。 まぁでも、上に挙げた「イベントの発行を抑止」の件などもそうですが、 > VBAでクリア処理しています そちらのマクロの記述がどんな感じか、気にはなります。 とは言え実物を見ずにはアドバイスするのも難しいですから、 こちらからは手出し出来ないことが多いんですよね。 詰まる所、その人に合ったスタイルで、 自分で管理できる内容で、仕様が満たされていて、問題なく動くなら、 それが正解でいいと私は思いますので。

akumaou
質問者

お礼

cj_moverさん、ありがとうございます。 思っている通りに色を付けることが出来ました。 知識不足、勉強不足を実感致しました。 >理解に自信持てなさそうな関数、メソッド、プロパティなどがもしあれば、 >VBE画面上で、各キーワードにカーソルを当てて、F1 キーを押すなどして、 >VBAのヘルプの内容程度は、浚っておいてください。 はい。しっかり確認して勉強致します。 .Clearメソッドでクリアしていたので条件付き書式がクリアされていました。 .ClearContentsに変更するとクリアされませんでした。 >一応、そういう想定(事情は色々あるでしょう、という意味)で、 >私はオーダー通りにお応えしていますので。 はい。条件付き書式は使用しない方向で進めたいと考えていました。 >詰まる所、その人に合ったスタイルで、 >自分で管理できる内容で、仕様が満たされていて、問題なく動くなら、 >それが正解でいいと私は思いますので。 あたたかいお言葉と丁寧な解説に感謝しています。 もっと勉強しようと思いました。 本当に本当にありがとうございました。

その他の回答 (4)

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

No.3です。 >VBAでクリア処理していますので、条件付き書式もクリアされてしまうのです。 とありますが、 >セル範囲.Clear にしていませんか? >セル範囲..ClearContents にすれば書式は消えないと思います。 そして余計なお世話かもしれませんが、No.2さんの補足を読ませていただいて・・・ VBAでA列・I列に色を付ける方法です。 (黄色にしています) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A:A,I:I")) Is Nothing Or Target.Count <> 1 Then Exit Sub With Target If .Column = 1 Then .Interior.ColorIndex = xlNone If LenB(StrConv(.Value, vbFromUnicode)) > 38 Then .Interior.ColorIndex = 6 '←黄色 End If Else .Interior.ColorIndex = xlNone If LenB(StrConv(.Value, vbFromUnicode)) > 24 Then .Interior.ColorIndex = 6 End If End If End With End Sub ※ シートモジュールです。m(_ _)m

akumaou
質問者

お礼

tom04さんのおっしゃるように >セル範囲..ClearContents で、書式はクリアされてないようになりました。 親切に教えていただきありがとうございました。

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

こんばんは! 横からお邪魔します。 >シート内のデータをクリアすると条件付き書式までクリアされてしまい困っています とありますが、 条件付き書式を設定している列そのものを削除してしまうというコトでしょうか? 普通クリアとはDeleteキーでデータのみを消去すると思うのですが・・・ データのみ消去の場合は条件付き書式ではダメでしょうか? A2セルを選択 → Shift+Ctrlキーを押しながら下矢印キーを押下 これでA2セル~A列最終行までが選択されますので この状態で条件付き書式を設定すれば大丈夫だと思います。 範囲指定されたまま → 条件付き書式 → 新しいルール → 数式を使用して・・・ → 数式欄に =LENB(A2)>38 という数式を入れ → 書式 → 塗りつぶしから好みの色を選択しOK ※ 余計なお世話だったらごめんなさいね。m(_ _)m

akumaou
質問者

お礼

アドバイスありがとうございます。 >条件付き書式を設定している列そのものを削除してしまうというコトでしょうか? >普通クリアとはDeleteキーでデータのみを消去すると思うのですが・・・ VBAでクリア処理していますので、条件付き書式もクリアされてしまうのです。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

手順 Excel画面、対象シートがアクティブな状況から、  対象シート下部のシートタブを右クリック  → [コードの表示]をクリック  表示された[SheetX モジュール]に以下をコピペ。 ' ' シートモジュール Private Sub Worksheet_Change(ByVal Target As Range)   Dim r As Range   If Intersect(Target, Range("A:A")) Is Nothing Then Exit Sub   With Intersect(Target, Range("A:A"))     .Interior.ColorIndex = xlColorIndexNone     For Each r In .Cells       If LenB(StrConv(r.Value, vbFromUnicode)) > 38 Then         r.Interior.Color = &H6699FF  '  色の指定はご自由に       End If     Next   End With End Sub 因みに、セル値のバイト長をVBAから採るには、 StrConv()関数を使います。 実際にシート上で=LENB(A1)のような数式で確認用の列を作るなどして、 ちゃんと検証した方がいいですよ。

akumaou
質問者

補足

丁寧な説明と回答ありがとうございます。 上記の手順で思っている通りに色が付きました。 ありがとうございます。 最初の質問後に追加がありまして、 A列に入力した文字数のバイト数が38よりも多い場合にセルに色を付けて、 さらに、I列に入力した文字のバイト数が24より多い場合もセルに色を付けたいのです。 色々試してみましたが、上手く出来ません。 よろしければ、ご教授お願い致します。

回答No.1

例えばこんな感じでどうでしょうか? Sub test() For r = 2 To 100 If LenB(Cells(r, 1)) > 38 Then Cells(r, 1).Interior.Color = RGB(255, 0, 255) Else Cells(r, 1).Interior.Color = xlNone End If Next End Sub 以下注意 For r = 2 To 100 の100の訳  ご質問の式から1048576はマクロの実行時間がかかりすぎると思いますので とりあえず100までにしてあります。適宜見合う数字にして下さいね。 Cells(r, 1).Interior.Color = RGB(255, 0, 255)  色はRGBで指定すれば自由ですので適当に数字を変えて下さい。

akumaou
質問者

お礼

すみません。 マクロを実行すると色は付きました。 ありがとうございます。 入力後に文字確定し、再度エンターキーで 次にセルにアクティブセルが移動したときに 色を付けることはできますか?

akumaou
質問者

補足

ご丁寧な回答ありがとうございます。 早速試してみましたが、セルに色は付きませんでした。 試した手順は (1)シート名(sheet1)を右クリックしてコードの表示 (2)左上の Microsoft excel objects 内のsheet1をクリック (3)教えていただいたVBAをコピペ すでに入力中のセルにも、新規入力したセルにも色が付きません。 試した手順はあっていますか?

関連するQ&A

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

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

  • エクセルでセルの色の数

     エクセルでセルの数の計算についてお聞きします。 条件書式でセルの色分けをしました。数の合計、文字の個数などの数式はできるのですが、セルの色の個数は数えることができるのでしょうか。もし、できるのであれば、その数式を教えてください。  例えば、Aの列には、白‥3 赤‥2というようにセルの色の個数を表示します。  今までそんな発想がなく使ってきませんでした。教えていただけるとありがたいです。よろしくお願いいたします。

  • エクセル 色つきセルのみの表示

    こんにちは いつもお世話になっています。 エクセル2003を使っています。 A列に文字データがあります。条件付書式で重複セルに色をつけてあります。 この色をつけたセルだけを表示させる方法を教えてください。 実際に色を付けてあれば検索で処理できるようですが、条件付書式でのやり方をネット上で探せませんでした。よろしくお願いします。

  • 任意のセルに色を付ける方法

    誰か教えてください! エクセルで、セルに+や+1000など、「+」を含む文字列を入力した場合、そのセルに自動的に任意の色を付けたり、(「+」単体で入力する事もある為、セルの書式設定は文字列にしてます。) また、-や-1000など「-」を含む文字列を入力した場合、そのセルに自動的に+とは別の色を付けたりする方法を教えていただけないでしょうか? ちなみに色を付けるのは、その2パターンで、+、-どちらの文字も含まれない時は、セルに色はつけないようにしたいのですが。 シート全体に一度に条件付設定などをすると、あとは入力するだけで、反映されるといったことはできますか? 宜しくお願いします。

  • エクセルでセルに色を付ける(多条件)

    質問を検索していてある程度はわかったのですが、 セルに条件によって色を付けるやり方は条件付書式でできるみたいですが、条件が3つまでしか指定できません。 4つ以上ある場合はどうすればよいでしょうか。 例えば、A1セルにはAからEまでの文字が入力されます。 入力された文字によってB1セルをAなら赤、Bなら青といった具合に違う色を表示させたいのです。 エクセル2000です。 宜しくお願いします。

  • 文字を参照して、セルに色をつけるVBAを教えてください

    Sheet1のA1に高橋と入力すると、Sheet2のA1に高橋と表示されて、さらにそのセルが黄色で塗りつぶされる というふうにしたいんですが、条件が5つ以上あるので条件付き書式では出来Excelのバージョンは2000です どなたか、お知恵を拝借できないでしょうか

  • エクセルの文章入力についてです。

    エクセルの文章入力についてです。 「折り返して全体を表示する」のように一定の文字列の幅でセルごとに分ける事はできないでしょうか? 一つのセルにある文章を入力するのは容易です。 しかし、与えられた横書きの書式は一定の文字数を入力すると、わざわざ下のセルに移動して途切れの悪い文字からの入力を強いられることになります。 要は、一旦1つのセルに入力した文章を、「折り返して全体を表示する」のように行が変わる毎に一つ下のセルに移動して一定数の列幅まで文字を入力したら一つしたのセルに移動して…を繰り返す表示は可能でしょうか。 「長さ」がキーワードかと思い、vbaのlenやlenbで試してみましたが一定の列幅に対して文字列の長さが一定せず「折り返して全体を表示する」のようには綺麗に表示されません。 ちなみにLenB(StrConv(Cells("A1"), vbFromUnicode))も試して見ましたがイマイチです。 もしかしたら、vbaなど使わなくても簡単にできるものなのでしょうか? 「折り返して全体を表示する」のように一定の文字列の幅でセルごとに分ける事はできないでしょうか?

  • Excel 「条件付き書式」でセルの範囲に色を付ける場合

    いつも大変お世話になります。 Excelの「条件付き書式」を使って指定するセルの範囲に色を付けたいのですが、どうすればよいでしょうか。状況は以下のような感じです。   A  B  C  D 1 ○  ×    文字列  ←色を付けたい行 2 ○  ○ 3 ×  × ○  文字列  ←色を付けたい行 Dセルで文字列の入力されてある行(AからDセル)に色を付けたいのです。 何とぞよろしくお願いいたします。

  • エクセルVBA 条件付き書式セルを選択

    皆様よろしくお願いいたします。 エクセル2010を使用しております。 「 連続したセル範囲」、「A1」から「S1」がありまして 一部のセルは条件付き書式にて背景色が変更されており、 それ以外は変更されておりません。 (すべてのセルは通常の背景色塗りつぶしは一切ございません。) その条件付き書式による背景色有無ですが 連続だったり とびとびだったりして規則性はありません。 (たとえば 「A1」から「K1」は色あり、 「L1」は色なし、 「M1」から「P1」は色あり、 「Q1」はなし 「R1」は色あり 「S1」は色なし)という具合です。 そしてセルの中にはアルファベット大文字で 「A1」セルには「A」、「B1」セルには「B」・・・「S1」セルには「S」と 一文字ずつ入力があります。 以上の内容で 「条件付き書式で着色されたセル」のみを 「条件付き書式による着色」を外して VBAを用いて「選択」したいのですが、どのような アプローチで行えばよろしいでしょうか? どうかよろしくお願いいたします。

  • エクセルVBAで該当するセルに色をつけたい

    ご覧いただき、ありがとうございます。 当方、VBA初心者です。 エクセルVBAで、「対象の社名」に該当するセルに色をつけたいと思っています。 それぞれ別シートになります。 たとえば、abc(株)が対象なら、 1.(株)は(株)や株式会社など表記がバラバラなので取る⇒abcの文字列が検索対象 2.「検索シート」にあるabcを検索 3.対象のセルに色をつける 4.文字列がある限り(この場合は○がついている部分はずっと)検索続ける ※○の数式はつけた方が探しやすいと思って作ったので、なくても構いません わかりづらい文章ですみません。 ぜひお知恵を貸してください><

専門家に質問してみよう