it-swarm.com.de

Excel VBA - Text in Datum konvertieren?

Ich habe eine Spalte mit Datumsangaben (Spalte A) als Text im Format JJJJ-MM-TT, die ich versuche, in Datumsangaben umzuwandeln, so dass ich letztendlich nachschlagen kann.

Ich habe hier ein paar Themen gelesen und einige der Vorschläge ausprobiert, aber ich bekomme nichts zur Arbeit. Einer benutzte:

Columns("A").Select
Selection.NumberFormat = "date"

Dies hat das Format der Zellen bisher geändert, das Format des Werts jedoch nicht geändert, der noch als Text gespeichert wurde.

Mein Verständnis ist, dass ich CDate () verwenden muss, um das Format des Werts von Text bis Datum zu ändern. Ich habe so etwas ausprobiert:

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = CDate(c.Value)
Next c

Was gibt mir einen Typenkonfliktfehler. Ich fragte mich, ob dies daran lag, dass ich versuche, Datumswerte in einer nicht mit Datum formatierten Zelle zu speichern, also versuchte ich es mit dem obigen .NumberFormat = "Date" zu kombinieren.

Anregungen werden gebeten.

18
user1300244

Sie können eine Textspalte, die Datumsangaben ähnelt, schnell mit dem VBA-Äquivalent des Befehls Daten ► Text in Spalten des Arbeitsblatts konvertieren.

With ActiveSheet.UsedRange.Columns("A").Cells
    .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, FieldInfo:=Array(0, xlYMDFormat)
    .NumberFormat = "yyyy-mm-dd"   'change to any date-based number format you prefer the cells to display
End With

Massenoperationen sind im Allgemeinen viel schneller als das Durchlaufen von Zellen, und die Range.TextToColumns-Methode der VBA ist sehr schnell. Sie haben außerdem die Möglichkeit, eine MDY- oder DMY- oder YMD-Konvertierungsmaske festzulegen, bei der viele Textimporte auftreten, bei denen das Datumsformat nicht mit den regionalen Einstellungen des Systems übereinstimmt. Eine vollständige Liste der verfügbaren Datumsformate finden Sie unter TextFileColumnDataTypes-Eigenschaft .

Achtung: Beim Importieren von Text ist darauf zu achten, dass einige der Datumsangaben noch nicht konvertiert wurden. Ein textbasiertes Datum mit mehrdeutigen Ganzzahlen von Monat und Tag wurde möglicherweise bereits falsch konvertiert. z.B. Der 07.11.2015 wurde je nach den regionalen Systemeinstellungen möglicherweise als 07.11.2015 oder 11.07.2015 interpretiert. In solchen Fällen müssen Sie den Import abbrechen und den Text mit Daten ► Externe Daten abrufen ► Aus Text wieder einlesen und die korrekte Datumsumwandlungsmaske im Textimport-Assistenten angeben. Verwenden Sie in VBA die Workbooks.OpenText-Methode und geben Sie den xlColumnDataType an.

25
user4039065

Sie können DateValue verwenden, um Ihre Zeichenfolge in dieser Instanz in ein Datum zu konvertieren

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = DateValue(c.Value)
Next c

Es kann yyyy-mm-dd-Formatzeichenfolge direkt in einen nativen Excel-Datumswert konvertieren.

19
Sam

Neben anderen Optionen bestätige ich das mit

c.Value = CDate(c.Value)

funktioniert (gerade getestet mit der Beschreibung Ihres Falls mit Excel 2010). In den Gründen, aus denen Sie einen Fehler bei der Typüberprüfung erhalten, können Sie (z. B.) this überprüfen.

Es könnte sich um ein Gebietsschema handeln.

11
sancho.s

Vielleicht:

Sub dateCNV()
    Dim N As Long, r As Range, s As String
    N = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 1 To N
        Set r = Cells(i, "A")
        s = r.Text
        r.Clear
        r.Value = DateSerial(Left(s, 4), Mid(s, 6, 2), Right(s, 2))
    Next i
End Sub

Dies setzt voraus, dass die SpalteATextwerte wie 2013-12-25 ohne Kopfzelle enthält.

6
Gary's Student

Dieser Code funktioniert für mich

Dim N As Long, r As Range
N = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To N
    Set r = Cells(i, "B")
    r.Value = CDate(r.Value)
Next i

Versuchen Sie es, die Spalten an Ihr Blatt anzupassen

Blast aus der Vergangenheit, aber ich glaube, ich habe darauf eine einfache Antwort gefunden. Folgendes hat für mich gearbeitet. Ich denke, es ist das Äquivalent dazu, die Zelle auszuwählen, die F2 und dann die Eingabetaste drückt, wodurch Excel den Text als Datum erkennt.

Columns("A").Select
Selection.Value = Selection.Value
1

Zum OP ....__ Beim ersten Ausführen Ihrer Subroutine habe ich auch einen Typenkonfliktfehler erhalten. In meinem Fall waren es nicht datumsähnliche Daten in der ersten Zelle (d. H. Ein Header). Wenn ich den Inhalt der Headerzelle zum Testen in date-style txt geändert habe, lief es einwandfrei ...

Hoffe, das hilft auch.

1
Eric

Für DD -MM- YYYY ist hier eine einfache Problemumgehung zum Verwalten von Zeichenfolge und Datumsangaben:

fügen Sie das Datum über DD -MMM- YYYY .__ in den String ein, zum Beispiel 01-11-2017 -> 01-Nov-2017

Sie können das FORMAT (Datum, "dd -mmm-yyyy") verwenden, um Datumsangaben aus dem Arbeitsblatt in einen String einzugeben.

Wenn Sie ihn später aus einer Zeichenfolge ausgeben, verwirrt die Tage und Monate nicht.

0
Gilco

Löste das Problem für mich:

    Range(Cells(1, 1), Cells(100, 1)).Select

    For Each xCell In Selection

    xCell.Value = CDate(xCell.Value)

    Next xCell
0
bastien

Ich hatte früher ein sehr ähnliches Problem. Leider habe ich mir diesen Thread angeschaut und keine Antwort gefunden, mit der ich zufrieden war. Hoffentlich hilft das anderen. 

Mit VBA.DateSerial(year,month,day) können Sie die inhärente Ausrichtung von Excel auf das Datumsformat der USA überwinden. Das bedeutet auch, dass Sie die vollständige Kontrolle über die Daten haben, was ich persönlich lieber finde:

function convDate(str as string) as Date
  Dim day, month, year as integer
  year  = int(mid(str,1,4))
  month = int(mid(str,6,2))
  day   = int(mid(str,9,2))
  convDate = VBA.DateSerial(year,month,day)
end function
0
Sancarn

Ich habe den Typenkonflikt durch folgenden Code entfernt:

Sub ConvertToDate()

Dim r As Range
Dim setdate As Range

'in my case I have a header and no blank cells in used range,
'starting from 2nd row, 1st column
Set setdate = Range(Cells(2, 1), Cells(2, 1).End(xlDown)) 

    With setdate
        .NumberFormat = "dd.mm.yyyy" 'I have the data in format "dd.mm.yy"
        .Value = .Value
    End With

    For Each r In setdate
        r.Value = CDate(r.Value)
    Next r

End Sub

In meinem speziellen Fall habe ich die Daten im Format "dd.mm.yy".

0
Vitaliy Prushak