即効テクニック

書式設定関連のテクニック

「.」で区切られた日付

(Excel 97/2000/2002/2003/2007)

マクロ実行中に、ユーザーが入力した日付データを、セルに代入するマクロを考えてみましょう。 ここでは、InputBoxで日付データを入力してもらいます。

Sub Sample1()
  Dim buf As String
  buf = InputBox("日付を入力してください")
  ActiveCell.Value = buf
End Sub   
InputBoxに"2010/1/23"のように入力すれば、アクティブセルにはシリアル値が代入されます。 もし"1/23"のように年が省略されていれば現在の年の"1月23日"と解釈されます。 それぞれ、自動的に設定される表示形式は、手入力したときと同じです。 年月日の区切りに「/」ではなく「-」を使っても、日付と認識されます。 しかし「.」はダメです。「.」で区切った「H22.1.23」のようなデータは日付(シリアル値)ではなく、文字列としてセルに代入されます。 セルに手動操作で「H22.1.23」と入力したときは、Excelが自動的にシリアル値へと変換してくれます。 ただし、マクロで代入するときには変換が行われません。手入力とマクロの代入は別に扱われるからです。 似たような例はほかにもあります。たとえば、手動で「\1,000」と入力するとセルには数値の「1000」が入力されて、同時に通貨形式の表示形式が設定されます。 しかし、マクロで「\1,000」を代入すると、文字列として格納されます。 入力規則を設定して、特定のデータしか入力できない設定にしていても、マクロを使えばどんなデータも代入できてしまいます。 手入力と、マクロによる代入は、結果が異なることがあるのです。 さて、一般的に和暦では「H22.1.23」など年月日を「.」で区切るケースが少なくありません。 こうしたデータが入力されたとき、それをシリアル値に変換するにはどうしたらいいでしょう。 Excelには、文字列形式の日付データを、シリアル値に変換する関数があります。 DateValue関数です。 これを使って「H22.1.23」をシリアル値に変換してみましょう。
Sub Sample2()
  Dim buf As String
  buf = InputBox("日付を入力してください")
  buf = DateValue(buf)
  ActiveCell.Value = buf
End Sub   
実行するとエラーになります。 そもそも「H22.1.23」は日付と認識できない形式なので、DateValue関数がエラーになってしまうのです。 日付に変換できる文字列かどうかは、IsDate関数で判定できます。
Sub Sample3()
  Dim buf As String
  buf = InputBox("日付を入力してください")
  If Not IsDate(buf) Then
    MsgBox "日付形式ではありません"
    Exit Sub
  End If
  buf = DateValue(buf)
  ActiveCell.Value = buf
End Sub   
確かに、IsDate("H22.1.23") はエラーになります。 しかし、IsDate("H22/1/23") なら日付に変換できます。 入力されたデータの「.」を「/」に置換するにはReplace関数を使います。
Sub Sample4()
  Dim buf As String
  buf = InputBox("日付を入力してください")
  buf = Replace(buf, ".", "/")
  If Not IsDate(buf) Then
    MsgBox "日付形式ではありません"
    Exit Sub
  End If
  buf = DateValue(buf)
  ActiveCell.Value = buf
End Sub   
日付を扱うマクロでは、予期せぬエラーが起こりがちです。 ケースバイケースで、柔軟に対応してください。