VBA: Datum aus Zelle lesen?
Hallo, ich habe eine große Excel Tabelle und muss nun das Datum aus einer Zelle lesen, um es in eine andere zu schreiben. In der Zelle steht beispielsweise "neu ab 07.05.16". Jetzt muss ich aus dieser Zelle das "07.05.16" lesen und in eine andere schreiben. Die Zellen haben immer dasselbe Format: Neu ab 'Datum'. Kann mir hier jemand helfen? Das ganze soll mit VBA gemacht werden.
3 Antworten
Warum musst du das Datum auslesen? Kannst du nicht einfach den Inhalt von einer Zelle in die andere Übertragen, z.B. so?
Cells(1, 2).Value = Cells(1, 1).Value
oder
Range("B1").Value = Range("A1").Value
Von A1 in B1 schreiben. Beides macht das Gleiche, nur unterschiedliche schreibweisen
Dann z.B. so. So kannst du aus dem String "Neu ab Datum" alles herausfiltern, was hinter "Neu ab " steht und dazu das Leerzeichen entfernen. Somit hast du nur noch das Datum.
Range("B1").Value = Replace(Join(Split(Range("A1").Value, "Neu ab ")), " ", "")
oder noch einfacher, nur mit Replace (weil ausreichend)
Range("B1").Value = Replace(Range("A1").Value, "Neu ab ", "")
Wenn wirklich immer "Neu ab" vor dem Datum steht, fängt das Datum immer beim 8ten Zeichen der Zelle an. Du brauchst nichtmal VBA dafür. Einfach die Formel nehmen:
=DATWERT(TEIL(A1;8;8))
Statt A1 halt die Zelle, wo "Neu ab 07.05.16" drin steht. Und die Zelle, in die die Formel reinkommt, als Datum formatieren.
Oder falls anstatt "neu ab" auch andere Sachen drinstehen, wird das Datum wahrscheinlich immer aus den letzten acht Zeichen der Zelle bestehen. Dann wäre die passende Formel:
=DATWERT(RECHTS(A1;8))
Man kann das zwar auch als VBA-Funktion bauen, aber das wäre in dem Fall unsinnig.
weißt du wie das mit VBA läuft? Es handelt sich um ein ziemlich großes Pogramm, weshalb das ganze mit VBA laufen muss. Es sind hier mehrere Dateien. In der einen Datei steht die Spalte "Neu ab...". Ein Programm in einer weiteren Datei zieht sich Zeile für Zeile die Daten aus dieser ersten Datei und liest dann irgendwann in einer Zeile "Neu ab...". Jetzt soll in der neuen Datei, die sich mit Daten aus der Ursprungsdatei befüllt in der Spalte "Gültig_ab" das Datum entsprechend ändern. ich weiß nicht ob das jetzt verständlich beschrieben hab, jedoch ist es auf jeden Fall notwendig, dass ich das ganze mit VBA in mein Programm einbaue.
Ok. Den genauen Code kann ich dir nicht geben, weil dich dafür den bisherigen Code wissen müsste. Wahrscheinlich wird es in dem Programm schon eine "For Each" Schleife geben, die jede Zelle durchgeht. Da braucht man dann nur die entsprechende VBA-Funktion zu der oben genannten Excel-Funktion einfügen.
Ich hab dir mal was gebastelt, wo du dir abschauen kannst, wie es gehen könnte.
Public Sub DatCopy()
Dim rngAlleZellen As Range ' Alle Zellen, die ausgelesen werden sollen Dim rngAktuelleZelle As Range ' Zelle, die pro Schleifendurchlauf ausgelesen wird Dim datAktuellesDatum As Date ' Datum, was ausgelesen wurde
Set rngAlleZellen = Range("A1:A28") ' In meiner Test-Excel sind das die Zellen, wo "Neu ab " drinsteht
For Each rngAktuelleZelle In rngAlleZellen ' Hier beginnt die Schleife datAktuellesDatum = Right(rngAktuelleZelle, 8) ' Datum wird ausgelesen und in Variable gespeichert Range("C" & rngAktuelleZelle.Row).Value = datAktuellesDatum ' Datum wird in der gleichen Zeile, wie Herkunftszeile in Spalte C gespeichert Next rngAktuelleZelle ' Hier endet die Schleife End Sub
Wenn man eine Excel-Formel in VBA verwenden will, braucht man zunächst einmal den englischen Namen der Funktion.
Den bekommt man, indem man eine Formel mit der betreffenden Funktion auf Deutsch in eine Zelle schreibt (bzw. eine Zelle auswählt, in der eine Formel mit der betreffenden Funktion steht) und in der Entwicklungsumgebung im Direktfenster sich ActiveCell.Formula ausgeben lässt:
?ActiveCell.Formula
Die Funktion kann man entweder direkt mit diesem Namen verwenden oder als Bestandteil von WorksheetFunction verwendet, z. B.:
aufgerundetAufHalbeEuro = WorksheetFunction.Ceiling(Betrag, 0.5)
-----
Man könnte auch in einer Schleife nachsehen lassen, wo das Datum anfängt:
For datumStartPos = 1 To Len(zellinhalt)
If IsDate(Mid$(zellinhalt, datumStartPos)) Then Exit For 'datumStartPos
Next datumStartPos '= 1 To Len(zellinhalt)
If datumStartPos > Len(zellinhalt) Then 'kein gültiges Datum gefunden
aktuellesDatum = 0 'ungültiger Wert
Else
aktuellesDatum = CDate(Mid$(zellinhalt, datumStartPos))
End If
Einleitungstext = Left$(zellinhalt, datumStartPos - 1)
so gehts auch
=RECHTS(A1;8)
Nein leider soll ich nur das Datum herausfiltern. Es gibt quasi eine "Informationsspalte" wo eben Dinge wie "Neu ab...", "Geändert ab..." "Gelöscht ab..." steht. Dieses Datum soll genommen werden und dementsprechend die Spalten "Gültig von..." und "Gültig bis..." geändert werden.