• ベストアンサー

VBAでセルに背景色を設定(カラーパレットorRGB)

VBA初心者です。 値によって背景色を設定したいのですが、条件が3つ以上で設定したいため、条件書式は使えず困っています。 5~10段階の任意にUnitを選択し(Inputboxなどで入力するのでしょうか?)、それに応じて背景色を設定したいのです。 1.A1:Z15まで数値が並んでいる 2.最大値と最小値を取得し、その間で例えば10に分けて色分けする。 ※表で見る等高線のようなイメージです。 そもそも等高線に一般的に使われる色もよく判っていませんが、Unitに応じて寒色にしたり、暖色にしたりなんてことが出来るのでしょうか?

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。Wendy02です。 まだ、私の書いたものは、バグが残っているようですね。どうも、このレベルで間違いをするとは、私は、調子を落としているかもしれません。すみません。 正しくは以下ですね。 ×ci = (c.Value - Min) \ unit    ↓ ci = (c.Value - lngMin) \ unit >1点だけ、valueの意味がよく分かりませんでした(cのみではNGでしょうか?) NGではありませんが、c というのは、Rangeオブジェクトですね。それをセルに出力すると、自動的に、Value にはなります。これを自動キャストと呼んでいます。 しかし、なぜ、私は、Value プロパティをつけるかというと、そのほうが、若干、出力が速いのです。他にも、Excelのいろんな環境の中で、Rangeオブジェクトだけですと、エラーになったことがあるから、Valueプロパティをつけておくのが無難かなって思います。これも、VBAの最適化のひとつです。 >RGBでTRYしてみましたが、私には非常に難しかったです。 Excelでは、RGBの微妙な色を付けたくても、56色(重複があります)のどれかの近い色に割り振られていますから、仮に、微妙な色のグラデーションを付けたいとすれば、最初に、ユーザーオプションのユーザー設定で、ColorIndexの割り振りの色を予め設定しなければなりません。 それは、非常に面倒なことなので、規定のColorIndexを使う結果になってしまいます。

enotama
質問者

お礼

丁寧にご回答頂きありがとうございました。 また、お礼が遅くなって申し訳ありません。 処理の速度の計算までは私には分かりませんでした。 いろいろ教えて頂きありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。Wendy02です。 >「Rangeメソッドは失敗しました。Globalオブジェクト」 すみません、まるっきり間違ったコードを書いていました。 なるべく、標準モジュール(記録マクロが書かれる場所と同じところ)にしてくださいね。シートモジュールの場合は、色づけする場所に置いてくださいね。 Sub 色見本() Dim i As Integer With ActiveCell For i = 0 To 56 '56以上はありません  .Offset(i, 0).Value = i  .Offset(i, 1).Value = i: .Offset(i, 1).Interior.ColorIndex = i Next i End With End Sub Sub TestColoring()   Dim lngMin As Double, lngMax As Double, unit As Double   Dim ci As Integer, c As Object, myRng As Range   Set myRng = ActiveSheet.Range("A1:Z15")   '最小値   lngMin = WorksheetFunction.Min(myRng)   '最大値   lngMax = WorksheetFunction.Max(myRng)   '1ユニット   unit = (lngMax - lngMin) / 10   If unit <> 0 Then   For Each c In myRng    If VarType(c) = vbDouble Then    ci = (c.Value - Min) \ unit    '色の始まり ColorIndex =31    c.Interior.ColorIndex = ci + 31    End If   Next c   Else    myRng.Interior.ColorIndex = ci + 31  End If End Sub

enotama
質問者

お礼

修正版もご返答下さりありがとうございます。 実行すると気に入った内容になりました。 また、色の見本を見ながら、色の開始位置を変えて見易くしたりと、初心者の私でもわかる内容で感謝しています。 >ci = (c.Value - DMin) \ DUnit 1点だけ、valueの意味がよく分かりませんでした(cのみではNGでしょうか?) まだまだ私は勉強が必要です。 こういう場合、皆さんもカラーパレットをお使いなのでしょうか? RGBでTRYしてみましたが、私には非常に難しかったです。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 すでに#1 で、出ていますので、あまり細かい説明はいたしません。 なお、色見本をつけましたので、色番号の選択にお使いください。 Sub TestColoring()   Dim min As Long, max As Long, unit As Double   Dim ci As Integer, c As Object, myRng As Range   Set myRng = Range("A1:Z15")   '最小値   min = WorksheetFunction.min(myRng)   '最大値   max = WorksheetFunction.max(myRng)   '1ユニット   unit = (max - min) / 10   For Each c In Range(myRng)    ci = (c.Value - min) \ unit    '色の始まり ColorIndex =31    c.Interior.ColorIndex = ci + 31   Next c End Sub Sub 色見本() Dim i As Integer 'オプションで、色はカスタマイズできますが、 'ColorIndexでは、56までです。RGBでやっても割り振られるだけです。 With ActiveCell For i = 0 To 56 '56以上はありません  .Cells(i + 1, 1).Value = i  .Cells(i + 1, 2).Value = i: Cells(i + 1, 2).Interior.ColorIndex = i Next i End With End Sub

