Excel VBA 分割された年月日を表す数値を結合して日付データにする

スポンサーリンク

別々のセルに分割された年月日を表す数値を結合して日付データにする方法


図のように、日付の年・月・日が別々のセルに入力されている場合、Excelは、日付データと認識せず、単なる数値データとして認識します。

Excelでは、日付や時間を「シリアル値」で管理しています。シリアル(Serial)は「直列の」という意味がありシリアル値は「連続した数値」という意味があります。

日付のシリアル値は、1900年1月1日を起点に、日数経過とともに1ずつ加算した値です。

時間のシリアル値は、24時間を1とします。最大値が1でその後は0にもどります。00:00が1で12:00が0.5  1分が0.000694444になります。

Excelは、シリアル値をもつことにより、日付や時間の計算を簡潔にしています。

このような理由から日付のデータは、日付シリアル値を持つ日付データとして管理したほうが間違いありません。

ここでは、引数に指定した3つの数値を「年」「月」「日」と解釈して、結合した日付シリアル値を返すDateSerial【デイトシリアル】関数を使用して、別々のセルに分割された年月日を結合して日付データにするコードについて解説します。

実行結果

コードと解説

Sub 日付に変換()
Dim 日付() As Variant
Dim 行数 As Long
Dim i As Long
  行数 = Cells(Rows.Count, 1).End(xlUp).Row
ReDim 日付(行数 - 2)
  Columns(4).Insert
 For i = 0 To 行数 - 2
  日付(i) = DateSerial(Range("A" & i + 2), Range("B" & i + 2), Range("C" & i + 2))
  Range("D" & i + 2).Value = 日付(i)
 Next i
  Columns("A:C").Delete
  Range("A1").Value = "日付"
  Columns(1).AutoFit
End Sub

2行目【Dim 日付() As Variant】
数値を日付データに変換するDateSerial【デイトシリアル】関数で取得したシリアル値を配列として格納する配列変数「日付」を配列の上限値がわからないので動的配列変数としてバリアント型(Variant)で宣言します。


3行目【Dim 行数 As Long】
A列のデータが入力されている最終行番号を格納する変数「行数」を長整数型(Long)で宣言します。


4行目【Dim i As Long】
繰り返し処理の中で使用する配列の要素番号とセルの行番号を兼ねるカウンター変数「i」を長整数型(Long)で宣言します。


5行目【行数 = Cells(Rows.Count, 1).End(xlUp).Row】
Cells【セルズ】プロパティを使用して1列目のすべての行を表すRows【ロウズ】プロパティで参照したRange【レンジ】オブジェクトのCount【カウント】プロパティでセルの行数を数えてセルの最終行を参照し、データが入力されている領域の終端セルを取得するRange【レンジ】オブジェクトのEnd【エンド】プロパティを使用してRange【レンジ】オブジェクトのRow【ロウ】プロパティでその行番号を取得して変数「行数」に代入します。

つまりA列のデータが入力されている最終行番号を取得して変数「行数」に代入します。


6行目【ReDim 日付(行数 – 2)】
5行目のコードでデータの行数が判明したので、ReDim【リディム】ステートメントを使用して配列変数「日付」に上限値を設定します。

上限値は、データの最終行番号が格納されている変数「行数」-2です。2を減算する理由は、データ1行目の項目行を除くことと配列の下限値が0から始まるからです。


7行目【Columns(4).Insert】
Columns【カラムス】プロパティで4列目(D列)を参照し、Range【レンジ】オブジェクトのInsert【インサート】メソッドを使用して
4列目(D列)の手前(左側)にDateSerial【デイトシリアル】関数で取得した日付データを代入する列を挿入します。


8行目【For i = 0 To 行数 – 2】
For Next【フォーネクスト】ステートメントを使用して繰り返し処理の始まりです。

カウンター変数「i」に0から変数「行数」-2までの値を繰り返し処理の中で順次代入し、変数「行数」-2回繰り返します。


9行目【日付(i) = DateSerial(Range(“A” & i + 2), Range(“B” & i + 2), Range(“C” & i + 2))】
引数Year【イヤー】に年を表す整数値、引数Month【マンス】に月を表す整数値、引数Day【デイ】に日を表す整数値を指定して日付データ(日付のシリアル値)を返すDateSerial【デイトシリアル】関数を使用して、A列の年を表す整数値、B列の月を表す整数値、C列の日を表す整数値を設定して日付データ(日付シリアル値)に変換して、配列変数「日付」に代入します。

カウンター変数「i」は配列変数の要素番号とセルの行番号を兼ねますが、行番号のカウンター変数「i」に2を加算する理由は、カウンター変数「i」が0から始まることと1行目の項目行を除いているからです。


10行目【Range(“D” & i + 2).Value = 日付(i)】
配列変数「日付」に格納されているシリアル値の配列から繰り返し処理の中で順にデータを取り出し、追加した4行目(D列)のセルに順に代入します。


11行目【 Next i】
8行目からここまでの処理をA列のデータの最終番号が格納されている変数「行数」から2減算した回数繰り返します。

変数「行数」から2減算する理由は、繰り返しが配列変数の上限値に合わせて0から始まっていることと、項目行の1行目を繰り返し処理から除くためです。


12行目【 Columns(“A:C”).Delete】
Columns【カラムス】プロパティでAからC列を参照して、Range【レンジ】オブジェクトのDelete【デリイト】メソッドで年・月・日の数値データ列を削除します。


13行目【Range(“A1”).Value = “日付”】
7行目のコードで追加した日付データを代入する列のA1セルに文字列の「日付」を代入します。


16行目【Columns(1).AutoFit】
Columns【カラムス】プロパティで1列目(A列)を参照し、Range【レンジ】オブジェクトのAutoFit【オートフィット】メソッドを使用して最大の文字列の長さにセルの幅を合わせます。


以上で、別々のセルに分割された年月日を結合して日付データにする方法についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告