Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1364to1368
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Text in trennen

VBA - Text in trennen
20.06.2014 18:07:24
Roland

Hallo zusammen,
mein eigentliches Problem wurde bereits in einem Archiv-Thread gelöst, jedoch habe ich noch eine Nachfrage. Ich habe in Spalte A Daten stehen, die mit einem Leerzeichen voneinander getrennt sind:
1.01.14 14:47
2.01.14 14:47
15.02.14 12:54
25.02.14 13:14
05.03.14 13:36
Ich möchte mithilfe eines Makros ausschließlich das Datum (ohne Uhrzeit) in Spalte A stehen haben. Dazu verwende ich folgenden Code:

Sub Uhrzeiten_loeschen()
Dim Zeile As Long
For Zeile = 1 To 5
'Text zerlegen, Trennzeichen ist ein Leerzeichen Semikolon
Textteile = Split(Cells(Zeile, 1), " ")
'schreiben
Cells(Zeile, 1) = Textteile(y)
Next
End Sub

Das Makro funktioniert einwandfrei, jedoch können die Daten anschließend nicht mehr von einer ZÄHLENWENNS-Funktion erfasst werden. Auch die Autofilter-Funktion funktioniert nicht mehr korrekt. Vorher konnte ich auf den Autofilter klicken, hatte dann den "Datumsfilter" und konnte so z.B. auf "Letzte Woche", "Diese Woche", "Nächste Woche" filtern. Jetzt ist es ein "Textfilter".
Was auffällig ist: Nachdem das Makro seine Arbeit getan hat, verschiebt sich der Zelleninhalt nach links. (vorher stand er rechts)
Wenn ich in die Zelle hineinklicke - so als würde ich etwas hineinschreiben wollen - und dann auf "Enter" drücke, verschiebt sich der Zelleninhalt wieder nach rechts und wird sowohl von der ZÄHLENWENNS-Funktion, als auch vom Autofilter erfasst.
Ich hoffe, dass ich das Problem einigermaßen beschreiben konnte?
Schöne Grüße
Roland

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Text in trennen
20.06.2014 18:13:10
Hajo_Zi
Hallo Rolandm,
schreibe nur
Cells(Zeile, 1)=cint(Cells(Zeile, 1))

AW: VBA - Text in trennen
20.06.2014 18:36:07
Roland
Hallo Hajo,
erstmal Danke für die schnelle Antwort!
Meinst du:
Sub Uhrzeiten_loeschen()
Dim Zeile As Long
For Zeile = 1 To 5
Textteile = Split(Cells(Zeile, 1), " ")
Cells(Zeile, 1)=cint(Cells(Zeile, 1))
Next
End Sub
Leider funktioniert das noch nicht.
Hast Du noch eine Idee?
https://www.herber.de/bbs/user/91198.xlsm
Grüße
Roland

Anzeige
AW: VBA - Text in trennen
20.06.2014 18:45:07
Hajo_Zi
Hallo Roland,
ich hatte nur geschrieben also keine weitere Zeile außer Schleife und Dim.
geändert
Cells(Zeile, 1) = CLng(Cells(Zeile, 1))

AW: VBA - Text in trennen
20.06.2014 19:04:23
Roland
Hallo Hajo,
ich kann es leider immer noch nicht ganz nachvollziehen.
Jetzt steht in meinem Code:
Sub Uhrzeiten_loeschen()
Dim Zeile As Long
For Zeile = 1 To 5
Cells(Zeile, 1) = CLng(Cells(Zeile, 1))
Next
End Sub
Die Uhrzeit ist jetzt gelöscht, allerdings erhöht sich jedes Datum um einen Tag.
Kannst du vielleicht eine Beispieldatei hochladen oder direkt Deinen Code posten?
Grüße
Roland

Anzeige
AW: VBA - Text in trennen
20.06.2014 19:14:19
Hajo_Zi
Hallo Roland,
Cells(Zeile, 1) = Application.RoundDown(Cells(Zeile, 1), 0)
Gruß Hajo

AW: INT ist der richtige Befehl!
20.06.2014 19:08:55
Daniel
Hi
Die Zeile zum umwandeln der Werte muss lauten
Cells(Zeile, 1) = Int(Cells(Zeile, 1))
Nur Int, ohne C davor.
CInt funktioniert nicht, weil CInt eine Integerzahl erzeugt und die sind nur bis 32768 definiert, die aktuellen Datumswerte liegen aber schon über 40.000.
Clng würde zwar das Zahlenraumproblem beheben, hat aber den Effekt, dass es bei Uhrzeiten nach 12:00 auf den nächsten Tag aufgerundet wird und ich kann mir nicht vorstellen, dass das gewünscht ist.
Gruß Daniel

Anzeige
AW: INT ist der richtige Befehl!
20.06.2014 20:11:20
Roland
Hallo Daniel,
danke, jetzt habe ich es hinbekommen und auch verstanden!
Ich benötige also gar keine Split-Funktion, sondern muss einfach die Nachkommastellen des Datums entfernen.
Für mich zum Verständnis: Warum muss das Ganze mittels Schleife durchgeführt werden? Könnte man nicht auch
Range("A1:A100") = Int(Range("A1:A100"))
benutzen?
Auch nochmal Danke an Dich, Hajo!
Schönes WE und Gruß
Roland

AW: INT ist der richtige Befehl!
20.06.2014 20:25:05
Daniel
Hi
das funktioniert in VBA dann doch nicht ganz so einfach.
Schleifenfrei (zumindest was das VBA-Makro angeht) funktionieren folgende zwei Methoden:
1. in einer Hilfsspalte die Formel einfügnen =Ganzzahl(A1) und dann diese Formel kopieren und als Wert einfügen.
Sub Makro1()
With Range("A1:A5")
.Offset(0, 1).FormulaR1C1 = "=Int(RC1)"
.Value = .Offset(0, 1).Value
.Offset(0, 1).ClearContents
End With
End Sub
2. TEXT IN SPALTEN auf die Spalte anwenden, hierbei den Trenner zwischen Datum und Uhrzeit eifügen und die zweite Spalte nicht importieren (im Schritt 3 des Assistenten einstellbar)
Sub Makro2()
Columns(1).TextToColumns Destination:=Range("A1"), _
DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 4), Array(10, 9))
End Sub
Gruß Daniel

Anzeige
AW: INT ist der richtige Befehl!
20.06.2014 22:21:48
Roland
Luc: Danke für die Erklärung, auch wenn du mich jetzt gänzlich abgehängt hast :-) Sorry.
Daniel: Ich habe mal die zweite Variante ausprobiert (TEXT IN SPALTEN -- Danach hatte ich ursprünglich auch gesucht). Jedoch hat er jetzt teilweise aus 09.03.14 03.09.14 gemacht. Mit Arrays kenne ich mich leider auch (noch) nicht aus, daher kann ich die Variante nur schwer nachvollziehen.
Werde bei der Lösung mit der Schleife bleiben, die hat einwandfrei funktioniert :-)
Danke und Gruß
Roland

AW: INT ist der richtige Befehl!
21.06.2014 10:57:31
Daniel
Hi
Die Text-in-Spalten-Variante kannst du leicht mit Hilfe des Recorders nachvollziehen, großartige Array-Kenntnisse brauchst du da nicht.
Die einzelnen Arrays stehen für die die jeweiligen Spalten.
Der erste Wert im Array zeigt an, nach welchem Zeichen diese Spalte beginnt.
Der zweite Wert gibt das Importformat an.
Die 9 steht für "nicht importieren" (damit schneidet du die Zeit ab)
Die 4 für "Datum in der Anordnung Tag-Monat-Jahr"
Dein Fehler kommt daher dass bei dir das Datum wohl im Format Monat-Tag-Jahr vorliegt und du beim Import mal diese Einstellung testen müsstest.
Welche Zahl diesem Datumsformat entspricht, kannst du in der Hilfe nachlesen oder rausfinden,wenn du die Aktion von Hand ausführt und mit dem Recorder aufzeichnest.
Gruß Daniel

Anzeige
AW: INT ist der richtige Befehl!
24.06.2014 09:57:44
Roland
Hallo,
meine Schleife funktioniert zwar, jedoch interessiere ich mich jetzt doch noch für eine weitere Lösung :-) Die "TextToColumns"-Methode scheint wesentlich schneller zu sein.
Ich habe den Makrorekorder einmal angeworfen. Er hat mir folgendes ausgespuckt:
Sub Uhrzeiten_Entfernen()
Range("F1:F30").Select
Selection.TextToColumns Destination:=Range("F1"), DataType:=xlDelimited, _
ConsecutiveDelimiter:=True, Space:=True, FieldInfo _
:=Array(Array(0, 4), Array(1, 9))
End Sub

Beim Aufzeichnen hat alles wunderbar funktioniert. Auch das Datumsformat war korrekt. Wenn ich das Makro jedoch ein weiteres Mal ausführe (vorher importiere ich wieder frische Daten), fragt Excel mich "Sollen die Inhalte der Zellen des Zielbereichs überschrieben werden?" Wenn ich auf "OK" klicke, habe ich in F1:F30 zwar die reinen Datumswerte, daneben (in G1:G30) überschreibt er die Zellinhalte jedoch mit "PM" bzw. AM".
Woran liegt das?
Grüße
Roland

Anzeige
Viell wg Uhrzeit 00:00 bzw 12:00?!
24.06.2014 11:11:11
Luc:-?
Ja, Roland;
erstmal schwer zu sagen wg Datenform → bei Neueinlesen evtl automatisch echtes Datum (Zahl, kein Delimiter)?
Gruß Luc :-?

AW: Viell wg Uhrzeit 00:00 bzw 12:00?!
24.06.2014 11:16:00
Roland
Luc: Dass "AM" und "PM" mit den Uhrzeiten zusammenhängt, ist mir schon klar? ;-))
Jedoch soll die Uhrzeit ja gänzlich entfernt und in keiner Spalte neu ausgegeben werden. Ich dachte, dafür sorgt das Array?

AW: Excelianische Sprachverwirrung
24.06.2014 13:20:05
Daniel
Hi
die Problemursache dürfte hier die Excelianische Sprachverwirrung sein.
Excel spricht mit dem Anwender die eingestellte Landessprache, dh mit dir Deutsch.
Excel und VBA hingegen reden immer Englisch miteinader
(dies betrifft in erster Linie die Zahlen- und Datumsformate mit unterschiedlichen Dezimal- und Tausendertrennzeichen, andere Reihenfolge der Datumschreibweise 12/24-Zeitformat, Spaltentrennzeichen)
Das Problem entsteht dann, wenn du Code mit dem Recorder aufzeichnest, weil dieser dann deine "deutschen" Eingaben aufzeichnet, und dann ohne Änderung laufen lässt, weil VBA die "englischen" Vorgaben benötigen würde um Wunschgemäß zu funktionieren.
Gruß Daniel

Anzeige
AW: Excelianische Sprachverwirrung
24.06.2014 13:32:32
Roland
Hi Daniel,
aber geht aus meinem oben geposteten Code irgendwie hervor, dass er in G1:G30 die Uhrzeiten eintragen soll? Eigentlich sollen diese doch gar nicht importiert werden?
Ich habe nochmal eben eine Beispieldatei erstellt um das Problem darzustellen. Das Makro möchte immer in Spalte B etwas eintragen, was jedoch nicht passieren darf. Die Werte in Spalte B dürfen nicht überschrieben werden.
https://www.herber.de/bbs/user/91251.xlsm

Du hast doch Text-in-Spalten verwendet! Wieso ...
24.06.2014 14:06:37
Luc:-?
…soll dann in B nichts eingetragen wdn, Roland?
Voraussetzung für die erfolgreiche Anwendung dieses Features wäre ja auch das Vorliegen eines Textes (Delimiter=Leerzeichen) bzw einer komma- bzw punktgetrennten Zahl, wobei dieses „Trennzeichen“ als Delimiter interpretiert wdn könnte. Dann kommen aber auch immer 2 Bestandteile heraus, der 1. in A, der 2. in B, es sei denn, es erfolgt keine Trennung, weil die Trennung vom 1.Mal beim 2.Mal nicht mehr fktioniert, weil sich Xl infolge der 1.Trennung anders eingestellt hat und deshalb der verlangte Delimiter beim 2.Mal nicht mehr existiert. Also dürfte es sich um ein FormatProblem handeln. Evtl hilft die Verwendung von Cells(…).Text statt .Value mit Delimiter=Leerzeichen, aber sicher ist das nicht, wenn nicht gewährleistet ist, dass der DatenTyp der EinleseSpalte Date bleibt bzw generell sich nicht ändert (dann auch als DezimalZahl mit Delimiter=DezimalTrennzeichen). Also dafür Sorge tragen!
Gruß, Luc :-?

Anzeige
Ergänzung: Habe das mal näher untersucht, ...
24.06.2014 15:10:55
Luc:-?
…Roland,
Text in Spalten trennt ohnehin nach .Text, also nach dem Leerzeichen. Beim 1.Mal klappt dann auch alles, denn du hast wohl für die 2.Spalte überspringen gewählt, was dann bei dt Ansicht auch iO ist. Mit dem Neueinlesen wird dann alles US-formatig, weil VBA idR nur Englisch spricht (was auch Daniel richtig erwähnt). Dabei können interessante Effekte entstehen, nämlich vorübergehende US-Format-Darstellungen (bei älteren PCs noch zu beobachten). Da AM/PM aber eine 3.Spalte beanspruchen würde, weil es nach US-Standard ebenfalls durch Leerzeichen vom Rest getrennt ist, diese Spalte aber beim Aufzeichnen gar nicht angeboten wird, bleibt sie erhalten und wird nun zur 2. Damit kann dann dort natürlich auch keine Umwandlung in dt Format mehr erfolgen und dieser Text bleibt übrig.
Mit kleinem Trick ist es unter Verwendung von VBA auch möglich, bspw Wahrheitswerte in Englisch zu erhalten. Dazu müssen sie nur vor Ausgabe zu Text gemacht wdn. Xl wandelt dann nicht mehr in dt WAHR/FALSCH. Dieser Effekt kann auch sehr nützlich sein, wenn man Bestimmtes nur übersetzen will, zB Gültigkeits­regeln auf FmlBasis, die nur lokal (dt) vorliegen und Funktionen enthalten.
Luc :-?

Anzeige
AW: Excelianische Sprachverwirrung
24.06.2014 14:08:50
Daniel
Hi
wenn du Text-in-Spalten anwendest passiert folgendes:
1. in der Excelzelle liegt der Wert als Dezimalzahl vor: 41738,3480902778
2. Text-In-Spalten arbeitet mit Texten und muss daher diese Datumszahl in einen Datumstext wandeln, um ihn trennen zu können.
Excel macht das in "deutsch": 09.04.2014 08:21
VBA jedoch auf "englisch": 04.09.2014 08:21 AM
3. beim Auftrennen am Leerzeichen entstehen
in Excel: 2 Spalten
in VBA: 3 Spalten, weil zwischen Uhrzeit und AM auch nochmal ein Leerzeichen steht.
4. wenn die Texte wieder in die Zellen zurückgeschrieben werden, wird versucht diese in ein Datum oder Zahl zu wandeln, wenn der Text so aussieht.
Excel wendet hier standardmäßig die Deutschen regeln an, dh Tag.Monat.Jahr
VBA im Standardfall die englischen, dh Monat.Tag.Jahr.
das bedeutet für das Makro:
1. du musst die 3. Spalte berücksichtigen.
2. für das Datum musst du entweder angeben, dass das Datum in MTJ vorliegt oder du belässt es bei den Standardwerten, weil MTJ für VBA der Standard ist.
    Range("A1:A10").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
ConsecutiveDelimiter:=True, Space:=True, FieldInfo _
:=Array(Array(0, 1), Array(1, 9), Array(2, 9))

oder
   Range("A1:A10").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
ConsecutiveDelimiter:=True, Space:=True, FieldInfo _
:=Array(Array(0, 3), Array(1, 9), Array(2, 9))
Gruß Daniel

AW: Excelianische Sprachverwirrung
25.06.2014 08:06:53
Roland
Hallo,
es funktioniert!! Besten Dank! :-)
Auch für Deine ausführliche Erklärung, Daniel! Das hat mir sehr geholfen den Code an sich zu verstehen.
Grüße
Roland

Dann mal noch die Erklärung des Warum, ...
20.06.2014 20:44:48
Luc:-?
…Roland:
Setzt man einen Haltepunkt an dieser PgmStelle, wird der VBE-Intellisense unter dem Mauszeiger zeigen, warum → der Datentyp ist unverträglich! In VBA kann keine Fkt, die in einem bestimmten Argument einen skalaren Wert erwartet, ein Array verarbeiten, auch keine WorksheetFunction, die im TabBlatt an dieser Stelle mit einem ganzen Bereich fktioniert! Denn das besorgt die XlSteuerung, nicht die Fkt! Erstere steht aber für vbFktt und WFs nicht zV. Das muss man selber pgmmieren, falls man nicht die vbMethode/Fkt Evaluate (auf die Fml in TextForm) anwenden will bzw kann. Die bindet nämlich die XlSteuerung mit ein (das hat Daniel noch vergessen! :-]).
Gruß Luc :-?

AW: VBA - Text in trennen
21.06.2014 20:20:15
Peter S.
das Makro müsste laufen wenn man es anders schreibt. s.u.
Mir viel auf das bei -Split- das Datum als Text angesehen wird.
Sub Uhrzeiten_loeschen()
' Sheets("Tabelle3").Select
Dim Zeile As Long
For Zeile = 1 To 5
'Text zerlegen, Trennzeichen ist ein Leerzeichen Semikolon
Textteile = Left(Cells(Zeile, 1), InStr(Cells(Zeile, 1), " "))
'schreiben
Cells(Zeile, 1) = Textteile
Next
End Sub

1. würde das Leerzeichen damit miterwischt wdn,...
22.06.2014 02:22:01
Luc:-?
…Peter,
und 2. handelt es sich offensichtlich um echte Datumswerte, also Zahlen, in denen ein Komma, kein Leerzeichen auftritt. Du müsstest also zumindest die Formatierung abfragen, also .Text und nicht die (ungeschriebene) Default-Eigenschaft .Value verwenden. Und das ist dann ein Text und bleibt es auch, wenn man das Ergebnis nicht umwandelt.
3. ist das gehupft wie gesprungen — alle TextFktt machen aus einer Zahl einen Text, egal ob Split oder Left. Nur ist das Ergebnis bei ersterer ein Variant mit einem Array (Datentyp!) vom DatenUntertyp String, bei letzterer ein skalarer Wert vom DatenTyp String. D.h., auch, falls du bei Komma trennen würdest, wäre das Ergebnis ohne CLng-Anwendung Text, aber eben eine TextZahl, kein formatierbares Datum.
Aus einer Zahl macht man eine Ganzzahl nunmal am einfachsten mit den vbFktt Int oder Fix, falls auch negative Zahlen nach ihrem Absolutwert abgerundet wdn sollen (bei Int wird das Vorzeichen wirksam!).
Gruß, Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge