1と001の問題


セルにキーボードから「001」を入力して、Enterキーを押したら、そのセルにはどのように表示されるでしょう?

正解は「セルに設定されている表示形式によって異なる」です。もし、元のセル範囲A1:A5に「文字列」の表示形式が設定されていた場合は、"001"や"002"などが、文字列として代入されます。このとき、"001"や"002"を、"1"や"2"など純粋な数値として表示したいのでしたら、代入するときに、表示形式も変更してやります。

Sub Sample2()
    Dim i As Long
    For i = 1 To 5
        With Cells(i, 1)
            .NumberFormat = "General"
            .Value = Mid(.Value, 2)
        End With
    Next i
End Sub

上記のコードでは、表示形式を「標準」に変更していますが、必要であれば「数値」などに設定してください。

もし、元のセル範囲A1:A5に「標準」の表示形式が設定されていた場合は、最初のマクロを実行すると、セルには"1"や"2"のように、"00"が取り除かれた数値が代入されます。そうではなく、"001"や"002"のように"00"を付けたまま表示したいのでしたら、代入のときに、表示形式を「文字列」に設定してやります。

Sub Sample3()
    Dim i As Long
    For i = 1 To 5
        With Cells(i, 1)
            .NumberFormat = "@"
            .Value = Mid(.Value, 2)
        End With
    Next i
End Sub

この手の問題は、セルに入力された日付を操作するときにも発生します。たとえば下図のように、セル範囲A1:A5に日付(シリアル値)が入力されていたとします。

これら日付のうち「月を表す数値」だけを、同じセルに代入しようとして次のようなマクロを考えたとします。

Sub Sample4()
    Dim i As Long
    For i = 1 To 5
        Cells(i, 1) = Month(Cells(i, 1))
    Next i
End Sub

もちろん、結果はうまくいきません。ちなみに、下図のようになるでしょう。

Month関数は、正しく「月を表す数値」を抜き出すのですが、 元のセル範囲A1:A5に「yyyy/m/d」という日付の表示形式が設定されていますので、月の"3"や"10"などが日付(シリアル値)として表示されてしまいます。こんなときも、同じように表示形式を設定し直さなければなりません。

Sub Sample5()
    Dim i As Long
    For i = 1 To 5
        With Cells(i, 1)
            .NumberFormat = "General"
            .Value = Month(.Value)
        End With
    Next i
End Sub

セルにどんな表示形式が設定されているかは、一般的には見えません。しかし、設定されている表示形式によって、セルに表示される結果は異なります。セルに値を代入するときには、常に表示形式を意識するようにしましょう。