セルにキーボードから「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
セルにどんな表示形式が設定されているかは、一般的には見えません。しかし、設定されている表示形式によって、セルに表示される結果は異なります。セルに値を代入するときには、常に表示形式を意識するようにしましょう。