2012-03-29 7 views
0

不足している日付を処理するVBA関数を記述しようとしています。日付を失うように日付を変換/フォーマット

  • 2012分の12
  • 2012年7月4日に私が必要とする

(これは、変更する必要は良いではありません):次のように日付が私のExcelのワークシートに入力することができますこのような欠落ヶ月/日付処理する: - > 2012年1月1日

  • 2012分の12 -

    • 2012> 2012年1月12日

    また、日付が入力されたセルは、テキストではなく日付である必要があり、その日付としてフォーマットされている場合ので、それは1900年

  • 答えて

    3
    のようないくつかの奇妙な日付のエントリのみを変換することができます

    列Aはテキスト形式であり、与えた3種類の形式のみが可能であると仮定します。注:列Aのセルが空の場合、数式はエラーを返しますが、必要に応じて修正できます。 DateSerialの(年、月、日):

    A    B 
    2012   =DATE(A1,1,1) 
    12/2012  =DATE(RIGHT(A2,4),LEFT(A2,2),1) 
    07/04/2012  =DATE(RIGHT(A3,4),LEFT(A3,2),MID(A3,4,2)) 
    ANY FORMAT  =IF(LEN(A4)=4,DATE(A4,1,1),IF(LEN(A4)=7,DATE(RIGHT(A2,4),LEFT(A2,2),1),DATE(RIGHT(A3,4),LEFT(A3,2),MID(A3,4,2)))) 
    
    +0

    +1いいえ完了: –

    +0

    ありがとう!素晴らしいと思われますが、私が欲しいのは、Excelシート自体ではなく、VBAで使用することです。どうやってやるの? – Tal

    2

    は、次のような日付オブジェクトを構築するためにDateSerialの機能を使用することができます。

    部品を得るためには、この分割(inputstring、 "/")のような入力文字列に分割を使用して、実行する処理のビルディングブロックとして返された配列要素を使用できます。それを一緒に置く

    ...

    Public Function DateFromString(inputString as String) as Date 
        Dim dateParts as String() 
        dateParts = Split(inputString, "/") 
        Dim year as Integer 
        Dim month as Integer 
        Dim day as Integer 
    
        If Ubound(dateParts) = 3 Then 
        month = dateParts(1) 
        day = dateParts(2) 
        year = dateParts(3) 
        Else If Ubound(dateParts) = 2 Then 
        day = dateParts(1) 
        year = dateParts(2) 
        Else If Ubound(dateParts) = 1 Then 
        year = dateParts(1) 
        End If 
    
        <check for missing date elements and provide values per business rules here...> 
    
        DateFromString = DateSerial(year, month, day) 
    End Function 
    

    私はこのコードをテストしていませんが、それはあなたが正しい方向に指摘を受ける必要があります。

    +0

    私はスプリットにLBound = 0があると思うので、あなたの条件はそれぞれUBound = 2、1、0になります。 – assylias

    関連する問題