• ベストアンサー

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/17070)
回答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