即効テクニック |
マクロ実行中に、ユーザーが入力した日付データを、セルに代入するマクロを考えてみましょう。 ここでは、InputBoxで日付データを入力してもらいます。
Sub Sample1() Dim buf As String buf = InputBox("日付を入力してください") ActiveCell.Value = buf End SubInputBoxに"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日付を扱うマクロでは、予期せぬエラーが起こりがちです。 ケースバイケースで、柔軟に対応してください。