web-dev-qa-db-ja.com

Excelの単一列の複数の日付形式

次のように、さまざまな形式の日付を含む日付列を含む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
2
Crops

本当に必要なのが年だけの場合は、@ 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年より前の日付をテキスト文字列として出力します。

1
Ron Rosenfeld

入力データには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," ","")に置き換えると、この問題が解決します。
1
robinCTS