投稿/コメントを表示します。

お世話様です。
ひっそりこちらにお邪魔しています。
新しいところに顔を出す度に衝撃を受けています…。

練習していて、ふと感じました。
「挿入した列が塗りつぶされてしまうけどなんでかな」
「文字列とか、明らかに数値じゃないものが入ったら、
別の色にできないかな」

こういう感じで仕分けてみたくて、
練習がてら作成してみました。

1.空白セルを挿入した場合は何もしない
2.数値で、100より大きい場合は黒
3.数値で、100より大きくない場合は黄緑
4.数値として評価できない値が入ったら赤

当初、Isnumeric関数を使って条件判断すればいいのかな?
と思って試してみました。
しかし、空白セルを貼り付けるor列を挿入すると(1.を狙って)、
何故か黄緑(3.)になってしまいました。

TypeName関数で空白セルを貼り付けた際のデータ型を調べてみたらEmpty値でした。
あれ、Empty値って数値じゃないからIsNumeric関数はFalseなんじゃないの?と思い、
ヘルプを調べてみたら、数値としては「0」を判定し(この場合はIsNumericで判断してるのでEmptyは「0)」、
文字列(String型で変数が宣言されており、Empty値が入る場合)
としては「""」を返すと記載がありました…。
IsEmpty関数を更に上側に差し込んで、漸く機能実現しました。

この時点で深く追求することではないと思うのですが、
ちょっとムキになってしまって、調べてみたら学びが得られました。
折角学んだことだったので書いてみようと思いました(^^)

※色の指定や変数名が適当です…(Boolean変数は、ほぼほぼ初めて使いました…)。
※この後で、もっといい方法があるのかもしれません。進めていきます。
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

2017/11/22 05:48