| | | Xometry Europe erweitert das Angebot um Vakuumguss und Formpressen, eine Pressemitteilung
|
Autor
|
Thema: Datenexport in *.dat Datei (2341 mal gelesen)
|
melzig Mitglied Maschinenbautechniker
Beiträge: 396 Registriert: 15.01.2003 Intel Xeon CPU E5-1650v2 @3,5 GHz; 32 GB RAM Quadro K4000 3 GB 2x 20" TFT LG Flatron L2000CN Space Pilot 3D Connexion Windows 7 Professional 64 Bit Inventor Professional 2015 -64-Bit-Edition- Inventorintegration für Autodesk Productstream Professional 2011
|
erstellt am: 27. Jun. 2005 10:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Excel-Spezialisten! Habe eine Excel-Datei aus der ich Werte exportieren möchte. Den Code habe ich hier aus dem Forum (ist von Nancy). Sub datenexport() Application.DisplayAlerts = False Dim ws As Worksheet Dim Bereich As Range Dim Zeile As Object Dim Zelle As Object Dim s As String For Each ws In ActiveWorkbook.Worksheets ws.Activate Set Bereich = ActiveSheet.UsedRange 'hier schreibst Du deinen Pfad rein Open "C:\Probepfad\" & ActiveSheet.Name & ".dat" For Output As #1 For Each Zeile In Bereich.Rows For Each Zelle In Zeile.Cells s = s & Zelle.Text & "|" Next Print #1, s s = "" Next Close #1 Next ws Application.DisplayAlerts = True End Sub Das funktioniert auch schon recht gut. hier das Ergebnis: CUSTOMER|PART|CODE|ODATE|PROD|OCACT|CDATE|CTIME|CHARGE|POS|FTIME|FACT|CACT|FWEIGHT| sdf|dfg|erg|15.06.2005|F-18|123|17.06.2005|17:30|55|3|17:30| || | gju|hj|kikl|16.06.2005|F-19|34|18.06.2005|18:30|rt|4|18:30| || | zjuj|loö|oöpoäö|17.06.2005|F-20|53|19.06.2005|19:30|uzzu|6|19:30| || | | || || || || || || | Ich möchte nun aber, daß er die erste Zeile wegläßt und die letzte praktisch leere Zeile auch. Ich habe schon eine wenig rumprobiert, kriege es aber nicht hin. Ich würde mich freuen, wenn Ihr mir weiterhelfen könntet bzw. Denkanstösse in die richtige Richtung gebt. Vielen Dank! Tschüß Frank!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 27. Jun. 2005 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für melzig
Moin Frank, manman was buddelst du denne für'n lustiges Zeug aus? ;-)) Ähm, versuche es mal so, allerdings wie du das mit der letzten Zeile meintest, weiss ich nicht so recht, schlimmstenfalls nimm': For r = 2 to ubound(arr,1) - 1
Code:
Sub to_dat_files() Dim ws As Worksheet Dim s As String, r As Long, c As Integer Dim arr For Each ws In ActiveWorkbook.Worksheets arr = ws.UsedRange Open "D:\" & ws.Name & ".dat" For Output As #1 For r = 2 To UBound(arr, 1) For c = 1 To UBound(arr, 2) s = s & arr(r, c) & "|" Next Print #1, s s = "" Next Close #1 Next ws End Sub
lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
melzig Mitglied Maschinenbautechniker
Beiträge: 396 Registriert: 15.01.2003
|
erstellt am: 27. Jun. 2005 15:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Nancy ! Vielen Dank für Deine Hilfe! Es hat funktioniert. Ich werde doch mein Anfängerbuch nochmal bemühen müssen. Das ich in der Schleife für die Zeilen mit 2 anfangen muß und bis zur letzten benutzten Zeile war mir klar.Wie ich aber die letzte benutzte Zeile rauskriege wußte ich nicht. Die Funktion UBound kannte ich nicht. UBound liefert die Obergrenze einer Datenfeld-Dimension. UBound(arr, 1) Und mit arr = ws.UsedRange mache den benutzten Bereich zu meiner Datenfefd-Dimension. Ich versuche auch jedesmal zu verstehen was hier reingeschrieben wird, denn nur das blanke Abschreiben nützt mir nichts. Nochmals vielen Dank! Tschüß Frank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
melzig Mitglied Maschinenbautechniker
Beiträge: 396 Registriert: 15.01.2003 Intel Xeon CPU E5-1650v2 @3,5 GHz; 32 GB RAM Quadro K4000 3 GB 2x 20" TFT LG Flatron L2000CN Space Pilot 3D Connexion Windows 7 Professional 64 Bit Inventor Professional 2015 -64-Bit-Edition- Inventorintegration für Autodesk Productstream Professional 2011
|
erstellt am: 27. Jun. 2005 16:35 <-- editieren / zitieren --> Unities abgeben:
Hallo Nancy ! Hatte mich zu früh gefreut! Jetzt macht er mir aus meiner Uhrzeit eine Zahl. sdf|dfg|erg|15.06.2005|F-18|123|17.06.2005|0,729166666666667|55|3|0,729166666666667|fgh|hgj|gh| gju|hj|kikl|16.06.2005|F-19|34|18.06.2005|0,770833333333333|rt|4|0,770833333333333|hj|hj|hj| zjuj|loö|oöpoäö|17.06.2005|F-20|53|19.06.2005|0,8125|uzzu|6|0,8125|hj|hj|hj| Habe einen Überwachungsausdruck auf arr(r,c) gelegt und dort sehe ich, daß er das Datum als variant/date behandelt aber die Uhrzeit als variant/double. Da kommt leider nicht das raus, was ich will. Ich kann doch aber arr nicht als String deklarieren, da es doch die Datenfeld-Dimension darstellt. Bei der ersten Variante war das dadurch gelöst, daß die Texteigenschaft der jeweiligen Zelle exportiert wurde.
Stehe ein wenig auf dem Schlauch. Muß ich eine Zwischenvariable einführen, die ich als String deklariere? Bitte nochmal um Hilfe! Tschüß Frank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 27. Jun. 2005 17:54 <-- editieren / zitieren --> Unities abgeben: Nur für melzig
Hi Frank, Mist! ;;-)) Fällt mir auf die Schnelle auch nix ein, ausser wieder ein direktes Auslesen, hübsch eine Zelle nach der Anderen;-) Usedrange.Value als auch usedrange.value2 bringen nix und Usedrange.Text gibbets nicht. Dim arr() as string geht auch nicht, da der Herr Range ein Variant braucht. Und ein cstr(arr(r,c]] ist zu spät, die Messe wird bei der Übergabe des Rangebereiches an das Variant gelesen. Ich hoffe deine Tabellen sind keine Riesenteile, wird also etwas langsamer, keine andre Idee grade ... ;-) lg Nancy
Code:
Sub no_idea() Dim ws As Worksheet, r&, c%, s$ For Each ws In ActiveWorkbook.Worksheets Open "D:\" & ws.Name & ".dat" For Output As #1 With ws.UsedRange For r = 2 To .Rows.Count For c = 1 To .Columns.Count s = s & ws.Cells(r, c).Text & "|" Next Print #1, s s = "" Next End With Close #1 Next End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 27. Jun. 2005 20:18 <-- editieren / zitieren --> Unities abgeben: Nur für melzig
Ich nochmal ;-) menno, die Zwischenablage - thats it! Hätt' ich eigentlich drauf kommen müssen tun ..., stümmts @Bernd/Max? ;;-)) Also Frank, das wäre zB ein Ansatz der auf dem besten Weg zum Erreichen der Lichtgeschwindigkeit wäre. Wobei da irgendwie noch 'Müll' drinnen steht, konnte die Zeichen jetzt auf die Schnelle nicht festzurren. Geht ja nurmal ums Prinzip, ich mein das Abklopfen jeder Zelle funzt zwar auch, aber das Clipboard dagegen ist sowas wie die Geschwindigkeit eines Skilifts aber mit Mach3 ;-) Soll heissen, bei großen Tabellen wird's richtig interessant. Wiegesagt, stehen noch paar Zeichen zuviel drinnen, brauch ich aber etwas mehr Zeit, ist also nicht ausgemiezelt bis zum bitteren Ende. Wenn's interessiert, angeregt [in Erinnerung gerufen] durch dieses: http://www.online-excel.de/fom/fo_read.php?f=1&bzh=0&h=563&ao=1#a123x Gruss Nancy -- ps: soviel nur mal als mögliche [unausgereizte/unhandled] Alternative / Anregung
Code:
'braucht einen Verweis auf Microsoft Forms 2.0 Object Library 'und version Excel ab 2000 Sub asdf() Dim ws As Worksheet, dObj As New DataObject Dim r, c, s$, i& For Each ws In ActiveWorkbook.Worksheets 'ab damit in die Zwischenablage ws.UsedRange.Copy 'dobj mit der Zwischenablage füllen dObj.GetFromClipboard Application.CutCopyMode = 0 Open "D:\" & ws.Name & ".dat" For Output As #1 'ein Array aller Zeilenumbrüche erstellen r = Split(dObj.GetText, Chr(13)) 'über alle Elemente der Arrays (also der Zeilen) For i = LBound(r) To UBound(r) 'Separator vbTab ersetzen und die Zeile schreiben Print #1, Replace(r(i), vbTab, "|") Next Close #1 'Zwischenablage leeren dObj.Clear Next Set dObj = Nothing End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
melzig Mitglied Maschinenbautechniker
Beiträge: 396 Registriert: 15.01.2003
|
erstellt am: 28. Jun. 2005 08:00 <-- editieren / zitieren --> Unities abgeben:
Hallo Nancy ! Vielen Dank nochmal! Habe jetzt die Variante mit dem Zellenweise auslesen genommen. Funktioniert gut. Ich werde aber die andere Variante auch nochmal probieren. Vielleicht wieder ein wenig Wissensgewinn. Ich würde Dir ja gerne mehr als 10U´s geben, aber das funktioniert irgendwie nicht. Tschüß Frank!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
melzig Mitglied Maschinenbautechniker
Beiträge: 396 Registriert: 15.01.2003 Intel Xeon CPU E5-1650v2 @3,5 GHz; 32 GB RAM Quadro K4000 3 GB 2x 20" TFT LG Flatron L2000CN Space Pilot 3D Connexion Windows 7 Professional 64 Bit Inventor Professional 2015 -64-Bit-Edition- Inventorintegration für Autodesk Productstream Professional 2011
|
erstellt am: 28. Jun. 2005 08:13 <-- editieren / zitieren --> Unities abgeben:
Hier nochmal zur Geschwindigkeit: Habe die 14 Spalten auf 65536 Zeilen mit Werten gefüllt. Zum Exportieren werden ca. 30 sec. benötigt. Aber diesen Umfang wir die Tabelle eigentlich nie haben. Mal sehen was die andere Variante bringt. Tschüß Frank! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 28. Jun. 2005 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für melzig
|
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 28. Jun. 2005 22:13 <-- editieren / zitieren --> Unities abgeben: Nur für melzig
Hi Bernd, ups, das war wohl ein Error im trekkie-System, stimmt - es stimmt. :-) BTW, auf 3 verschiedenen Betriebssystemen scheint der Win-Standardeditor, jedesmal verschiedene End-of-Line für Chr(13) zu nehmen, dem Irrtum war ich gestern erlegen, da sich auf dem einen PC | und | [das kleinere] absolut ähnelten und ich dachte der macht die Spaltentrenner falsch. Hab' aber heute mit Vim festgestellt - der ist nicht so trügerisch - dasses doch korrekt war, Danke :-) @Frank: ... und probiert?;-) Macht bei mir ca. 1/4 bis ein 1/5 der Zeit aus. 2.9 sec vs. 12.97 sec Aber wiegesagt, richtig merkbar wirds erst bei großen Tabellen, bei kleinen Bereichen wirst kaum was [deutlich] merken. Aber freut mich wenns klappt - wählen musst Du;-) lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
melzig Mitglied Maschinenbautechniker
Beiträge: 396 Registriert: 15.01.2003
|
erstellt am: 30. Jun. 2005 14:07 <-- editieren / zitieren --> Unities abgeben:
@ nancy Geschwindigkeit habe ich jetzt ausprobiert bei 14 Spalten und 65536 Zeilen ist bei mir der Unterschied 30 sec. zu 18 sec.! Ich habe ein wenig Probleme mit deiner Variablendeklaration Dim r, c, s$, i& wenn nichts dahintersteht ist es variant s $ ist ein String aber was ist i& > integer ? Habe in der VBA - Hilfe unter Variablendeklaration nachgesehen aber über diese Variante der Deklaration nichts gefunden. Tschüß Frank !
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 30. Jun. 2005 14:23 <-- editieren / zitieren --> Unities abgeben: Nur für melzig
Hi Frank, sorry, Kurznotation war reine Faulheit;-) Nein, i& ist kein i wie integer, denn wenns eines wäre, hättste > Zeile 32.767 nen Überlauf;-) $ = String % = Integer & = Long ! = Single # = Double @ = Currency lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|