最近、Oracleデータベースに投稿された一連の説明に依存するExcelシートの作業を開始しました。
文字列は次のようになります
18-8-1438から17-8-1439/15-5-17から4-5-18の期間の駐車場の1年間の家賃
01-08-1438から01-02-1439/28-04-2017から21-10-2017までのストリートの6か月の家賃
310113の1年間の家賃-01-01-1438から30-12-1438の期間のコンセント
説明を投稿する人が快適に感じるその他のフォーム。
ここで私の質問は、Excel関数またはvbaマクロを使用してこれらの説明から日付を簡単に抽出する方法です。ボーナスは、Webサービスを介して日付を変換するのではなく、イスラム暦の日付をその場でグレゴリオ暦に変換できることです。
編集:目的の出力について言及するのを忘れました(Mate Juhaszに感謝)。出力は、mm/dd/yyyyなどのdays360式で使用できるものである必要があります。ほとんどの場合、各エントリには契約開始日と契約終了日の2つの日付があり、同じものがイスラム暦と一緒に投稿される可能性があり、まれにイスラム暦の日付のみになります。通常の投稿形式であるdd/mm/yyyyまたはdd/mm/yyを常に確認してください。
このような場合は RegEx Find/Replace アドインを使用します。これにより、Excelに正規表現機能が追加されます。
配列数式としても使用できます。
=RegExFind(A3,"\d+-\d+-\d+")
これにより、1/2桁の日/月および2/4桁の年として入力されたすべての日付が検索され、パーツは1つの-
で区切られます。
グレゴリオ暦でのみ機能するDATEVALUE
関数を使用した例では、イスラム暦の経験がありません。
正規表現なしでVBAを使用するソリューションは次のとおりです。
Sub GetDateCandidates()
Dim i As Long, N As Long, s As String
Dim K As Long, a, bry
K = 2
N = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To N
s = Cells(i, 1).Value
ary = Split(s, " ")
For Each a In ary
bry = Split(a, "-")
If UBound(bry) = 2 Then
If (TestBry(bry)) Then
Cells(i, K).Value = "'" & a
K = K + 1
End If
End If
Next a
K = 2
Next i
End Sub
Public Function TestBry(b) As Boolean
TestBry = False
If Not IsNumeric(b(0)) Then Exit Function
If Not IsNumeric(b(1)) Then Exit Function
If Not IsNumeric(b(2)) Then Exit Function
If Len(b(0)) > 2 Then Exit Function
If Len(b(1)) > 2 Then Exit Function
If Len(b(2)) = 2 Or Len(b(2)) = 4 Then TestBry = True
End Function
フレーズは列[〜#〜] a [〜#〜]にあります。各フレーズは、区切り文字としてスペースを使用して単語に分割されます。各単語は、ダッシュを区切り文字として使用して項目に分けられます。場合:
単語はフレーズの横に保存されます:
あなたが与えた例では、それはパターンに従います。
パターンは次のとおりです。少なくとも1桁の数字の後に、ダッシュまたはスラッシュのいずれかの記号が続きます。 (x2)で、2桁または4桁で終わります。そして、それらはすべて同じ行にあります。
したがって、正規表現を使用して、そのようなパターンに一致するすべての結果を返すことができます。私の正規表現は少し錆びていますが、パターンは次のようになります。
\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}
これは、たとえば、DD/MM/YYYY形式とD-M-YY形式、およびそれらの順列に一致します。
from/to日付形式を解析する場合は、次の検索文字列を使用できます。
\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}\s*to\s*\d{1,2}[\/-]\d{1,2}[\/-]\d{2,4}
もちろん、正規表現エンジンを介して実行し、出力を収集する必要があります。
次に、上記の出力を標準化して、すべてがDD/MM/YYYY形式に一致するようにします。ただし、コンピューターのインデックス作成方法を考えると、YYYY-MM-DD検索用のもの。番号をグループ化し、検索と置換で再編成することにより、正規表現でもこれを行うことができます。それがあなたが試してみたいと思う何かのように聞こえるかどうか私に知らせてください。
最後に、標準化された出力をグレゴリオ暦に変換することをお勧めします。その年の値がたとえば1900か何かよりも低い場合は、Excelの数式で計算を実行することでこれを行うことができます。
幸運を祈ります。このようなデータの標準化は悪夢になる可能性がありますが、スクリプトと正規表現は非常に役立ちます。