次のように、さまざまな形式の日付を含む日付列を含むcsvファイルがあります。
dd-mm-yyyy
yyyy-mm-dd
yyyy-mm
yyyy
この不規則なデータは単一の列にあります。
それらすべてをdd-mm-yyyy
に変換し、Excelの数式を使用してそれらから年を抽出するにはどうすればよいですか?必要な出力は次のとおりです。
Input Output
25-03-1954 25-03-1954
22-09-1987 22-09-1987
1990-01-25 25-01-1990
1968-11-15 15-11-1968
1919-01 01-01-1919
1873-02 01-02-1873
1945 01-01-1945
1933 01-01-1933
本当に必要なのが年だけの場合は、@ robinCTS式を使用してください。
結果を「実際のExcelの日付」にしたい場合
DMY
の場合、dd-mm-yyyy
としてフォーマットされます次に、次の式を使用できます。
=IFERROR(IFERROR(IFERROR(DATEVALUE(A2),DATEVALUE(A2&"-01")),DATEVALUE(A2&"-01-01")),"illegal date format")
1900年より前の日付は、Excelでは実際の日付にすることはできませんが、TEXT文字列として表すことができることに注意してください。式を微調整するのはあなたに任せます。
他の日付形式を持つ国に対して出力を国際的に認識する必要がある場合は、VBAソリューションが最適な場合があります。それが不可能な場合は、データを分割してから適切に再アセンブルするヘルパー列、または同じことを行うための非常に複雑な式を使用できます。
このUDFは、2番目のオプションの引数に応じて、実際の日付または年のみを出力することに注意してください。
Option Explicit
Function ConvertToDate(S As String, Optional Yr As Boolean = False) As Variant
Dim V
Dim dtTemp As Date
V = Split(S, "-")
Select Case UBound(V)
Case 0
dtTemp = DateSerial(V(0), 1, 1)
Case 1
dtTemp = DateSerial(V(0), V(1), 1)
Case 2
If Len(V(0)) = 4 Then
dtTemp = CDate(S)
Else
dtTemp = DateSerial(V(2), V(1), V(0))
End If
End Select
If Yr = True Then
ConvertToDate = Year(dtTemp)
Else
If Year(dtTemp) < 1900 Then
ConvertToDate = Format(dtTemp, "dd-mm-yyyy")
Else
ConvertToDate = dtTemp
End If
End If
End Function
どちらの方法も最初のセグメントを調べ、LEN > 4
の場合は1年であると想定し、次に必要な-01
を追加するかどうかを決定するためにセグメントの数を調べます。
VBAソリューションは、1900年より前の日付をテキスト文字列として出力します。
入力データには1900年より前の日付が含まれているため、状況は少し複雑になります。これに対処する最も簡単な方法は、日付のテキスト表現のみを操作することです。
実際には完全な日付は必要ないが、年だけが必要な場合は、行_2:2
_の任意のセルにこの基本的な数式を入力します。
_=IFERROR(VALUE(LEFT(A2,4)),VALUE(RIGHT(A2,4)))
_
完全な日付の場合、式はもう少し複雑です。
_=IF(MID(A2,3,1)="-",A2,CHOOSE((LEN(A2)-4)/3+1,"01-01","01"&MID(A2,5,3),RIGHT(A2,2)&MID(A2,5,3))&"-"&LEFT(A2,4))
_
説明:
完全な日付式のプリティファイドバージョンは次のとおりです。
_=
IF(
MID(A2,3,1)="-",
A2,
CHOOSE(
(LEN(A2)-4)/3+1,
"01-01",
"01"&MID(A2,5,3),
RIGHT(A2,2)&MID(A2,5,3)
)
&"-"&LEFT(A2,4)
)
_
それはかなり簡単です。少し注意が必要なのは、CHOOSE()
関数の最初の引数_(LEN(A2)-4)/3+1
_です。これにより、入力された日付文字列の長さが1ベースのインデックスにマップされます。つまり、_[yyyy, yyyy-mm, yyyy-mm-dd, dd-mm-yyyy]
_→_[4, 7, 10, 10]
_→_[1, 2, 3, 3]
_です。
注:
警告:
A2
_をTRIM(A2)
に置き換えるか、さらにはSUBSTITUTE(A2," ","")
に置き換えると、この問題が解決します。