enotama
質問者

お礼

ありがとうございます。 実際に動かしてみると、 For Each c In Range(myRng) でエラーになり、 「Rangeメソッドは失敗しました。Globalオブジェクト」 のメッセージが表示されてしまいました。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

勝手な例でやってみました。改造できるなら参考にしてください。 値は0-500程度の範囲内、10刻みで色を変える。 (Colorindexが50個ていどしかないので) Arrayの()内はでたらめに設定して手を抜いている。意味のあるようにカラーインデックスコードを設定してください。 RGBで指定するなら、R,G,B用の3つのArrayテーブルを作ればよい と思う。 CASE文で振り分ける手もある(略)。 Sub test01() Dim cl As Range colortb = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) m = Application.WorksheetFunction.Max(Range("a1:Z15")) m = (Int(m / 10) + 1) * 10 MsgBox m n = Application.WorksheetFunction.Min(Range("a1:Z15")) n = Int(n / 10) * 10 MsgBox n For Each cl In Range("A1:Z15") k = Int(cl / 10) cl.Interior.ColorIndex = k Next End Sub

enotama
質問者

お礼

早速のご返答ありがとうございました。 また、お礼が前後し失礼致しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAの条件分岐を利用したセルの色分け

    VBAの条件分岐を使用してセルの色分けをしようとしています。 (条件が5つあり、条件付書式では対応できないためです。) 得点による色分けを行いたいのですが、色分けを行いたいセルに関数(ただ単に「=(イコール)」です)を入れて他のセルを参照する様にしたら、色分けが無効になってしまいました。 例: 【設定した条件】  0~20点の場合  赤  21~40点の場合  橙  41~60点の場合  黄  61~80点の場合  緑  81~100点の場合 青 【現象】 VBAでプログラミング後にセルA1に数値「50」を入力したら、セルの色は「黄」になった。しかし、他のデータシートの値を参照させたいと思い、セルA1に「=データシート!B1」と入力したら、セルの色は消えてしまった。 VBAでセルの色分けをしようとする時は、セルに関数を入力してはいけないのでしょうか?条件付書式の時は問題なさそうなのですが。 お分かりになる方がいらっしゃいましたらお願いいたします。

  • Excel VBA背景色について。

    A1からE1までの行にそれぞれ違う文字が入ります。 そしてF1からJ1にはA1~E1を検索値にしてvlookup関数で文字の種類番号が表示されるようになっています。そして種類は全部で9種類あり、A1からE1まではその9種類のどれかに該当すれば条件付き書式で背景色がつくようになっています。 A1~E1はそれぞれ違う文字が入りますが、5つ全て種類は同じです。 例えばA1がvlookup関数の検索にヒットして9種類の内の1番に該当するならば、B1からE1まで全て1番という事になります。C1が4番に該当したらA1からE1全て4番ということになります。 しかし、A1からE1まで全てがvlookup関数にヒットするわけではありません。 A1とD1だけが該当してB1、C1、E1は該当せず背景は白のままです。全てヒットして綺麗に前セルの背景が一色になることもありますが、大体は1つ2つしかヒットしません。どれか一つでも該当したらその5つの種類は同じです。 そこで、該当しなかったセルの背景も同じように背景色をつけたいのですがどうすれば良いでしょうか。条件書式で重ねれば良いとも思いましたが、それぞれのセルには既に9種類の色分けをするために9つのルールが入っているので、重ねればさらに膨大な条件書式の量になるので、色の値を返せるVBAでスマートに解決できないかと思い質問させて頂きました。 説明下手でわかりにくいと思いますが、VBAでどうにか良い方法はないでしょうか。 よろしくお願いしますm(_ _ )m

  • EXCELのセルに入力した数字より背景色の塗りつぶしを行いたいのですが

    EXCELのセルに入力した数字より背景色の塗りつぶしを行いたいのですがどうすればよいのでしょうか? 閲覧ありがとうございます。 今仕事の資料を作成しています。 かなりの初心者ですので、宜しくお願いします。 使用ソフトのバージョンは EXCEL 2003 SP3になります。 現在表を作成しており、行に数字を入れ、数字にあわせ背景色をつけたいと考えています。 ※列で数値をCountifにより集計し、1がいくつ、2がいくつ・・・・とカウントしています。 セルには1~15の数字を入れ、それぞれ数字に合わせ自動で背景色を塗りつぶすことを行いたいと考えています。 書式の条件付書式により色をつけることを考えましたが、3つの条件までしか作ることが出来ずに困っています。 おそらくVBAやマクロ等を使用しないといけないと思いますが、可能なのでしょうか? プログラミングの知識が無いので、ぜひご教授のほどよろしくお願いします。

  • EXCEL2007セルの色を数式で取得したい

    EXCEL2007セルの色を数式で取得したい EXCEL2007で条件付き書式を使って現在使って特定の値が入っているセルを 条件付き書式を使って背景を赤色を変えるというシートを作成しました。 さらに、特定のセルをダブルクリックすると書式を水色に変わるという処理 をVBAで実現したのですが、既に条件付き書式によって赤くなっているセルの 背景色を水色に変えることができません。 つまり、書式設定した背景色が条件付き書式の背景色につぶされてしまいます。 書式設定した背景色(水色)の方を優先させたいので、条件付き書式の条件に セルの書式に背景色が設定されているときには条件外とするようにしたいのですが。 どうやって、数式で書式設定した背景色を取得できますか? もしくは、他の方法で実現できるアイデアがありましたら、紹介してください。 どうぞ、よろしくお願いいたします。

  • EXCEL 条件付き書式の設定

    よろしくお願いします。 FX(為替)の研究をしています。 エクセルの列(横に並んだ)数値を、条件付き書式の設定で色分けしたいんですけど、どうもやり方がわかりません。 少し変わった設定なんですけど。 例) Aの1に100と入力します。Bの1に150と入力、Cの1に70・・・・と入力したとします。 そこでBの1の所を条件付き書式の設定でAの1より(ここが重要なんですけど)20以上数値が高い場合は、赤い文字、50以上高い場合はセルを緑に、70以上高い場合はセルをあかに。 逆にAの1より20以上低い数値の場合は黄色い文字、50以上低い場合は、セルを水色に、など・・・ その続きでCの1の所を、こんどはBの1より高くなったり、低くなった場合同じように色分けをしたいんですけど。 自分でやって見たんですけど、数値をを入力して→条件付き書式の設定→ 指定の値より大きい、小さいを選び、Aの1選択して <や>と数値を入力したんですけど、どうもうまくいきません。  できないんでしょうか? どなたか、エクセルお詳しい方いらしゃいましたら、よろしくお願いします。

  • Excel VBA 条件付書式の条件満たすセル取得

    Excel2010のVBAで条件付書式の条件を満たすセルの番地を取得したい 具体的には、 Excel2010のあるシートのあるセル範囲(例えばA1~XFD1048576)に 条件付き書式が付けてあって、 (例えば、数式の条件が満たされたら背景色を赤色にするなど) この条件を満たすセルに指定した書式が付けられて表示されています。 この状態で、VBAで、この条件を満たしたセルの番地を、 順番に取得したいのですが、どのように記述すればよいでしょうか。 【追記】 数式をすべてのセルに入れて検出する方法や セルをひとつずつ数式に当てはめてみていく方法は、 セルが膨大なため容量的・時間的にNGです。 このため、条件付き書式で回避しています。 条件付き書式の判定結果である書式(この場合でしたら背景色が赤色) で判断する必要があります。(書式は背景色が赤色でなくてもいいです) よく分かりませんが、検索の中の書式で指定しても、 この条件付き書式の判定結果の書式はヒットしませんでした。

  • エクセル数値の色分け

    お世話になります エクセルの数値を色分けしたいと思っていますがやり方を教えて下さい。 たとえば、010、020、040、050、551、565 等の20種類ほどの数値ですが、それぞれの数字毎に色分けしたいと考えています。  条件付き書式でしますと3種類の条件でしか設定出来ないため 困っています。 お忙しいところ申し訳ありませんがよろしくお願い致します。 わがままですが早急にお願い致します。

  • 「フォームの背景色」と同色に設定する方法を教えてください。

    「フォームの背景色」と同色に設定する方法を教えてください。 Ms-Access2000のフォームのコントロールに対し条件付書式にて設定したいのです。 背景色は、Windowsのテーマによって変更するので、その色を背景色として設定したいのです。

  • セルの比較

    vba初心者です。 今、エクセルでvbaを勉強しながら組んでいます。 2つのセルがあり、各々には条件付き書式が設定されています。 2つのセルを比較したいのですが、条件付き書式で比較したいと思います。 条件付き書式で比較を行う場合は、どのようなコードを書けば良いのでしょうか? 宜しくお願い致します。

  • ◇セルに任意の数値を入力した数値を条件付き書式に反映させる◇

    ◇セルに任意の数値を入力した数値を条件付き書式に反映させる◇ セルに任意の数値を入力した数値を条件付き書式に反映させ、状況に応じて 色付ける幅をかえたいと思います。 その都度、指定を変更すればいいのでしょうが、広範囲なのとマクロを組んでいるので セルに毎回違う数値を入れて条件付き書式を使用したいと思っております。 何かよい方法があれば教えて頂きたいです。 宜しくお願いします。

専門家に質問してみよう