Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1140to1144
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
VBA + Text in Spalten
wolfgang
Hallo Exelprofis
Ich habe eine sehr große Textdatei die ich in Excel einlese.
Jetzt möchte ich die Inhalte mit Text in Spalten aktualisieren
Klappt auch mit
Columns(2).TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, OtherChar:="#"
nur das dauert ziemlich lange(sehrgroße Datei)
Frage :
Gibt es auch nee Möglichkeit die Trennung im Arbeitsspeicher vorzunehmen um
dann die Tabelle in das Arbeitsblatt einzufügen?
gruß wolfgang
AW: VBA + Text in Spalten
26.02.2010 21:08:55
Ramses
Hallo
"...Gibt es auch nee Möglichkeit die Trennung im Arbeitsspeicher vorzunehmen..."
Dazu müsstest du die Daten zuerst in den Arbeitsspeicher einlesen, trennen und wieder schreiben.
Aber kannst es mal probieren.
Daten in ein Array einlesen, mit Spit trennen und wieder zurückschreiben.
Bei VBA-Gut sollte das ja kein Problem sein.
Alternativ würde ich aber einfach mal das probieren
Application.Screenupdating = False
Columns(2).TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, OtherChar:="#"
Application.Screenupdating = True
Gruss Rainer
Anzeige
AW: VBA + Text in Spalten
26.02.2010 21:26:23
wolfgang
Hallo Rainer
Danke für Deine Antwort
mit Screenupdating hab ichs schon probiert
es sind halt 65000 zeilen und 30 spalten
Mit splitt habe ich es auch schon versucht. Das war noch langsamer.
Weil ich ja jede zeile trennen muß.
Aber es passiert ja manchmal das nach copy und paste Excel die Daten automatisch trennt.
Und da bin ich noch nicht hinter gestiegen wann das der Fall ist.
gruß wolfgang
AW: VBA + Text in Spalten
26.02.2010 21:40:18
Ramses
Hallo
Was heisst für dich denn genau:
"...das dauert lange..:"
Kannst du das mal in Sekunden angeben ?
Gruss Rainer
AW: VBA + Text in Spalten
26.02.2010 21:53:40
wolfgang
Hallo Rainer
so ca 3 min
dann ist alles geordnet in den zellen
aber wenn der Anwender davor sitzt wird er schon nervös.
gruß wolfgang
Anzeige
AW: VBA + Text in Spalten
27.02.2010 08:01:08
Ramses
Hallo
Kannst du mal ein paar Datensätze dieser CSV anonymisieren und hier darstellen ?
Gruss Rainer
AW: VBA + Text in Spalten
27.02.2010 19:17:51
wolfgang
Hallo Rainer
Super das Du dich noch mal ngemeldet mhast
Hier mal der string
"XYZ"#"EUR"#"R6LJL"#"100"##"N"#" "###"130"#######"BdLand#"11.03.2009"##"aa"##"6/8"###"Deutschland"#"01.01.2010 07:36:52"#"0084223845"#"08.04.2009"#"ggg"##"Neubau"#"0"##"abc"#"Naugarten"###"bearbeiten"#"Keine Referenz"#"9100122069"#"Am Mühlenberg"##"0,00 €"#"Außen KS"##" "#"10"#"03.04.2009 10:30:00"##" 2 EFH"#"m³"##"Eigenheime"###"cef"#"Angebot"##"abc"#"def"#"17291"#"firma"
"YXZ"#"EUR"#"ED1CB"#"200"##"N"#" "###"500"#######"BDLand"#"18.07.2008"##"aa"##"61-63"###"Deutschland"#"29.05.2009 10:19:11"#####"Neubau"#"0"##"Berlin"####"ijk"#"Keine Referenz"#"9200092391"#"gggh"#"18.07.2008"#"0,00 €"#"Komplett KS"##" "##"16.12.2008 09:00:00"##" 2 Stadtvillen"#"m³"##"Mehrfamilienhäuser"#"2"##"firma2"#"Abgeschlossen"##"abc"#"def"#"13187"#"firma"
"XYZ"#"EUR"#"TBI48"#"300"##"Y"#"*"##########"BundLAnd"#"27.05.2009"##"aat"#####"Deutschland"#"28.01.2010 14:59:44"###"hhh"###"0"##"Regis-Breitingen"####"bearbeiten"#"Keine Referenz"#"9100128787"#"Wildenhain"##"0,00 €"###" "#"10"###" 2009 ggt"#"m³"##"Eigenheime"####"Auftrag"##"abc"#"WEISSK"#"04565"#"firma"
"XYZ"#"EUR"#"QUO8C"#"400"##"N"#" "###"20"#######"BdLand"#"27.02.2009"##"aa"##"6"###"Deutschland"#"11.02.2010 07:00:44"#"0081647112"#"13.11.2009"#"Einfamilienhäuser (EFH)"##"Neubau"#"0"##"aac"####"bearbeiten"#"Keine Referenz"#"9100120816"#"Briloner Weg"##"0,00 €"#"Komplett KS"##" "#"10"###" 2009 efga"#"m³"##"Eigenheime"####"Auftrag"##"abc"#"ddef"#"12207"#"Firma"
gruß wolfgang
Anzeige
Öffnen und Kopieren versus VBA-code
28.02.2010 10:59:51
Ramses
Hallo
Meine Umgebung:
Laptop mit 2 GHz Mobile CPU, 4 GB Arbeitsspeicher und W7 Ultimate 32 Bit mit Office 2007
Hab mal mit den Mustern von dir eine CSV Datei mit 95000 Datensätzen erstellt, Grösse knap 25 MB.
Öffnen der Datei direkt aus Excel und Auftrennen mit Daten - Text in Spalten und dem koperen und einfügen des aufgetrennten Textes in eine neue Datei dauert weniger als 20 Sekunden
Die Gleiche Aktoin mit dem code von Reinhard dauert etwa 5 Minuten.
Vorschlag:
Neuen Rechner kaufen :-)
Gruss Rainer
AW: Öffnen und Kopieren versus VBA-code
28.02.2010 13:26:28
Reinhard
Hallo Rainer,
5 min, eieiei :-(
Okay, dann vergesst den Code halt :-)
Gruß
Reinhard
Anzeige
Tut mir leid....
28.02.2010 14:09:02
Ramses
Hallo Reinhard
Was auffällt er braucht zum einlesen der Datei schon lange, knapp 1.5 Min. Aber der grosse Geschwindigkeitsfresser ist dann das Replace, was bei mir knapp 3 Minuten dauert.
Aber probiers doch einfach mal bei dir aus.
Das Muster der Datensätze hat er ja gezeigt. Ich habe das einfach genommen in Notpad eine CSV-Datei erstellt und dort reinkopiert. "Ctrl"+"V" für 1-2 Minuten und dann mal kucken :-)
Die Datei sollte dann etwa 25 MB haben.
Zur Kontrolle die Datei mit Excel öffnen, dann weisst du wieviel Datensätze in der Datei sind.
Gruss Rainer
AW: Tut mir leid....
28.02.2010 15:14:06
Reinhard
Hallo Rainer,
gibt es was Schnelleres als diese Codezeile um eine Datei einzulesen?
Alles = Input(LOF(1), #1)
Soweit ich weiß sind Stringoperationen immer langsamer als bei Zahlen.
Wenn nun dem Anfrager Split zu langsam ist und Replace genauso, tja nun, kann man wohl nix machen *denk*
Sicher, ich könnte mir so eine große Datei nachbauen, wozu, du hast es doch schon getan.
Der Anfrager sollte eine MsgBox einbauen, "dauert jetzt 3-5 Minuten" und fertig :-)
Gruß
Reinhard
Anzeige
Keine Msgbox...
28.02.2010 17:08:07
Ramses
Hallo Reinhard
"...Der Anfrager sollte eine MsgBox einbauen, "dauert jetzt 3-5 Minuten" und fertig :-).."
Er soll mal mit dem Makrorekorder das öffnen der CSV Datei und das Text-To-Columns direkt aufzeichnen und das umgewandelte Ergebnis dann einfach dorthin kopieren wo nötig.
Dann ist EXCEL nur mit sich selbst beschäftigt :-) und wenns dann immer noch so lange dauert,... einen neuen Rechner oder etwas mehr RAM :-)
"Alles = Input(LOF(1), #1)" liest doch auch nur alles Zeilenweise in das Array ein weil es sonst nicht weiss was es mit dem ganzen Zeug anfangen soll :-)
Ich denke bei Dateien dieser Grösse wird VBA immer langsamer sein als die reinen EXCEL internen C## Code's
Gruss Rainer
Anzeige
AW: Tut mir leid....
01.03.2010 08:44:36
Reinhard
Hallo Rainer,
okay, ich habe eine ähnlich große csv. So 130.000 Zeilen, 24 MB.
Scheinbar ist Notepad schneller als Vba-Open beim Einlesen.
Ca. 10 sec und Notepad ist weg und Alles und A() sind befüllt.
Die untere Prozedur fand ich bei Hans, ich komme damit nicht so klar. Aber geht ja auch ohne.
Option Explicit
Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const WAIT_TIMEOUT = &H102&
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAcess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Sub Einlesen()
' Verweis auf MS Forms 2.0 muß gesetzt sein wegen Dataobject
Dim A() As String, Alles$, MyData As New DataObject, Zei As Long, Anz As Integer, NP
On Error GoTo Hell
Application.ScreenUpdating = False
Application.SendKeys "^a^c%db"
NP = Shell("NotePad.exe c:\test\sehrgross.csv", vbMaximizedFocus)
MyData.GetFromClipboard
Alles = MyData.GetText(1)
'Application.SendKeys "%db"
'Call WartenBisFertig
A = Split(Alles, Chr(10))
'DoEvents
MsgBox Len(Alles)
MsgBox UBound(A)
Hell:
Application.ScreenUpdating = True
End Sub
Sub WartenBisFertig()
Dim ProcessID As Long, hProcess As Long, RetVal As Long
ProcessID = Shell("NotePad.exe c:\test\sehrgross.csv", vbNormalNoFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
Do
DoEvents
RetVal = WaitForSingleObject(hProcess, 50)
Loop Until RetVal  WAIT_TIMEOUT
End Sub

Gruß
Reinhard
Anzeige
AW: VBA + Text in Spalten
28.02.2010 09:23:00
Reinhard
Hallo Wolfgang,
wieso copy und paste?
Wie liest du denn die csv ein?
Zeige mal den ganzen Code fürs Einlesen und Aufsplitten.
Gruß
Reinhard
AW: VBA + Text in Spalten
28.02.2010 10:11:23
Reinhard
Hallo Wolfgang,
teste mal ob dies schneller ist:
Sub Einlesen()
' Verweis auf MS Forms 2.0 muß gesetzt sein wegen Dataobject
Dim Alles$, MyData As New DataObject
On Error GoTo Hell
Application.ScreenUpdating = False
Open "C:\test\kwwolfgang.csv" For Binary As #1
Alles = Input(LOF(1), #1)
Close #1
Alles = Replace(Application.Trim(Replace(Alles, "#", " ")), Chr(34) & " " & Chr(34), Chr(9))
MyData.SetText Alles
MyData.PutInClipboard
With Worksheets("Tabelle1")
.Range("A1").Select
.Paste
'.UsedRange.Columns.AutoFit
End With
Hell:
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard
Anzeige
AW: VBA + Text in Spalten
28.02.2010 20:57:37
wolfchen
Hallo Reinhard
sorry das ich jetzt erst Anworte. Dein Ansatz ist wirlich super.
Mein Poblem ist halt das ich nur Office 2003 habe und da ist halt bei Zeile 65536 Schluß.
Einlesen muß ich aber mehrere Textzeilen
Ich mach das in dem ich die Daten dann in das nächste Arbeitsblatt schreibe.
Genau hier ist das Problem. Ich muß dann von sheet1 bis sheetx die Daten trennen.
Leider geht es nicht anders da die User nur Excel haben.
Aber Dein Ansatz ist wirklich sehr gut
Das Skript habe ich getestet.
Mit PutInClipboard
geht das wirklich sehr schnell
gruß wolfgang
Anzeige
Es ist doch zum in die Luft gehen...
28.02.2010 21:36:08
Ramses
Hallo
Das war deine ursprüngliche Frage
"...mit Screenupdating hab ichs schon probiert es sind halt 65000 zeilen und 30 spalten..."
Und jetzt kommt so eine Aussage:
"...und da ist halt bei Zeile 65536 Schluß. Einlesen muß ich aber mehrere Textzeilen
Ich mach das in dem ich die Daten dann in das nächste Arbeitsblatt schreibe...."
Würde mich interessieren WIE du die Daten dann in das nächste Arbeitsblatt schreibst
By the Way: Mit .PutInClipboard kommst du da dann auch nicht weiter.
Gruss Rainer
AW: Es ist doch zum in die Luft gehen...
01.03.2010 20:24:02
wolfgang
Hallo Rainer
Sorry vielleicht habe ich mich auch falsch ausgedrückt.
Die Textdatei lese ich mit Line Input in Excel ein
Schreibe die Zeile mit cells(i,1) ins erste Arbeitsblatt
bin ich in Zeile 60000 bzw 130000 springe ich ins nächste Arbeitsblatt,
setzte i wieder auf 2 und lese weiter mit Cells(i,1) ein
klappt auch ganz gut und geht auch verhältnismäßig schnell.
Danach wird die Spalte selektiert und mit Selection.TextToColumns
trenne ich die Strings. Und genau hier ist der Zeitfresser.
Darum mein Ansatz mit PutInClipboard. also die Idee war die Spalte Kopieren und dann wieder mit Paste
einfügen.
Wenn ich das mit einer Textdatei mache trennt Excel manchmal ja auch in Zellen.
Ich weiß nur nicht warum und wann das Excel mit Textdateien macht.
gruß wolfgang

362 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige