【Excelマクロ】文字列を日付に変更する関数

テーマはエクセルのマクロ Excelの話

エクセルで文字列を日付に変更するfuncitonを作成してみました。CSVなどで日付がExcelでは自動で日付として判定されない形式の場合に、日付に変更できるように作成してみました。

作ったfunctionの特徴

  • 引数は2つで、変換する対象の文字列、変換するためのフォーマットの文字列
  • 引数はセルを指定でも、文字列を引数に直接指定でも、作動する
  • 令和と西暦のみ対応。西暦は2桁は20xx年に変換される
  • フォーマットは先頭からの文字数でしか判定しないので区切り文字は何でも可
  • フォーマットは、令和はRR、西暦はYY、YYYYY、月はMM、日はDDで表す

文字列を日付に変換するfunction

完成版のVBAのコードです。

 
Function StrToDate(dateStrorRng, formatStrorRng) As Date
'フォーマットは、西暦はY,令和はR、月はM、日はDで表す
'それ以外の文字は判定に使われないので文字数の調整のため何の文字でも可
' RR/MM/DD もRR.MM.DD も同じ
'西暦はYで2桁の場合は20XX年になる。
'平成や昭和は対応していない。

Dim date_str As String
Dim format_str As String
Dim date_len As Long
Dim format_len As Long
Dim try_times As Long
Dim r As Long
Dim RR As String
Dim MM As String
Dim DD As String
Dim YY As String
Dim cha As String

Dim y As Long
Dim m As Long
Dim d As Long
Dim output_date

date_str = dateStrorRng

format_str = formatStrorRng

RR = ""
MM = ""
DD = ""
YY = ""

date_len = Len(date_str)

format_len = Len(format_str)

If date_len > format_len Then
    try_times = format_len
Else
    try_times = date_len
End If

For r = 1 To try_times
    cha = Mid(date_str, r, 1)
    
    Select Case Mid(format_str, r, 1)
    
        Case "R"
            RR = RR & cha
        Case "M"
            MM = MM & cha
        Case "D"
            DD = DD & cha
        Case "Y"
            YY = YY & cha
        Case Else
            'パス
    End Select
    
Next

'年
If RR = "" Then
    y = Val(YY)
    If y < 100 Then
        y = y + 2000
    End If
Else
    y = Val(RR) + 2018
End If

'月日
m = Val(MM)
d = Val(DD)

 
output_date = y & "/" & m & "/" & d

StrToDate = DateValue(output_date)

End Function

Excelのシートで関数として使用できます。

文字列を日付に変更する関数

ただし、月や日が2桁で 04 や 06 のように表示されている場合限定となっています。

05.4.1などの場合は上手く変換できません。

正規表現など使えば上手くいくのかもしれません。

まとめ

このfunctionを使用することで、Excelのセルの文字列を日付にしてセルに出力することができます。

コメント

タイトルとURLをコピーしました