Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Text in Spalten
26.03.2019 10:12:10
Benni
Hallo zusammen,
ich habe ein Text-In-Spalten-Problem. Ich bekomme eine Datei angeliefert, die in der ersten Zeile der Tabelle (sozusagen über den Spaltennamen) eine Formatangabe hat. Wenn dort steht "DECIMAL", dann soll eine Umwandlung in eine Zahl ohne Nachkommastellen erfolgen, wenn dort steht "DATE", dann folglich eine Umwandlung in ein Datum.
Die Datei wird in eine Tabelle eingefügt, in der die Formatangabe in Zeile 8 steht. In Zeile 9 steht eine Beschreibung der Spalte und in Zeile 10 steht der eigentliche Spaltenname.
Mit folgendem Code wandel ich bereits erfolgreich das Format, aber mein Makro läuft danach nicht weiter, weil exakt jene Spalten, die ich umwandle, aus mysteriösem Grund auf einmal 3 Zeilen nach oben verschoben werden. Sprich, nach Anwendung haben die Spalten das richtige Format, allerdings ist das Format nun in Zeile 5, die Beschreibung in 6 und der Name in Zeile 7.
Was genau mache ich da falsch? Vielleicht kann jemand mir da helfen!
Danke Euch!!
Public Sub umwandeln()
For ziel_col = 1 To ziel_lastcol
If ziel_ws.Cells(8, ziel_col) = "DATE" Then
ziel_col_txt = Split(Cells(1, ziel_col).Address, "$")(1)
Let ziel_col_rge = ziel_col_txt & 1
ziel_ws.Columns(ziel_col_txt).TextToColumns Destination:=ziel_ws.Range(ziel_col_rge) _
, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
ziel_ws.Columns(ziel_col_txt).NumberFormat = "m/d/yyyy"
End If
If ziel_ws.Cells(8, ziel_col) = "DECIMAL" Then
ziel_col_txt = Split(Cells(1, ziel_col).Address, "$")(1)
Let ziel_col_rge = ziel_col_txt & 1
ziel_ws.Columns(ziel_col_txt).TextToColumns Destination:=ziel_ws.Range(ziel_col_rge) _
, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
ziel_ws.Columns(ziel_col_txt).NumberFormat = "0"
End If
Next ziel_col
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Text in Spalten
26.03.2019 10:33:58
Daniel
Hi
vielleicht tust du dir einfacher, wenn du einzelen Zellen nicht so kompliziert über Range(Zelladresse) ansprichst, sondern einfacher über Cells(Zeilennummer, Spaltennummer).
dann könnte dein ganzes umwandelgedöns entfallen und du würdest besser erkennen, wo du was einfügst.
Gruß Daniel
AW: Text in Spalten
26.03.2019 10:41:40
Benni
Hallo Daniel,
ich möchte die ganze Spalte (ca 15.000 Zeilen) umwandeln. Die jew. Spalte muss in das Format gewandelt werden, welches in Zeile 8 vorgegeben ist. Daher muss ich zwar in Zeile 8 die Vorgabe suchen, allerdings danach die gesamte Spalte umwandeln, daher kann ich (meines Wissens nach) dann schlecht mit Cells arbeiten (aber vielleicht denk ich da auch in die falsche Richtung oder zu kompliziert). Man könnte natürlich dann für alle Zeilen die Zellen einzeln umwandeln, da man die Spalte gefunden hat, allerdings scheint mir das nicht sehr effizient.
Aber vielleicht versteh ich Dich gerade auch falsch :)
Gruß
Benni
Anzeige
AW: Text in Spalten
26.03.2019 11:10:06
Daniel
Hi
naja, du kannst bei Columns auch die Spaltennummer angeben.
und wenn du eine Einzelzelle angibst, (z.B. als Destination), dann brauchst du , wenn du Cells verwendest, auch keinen Spaltenbuchstaben sondern kannst die Spaltennummer verwenden.
somit reicht dir dann ZielCol um die Zellen anzusprechen und du brauchst die aufwendige Umwandlung nicht:
ziel_ws.Columns(ziel_col).TextToColumns Destination:=ziel_ws.cells(1, ziel_col)...
aber das nur nebenbei.
dein eigentliches Problem dürfte daher kommen, dass die Zeilen 1-3 bei dir vollständig leer sind und somit nicht zur Usedrange gehören.
die UsedRange ist der tatsächlich genutzte Zellbereich auf dem Tabellenblatt, dh ein rechteckiger Zellbereich, der alle Zellen mit Wert, Formel, oder eigenständiger Formatierung enthält.
dabei werden aber nicht nur die nicht genutzten Zellen unterhalb ausgeschlossen, sondern auch die ungenutzten Zellen oberhalb der verwendeten Zellen.
Wenn du jetzt irgendwo ganze Spalten angibst, so gleicht Excel vor der Bearbeitung diese ganzen Spalten mit der Usedrange ab und bearbeitet nur die Zellen der Spalte, die auch zur UsedRange gehören (um unnötige Arbeit zu spalten)
dh wenn bei dir die ersten 3 Zeilen leer sind, beginnt Excel erst ab Zeile 4 mit dem bearbeiten Zellen, dh Zeile 4 ist die erste Zelle, die von dem TextInSpalten bearbeitet wird.
Wenn du jetzt die Zeile 1 als Ziel eingibst, wird vom Ergebnis die erste Zelle in die Zeile 1 eingefügt.
dh du könntest als Ziel nicht die Zelle in der Zeile 1 eingeben, sondern die erste Zeile des genutzten Bereichs:
ziel_ws.Columns(ziel_col).TextToColumns Destination:=ziel_ws.cells(ziel_ws.UsedRange.row, ziel_col)...
Gruß Daniel
Anzeige

338 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige