2017-12-15 3 views
0

をすべての日付を変換していない私が持っている問題があることである新しい列への値を分割し、日付エクセルVBA次のスクリプトが正しく

Dim StartString As String 
Dim DateValue As String 
Dim y As Integer 

Dim LastRow2 As Long 
With Sheets("DataSheet") 
LastRow2 = .Cells(.Rows.Count, "L").End(xlUp).Row 'find the last row on column L 
    .Columns(13).Insert Shift:=xlToRight 'add a new column to the right of column L 
    For i = 1 To LastRow2 'loop through rows 
     If InStr(1, .Cells(i, "L"), ",") Then 
      .Cells(i, "M").Value = Split(.Cells(i, "L"), ",")(1) 'split after comma 
      StartString = .Cells(i, "L").Value 
      DateValue = "" 
      For y = 1 To Len(StartString) 'loop to remove unwanted characters 
       Select Case Asc(Mid(StartString, y, 1)) 
        Case 47 To 57 
         DateValue = DateValue & Mid(StartString, y, 1) 
       End Select 
      Next y 
     .Cells(i, "M").Value = DateValue 'return the date 
     .Cells(i, "M").NumberFormat = "dd/mm/yyyy" 'format it correctly 
     End If 
    Next i 
End With 

にテキストを変換するために私を助けている別の質問から次のスクリプトを持っていますすべての場合に変換が成功しません。これは、新しい日付を時系列で並べ替える必要がある列ヘッダーとして使用するため、コードの次の段階で問題を引き起こします。どんな助けもありがとう!

以下も同様です(入力エラーとして黄色のセルは無視してください) 緑色のセルは正常に変換されたようですが、他の多くのセルは左上に小さな緑色のエラーインジケータが表示されていますコーナー。 :

enter image description here

+0

Tiberius Claudius Neroがローマ帝国を支配し、実際に「マイルストーン」が石だった時からの日付があるようです。 – MarcinSzaleniec

答えて

0

私は次のようにあなたのコードを交換してみてください、私は犯人を見つけたと信じて:

Sub foo() 
Dim StartString As String 
Dim DateValue As String 
Dim y As Integer 
Dim LastRow As Long 
With Sheets("Datasheet") 
LastRow = .Cells(.Rows.Count, "L").End(xlUp).Row 
    .Columns(13).Insert Shift:=xlToRight 
    For i = 1 To LastRow 
     If InStr(1, .Cells(i, "L"), ",") Then 
      .Cells(i, "M").Value = Split(.Cells(i, "L"), ",")(1) 
      StartString = .Cells(i, "L").Value 
      DateValue = "" 
      For y = 1 To Len(StartString) 
       Select Case Asc(Mid(StartString, y, 1)) 
        Case 47 To 57 
         DateValue = DateValue & Mid(StartString, y, 1) 
       End Select 
      Next y 
     .Cells(i, "M").Value = DateValue 
     End If 
     If .Cells(i, "M").Value <> "" Then 
      .Cells(i, "M").Value = CDate(.Cells(i, "M").Value) 
      .Cells(i, "M").Value = Format(.Cells(i, "M").Value, "dd/mm/yyyy") 
     End If 
    Next i 
End With 
End Sub 
+0

次の行 '.Cells(i、" M ")に実行時エラーの13型不一致があります。値= CDate(.Cells(i、" M ").Value) '' – SDROB

+0

上にOption Explicit行をコメントアウトしていますか?あなたが他の問題を見つけたら教えてください。でも、これは私のために働いていました... – Xabier

+0

どのOption Explicit line?私はそれが表示されません – SDROB

1

私が処理することが容易に理解し、最も重要なことがあり、以下のコードを示唆して、あなたの例で提供したのと同様のデータでテストしてみましょう:)

Option Explicit 

Sub ExtractDate() 

    Dim DateValue As String, FinalDate As String 
    Dim I As Integer 

    Dim LastRow2 As Long 
    With Sheets("DataSheet") 

     LastRow2 = .Cells(.Rows.Count, "L").End(xlUp).Row 'find the last row on column L 
     .Columns(13).Insert Shift:=xlToRight 'add a new column to the right of column L 

     For I = 1 To LastRow2 'loop through rows 

      If InStr(1, .Cells(I, "L"), ",") Then 

       DateValue = Split(.Cells(I, "L"), ",")(1) 'split after comma 

       If IsNumeric(Left(DateValue,2)) Then 

        DateValue = Split(DateValue, "/")(1) & "/" & Split(DateValue, "/")(0) & "/" & Split(DateValue, "/")(2) 
        FinalDate = CDate(DateValue) 

        .Cells(I, "M").Value = Format(FinalDate, "dd/mm/yyyy") 
       End If 
      End If 

     Next I 

    End With 

End Sub 

enter image description here

+0

Milestoneキーワードを持つ行ではなく、日付の代わりにテキストが失敗します。それ以外の場合は、曜日と月の数字が切り替わります – SDROB

+0

@SDROB - 最初のポイントは簡単に修正できます(私の編集を参照)。 2番目の部分については、より詳細に説明できますか?あなたは全体として、日/月が逆順であると言っていますか?または、いくつかの行だけ?同じ行にしかない場合は、日付の入力方法が一貫しないため、大きな問題があります。 –

+0

最初の値 "dd"が12以下の場合、値はdd/mm/yyとしてのみ取得されます。最初の2桁が12を超えるものは数値に変換されずにテキストとして残ります。最後の日付が '.Cells(I、" M ")で書かれている理由を理解できません。 – SDROB