Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Dim boo As Boolean
For Each r In Target
boo = IsEmpty(r.Value) 'Empty値かどうかを判断する
Debug.Print TypeName(r.Value)
If boo = False Then
boo = IsNumeric(r.Value)
'Empty値は変数が初期化されていないことを示す。
'Empty値は数値としては0と評価され、
'文字としては長さ0の文字列("")と評価される。
If boo = True Then
If r.Value > 100 Then
Target.Interior.ColorIndex = 1 '黒
Else
Target.Interior.ColorIndex = 4 '黄緑
End If
Else
Target.Interior.ColorIndex = 3 '赤
End If
End If
Next
End Sub
浦山大さんの投稿
(投稿ID: 3540)
ひっそりこちらにお邪魔しています。
新しいところに顔を出す度に衝撃を受けています…。
練習していて、ふと感じました。
「挿入した列が塗りつぶされてしまうけどなんでかな」
「文字列とか、明らかに数値じゃないものが入ったら、
別の色にできないかな」
こういう感じで仕分けてみたくて、
練習がてら作成してみました。
1.空白セルを挿入した場合は何もしない
2.数値で、100より大きい場合は黒
3.数値で、100より大きくない場合は黄緑
4.数値として評価できない値が入ったら赤
当初、Isnumeric関数を使って条件判断すればいいのかな?
と思って試してみました。
しかし、空白セルを貼り付けるor列を挿入すると(1.を狙って)、
何故か黄緑(3.)になってしまいました。
TypeName関数で空白セルを貼り付けた際のデータ型を調べてみたらEmpty値でした。
あれ、Empty値って数値じゃないからIsNumeric関数はFalseなんじゃないの?と思い、
ヘルプを調べてみたら、数値としては「0」を判定し(この場合はIsNumericで判断してるのでEmptyは「0)」、
文字列(String型で変数が宣言されており、Empty値が入る場合)
としては「""」を返すと記載がありました…。
IsEmpty関数を更に上側に差し込んで、漸く機能実現しました。
この時点で深く追求することではないと思うのですが、
ちょっとムキになってしまって、調べてみたら学びが得られました。
折角学んだことだったので書いてみようと思いました(^^)
※色の指定や変数名が適当です…(Boolean変数は、ほぼほぼ初めて使いました…)。
※この後で、もっといい方法があるのかもしれません。進めていきます。
小川慶一さんのコメント
(コメントID: 5017)
いろいろ研究してみてください。
空白と思えるセルに実は半角スペースなりが挿入されていた、といった場合の評価もあります。以下の条件文は参考になるかも。
[codeif len(trim(r.value)) then
'イミフな空白が入っているかもしれないけど、とにかく見た目上セルはブランク。
end if[/code]
いただいたサンプルコードについては、最終的にやりたいことが分からないので全体のことについてはコメント差し控えます。
1点だけ指摘..。
For Each 構文では個別セルに対して判定をしていますが、判定後の処理では個別に取り出したセル r ではなく、 Target のセル範囲全体に対して作業をしていますね。