アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者です。
値によって背景色を設定したいのですが、条件が3つ以上で設定したいため、条件書式は使えず困っています。
5~10段階の任意にUnitを選択し(Inputboxなどで入力するのでしょうか?)、それに応じて背景色を設定したいのです。

1.A1:Z15まで数値が並んでいる
2.最大値と最小値を取得し、その間で例えば10に分けて色分けする。

※表で見る等高線のようなイメージです。
そもそも等高線に一般的に使われる色もよく判っていませんが、Unitに応じて寒色にしたり、暖色にしたりなんてことが出来るのでしょうか?

A 回答 (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を使う結果になってしまいます。
    • good
    • 0
この回答へのお礼

丁寧にご回答頂きありがとうございました。
また、お礼が遅くなって申し訳ありません。

処理の速度の計算までは私には分かりませんでした。
いろいろ教えて頂きありがとうございます。

お礼日時:2005/09/14 10:10

こんばんは。

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
    • good
    • 0
この回答へのお礼

修正版もご返答下さりありがとうございます。
実行すると気に入った内容になりました。
また、色の見本を見ながら、色の開始位置を変えて見易くしたりと、初心者の私でもわかる内容で感謝しています。

>ci = (c.Value - DMin) \ DUnit

1点だけ、valueの意味がよく分かりませんでした(cのみではNGでしょうか?)
まだまだ私は勉強が必要です。

こういう場合、皆さんもカラーパレットをお使いなのでしょうか?
RGBでTRYしてみましたが、私には非常に難しかったです。

お礼日時:2005/09/11 21:25

こんにちは。


すでに#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
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2005/09/10 22:36

勝手な例でやってみました。

改造できるなら参考にしてください。
値は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
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/11 21:18

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