Anzeige
Archiv - Navigation
1540to1544
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

Anpassung: .dat Import VBA

Anpassung: .dat Import VBA
20.02.2017 11:16:15
Iris
Hallo!
Ich hab dieses tolle Makro hier von Tino im Forum bekommen.

Die Datei https://www.herber.de/bbs/user/111599.xlsm wurde aus Datenschutzgründen gelöscht

Nun bräuchte ich zwei Änderungen.
Zum einen sind die Spalten in den einzelnen .dat-Files nun durch
__Tabulator und nicht durch Komma getrennt und zum anderen, sollen die Files nicht untereinander, sondern
__nebeneinander (also in die jeweils nächste Spalte geschrieben werden.
Kann mir dabei jemand helfen? Vielen Dank im Voraus!
Gruß, Iris

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Anpassung: .dat Import VBA
20.02.2017 12:14:16
Luschi
Hallo Iris,
das 1. Problem hättest Du Dir ergoogeln können:
statt
Const Trennzeichen$ = ","
so:
Const Trennzeichen$ = vbTab
oder so:
Const Trennzeichen$ = Chr(9)
beim 2. Problem frag ich mich, wozu nebeneinander. Mit so einer Struktur kannst Du PivotTable, PowerPivot aber auch Formeln wie Summenprodukt(), Aggregat(), Index(), Vergleich() u.u.u
total vergessen.
Gruß von Luschi
aus klein-Paris
AW: Anpassung: .dat Import VBA
20.02.2017 15:07:27
Iris
Hallo Luschi!
Vielen Dank!
Punkt 1: Da hast Du natürlich vollkommen recht. Hab irgendwie dann gar nicht weiter drüber nachgedacht, weil ich bei Punkt 2 leider hilflos bin... sorry!
Punkt 2: Also die "neuen" .dat-Files haben nur zwei Spalten - die ich eben nebeneinander in ein Tabellenblatt möchte - die Auswertung etc. wird so einfach viel übersichtlicher.
Ich habe damals noch eine zweite super Variante bekommen: https://www.herber.de/bbs/user/111604.xlsm
Hier werden alle .dat-Files in ein eigenes Tabellenblatt geschrieben. Hier finde ich leider nicht, wo ich das
Const Trennzeichen$ = "," in Tabulator ändern kann?
Danke sehr!
Gruß, Iris
Anzeige
AW: Anpassung: .dat Import VBA
20.02.2017 15:19:28
Iris
Und zu Deiner Frage wozu nebeneinander: tatsächlich brauche ich nur die jeweils 2. Spalte aus den einzelnen .dat-Files. (Die erste ist immer gleich); somit würde sich dann schon eine sinnvolle Tabelle ergeben.
ich wollte die Hilfsbereitschaft nicht noch weiter strapazieren und das dann selber über Formeln lösen.
das war wohl von mir...
20.02.2017 17:01:41
mir...
Hi Iris,
das Trennzeichen wird an die
Sub TextImport(ByVal Blatt$, ByVal Datei$, ByVal ZeilenTrennung$, ByVal Zeile&)

übergeben, die wiederum ziemlich am Ende der Sub DAT_waehlen() aufgerufen wird:
         If BlattOk Then
Call TextImport(Blatt, Datei, vbCrLf, nZ) ' vbCr, vbLf oder vbCrLf
End If

Hier dann eben, wie Luschi bereits angeregt hat, mit vbTab.
Halt, halt, das war Quatsch, das war ja nur die ZEILENtrennung, nicht die Trennung innerhalb der Zeile...
Die findet in TextImport statt, das ist die Zeile:
aZ = Split(aIn(iIn), "|")

wobei hier das Trennzeichen "|" eben durch vbTab zu ersetzen wäre.
Bei Deinen damaligen Beispiel-DAT-Dateien waren die jeweils 1. Spalten *nicht* identisch...
Wie soll denn die Logik sein? So?
1. aus der 1. Datei werden die 1. und 2. Spalte übernommen
2. aus allen weiteren Dateien nur die 2. Spalte
3. sonst nix (bisher waren es ja irre viele Spalten)
Ich denke, das läßt sich mit vertretbarem Aufwand ändern - sofern Du die Logik bestätigst.
Zippe halt nochmal 2 oder 3 .DATs zum Testen...
Schöne Grüße,
Michael
Anzeige
AW: das war wohl von mir...
21.02.2017 08:53:51
mir...
Hallo Michael!
Ja genau, das war/ist von Dir!
Ich habe das "|" ausgetauscht (es gibt drei Stellen, wo es vorkommt) - ich glaube, ich habe alle Varianten probiert. Leider funktioniert es nicht.
Das sind die .dat-Files: https://www.herber.de/bbs/user/111617.zip
Deine Logik stimmt so, ja.
Aber vielleicht ist es besser, ich arbeite mit Deiner ersten Version weiter? Ich weiß nicht, ob dann wieder anders aufgebaute .dat-Files kommen und -wie man merkt : ) - hab ich nicht gerade ein Talent im VBA selber etwas anzupassen.
Vielen vielen Dank! Iris
Anzeige
AW: das war wohl von mir...
21.02.2017 09:47:26
mir...
Also toll wäre, wenn ich/Du nur das mit den Trennzeichen ändern könnte/st!
Ich denke, das wäre so die beste Lösung! Danke!
AW: das war wohl von mir...
21.02.2017 12:58:33
mir...
Sorry Michael! Tab funktioniert bei dem .dat nicht (auch händisch nicht).
"Feste Breite" oder "Leerzeichen" müsste es sein.
Ich hab es mit " " versucht... das funktioniert leider nicht.
AW: das war wohl von mir...
21.02.2017 15:07:18
mir...
Hallo Iris,
hier mal die neue Einlese-Routine. Wenn Du willst, könnt ich auch noch den wunsch, ab der 2. dat-Datei nur die 2. Spalte einlesen, realisieren.
https://www.herber.de/bbs/user/111631.xlsm
Gruß von Luschi
aus klein-Paris
Anzeige
AW: das war wohl von mir...
21.02.2017 16:07:48
mir...
Hi,
danke, Luschi, meine genannten Änderungen hatten offensichtlich zu kurz gegriffen - meine Logik war völlig anders und hatte die blanks (#32) rausgebügelt...
Das ist halt so eine Sache mit "exakt für eine Aufgabenstellung" programmiertem Code (da hat Luc:-? mal einen gedanklichen Treffer gelandet).
Wenn Iris mit Deiner Lösung glücklich ist, soll's mir Recht sein.
Schöne Grüße,
Michael
AW: das war wohl von mir...
21.02.2017 17:22:16
mir...
Hallo Michael,
ich selbst bin mit dieser Lösung nicht so zufrieden, da zu viel abhängig ist vom Aufbau der dat-Datei. Was ist, wenn die negativen Werte kleiner -999 oder größer -100 werden (gibt es dann weniger Leerzeichen davor). Aber egal, soll sich Iris erst mal dazu äußern.
Gruß von Luschi
aus klein-Paris
Anzeige
Vielen Dank!
22.02.2017 08:08:58
Iris
Guten Morgen!
Luschi, das Einlesen funktioniert sehr gut! DANKE!
Wäre es sehr aufwendig den Dateinamen je Spalte (.dat) als Überschrift schreiben zu lassen?
Könntet ihr mir vielleicht trotzdem erklären, wie ich die Trennzeichen in dem Makro von Michael ändern kann?
Beste Grüße, Iris
AW: Vielen Dank!
22.02.2017 14:27:30
Michael
Hi Iris,
die Trennzeichen interessieren mich quasi nicht...
Entscheidend sind diese Zeilen in der Sub TextImport:
For iIn = 1 To Len(sIn)
s0 = Mid(sIn, iIn, 1)
If (s0 >= "0" And s0 

Das Trennzeichen ist hier das "," im ElseIf-Zweig.
Das Ding funktioniert so, daß alle Ziffern (0-9), vbLF, vbCr (LF-line feed, Zeilenschaltung und CR=carriage return, Wagenrücklauf - Du hattest doch mal ne Schreibmaschine?) und der Punkt erhalten bleiben, während das Trennzeichen "," durch ein "|" ersetzt wird (um die englischen Dezimalpunkte und die Kommas auseinander zu halten).
Der Punkt ist aber, daß Dein neues Format nicht "ein" Trennzeichen hat (Deine Vermutung war ja ein Tabulator), also NICHT vbTab (das Zeichen Nr. 9), sondern eine variable Anzahl von Leerzeichen (Nr. 32), mit der die Werte so aufgefüllt werden, daß sie rechtsbündig in den Spalten stehen.
Das könnte man ändern, aber nicht, indem man einfach einen Wert ersetzt; vielmehr müßte man zwischen den Zahlenwerten jeweils alle 32er bis auf eines rauswerfen und das dann durch "|" ersetzen.
Das wäre mit vertretbarem Aufwand möglich, aber: was ist, wenn sich die Struktur erneut ändert?
Also, schaun wir mal: ich habe den TextImport auf TextImportT (T!) kopiert, bei dem ein Trennzeichen für die Werte angegeben werden *kann*; beim neuen Aufruf
Call TextImportT(Blatt, Datei, vbCrLf, nZ, "")
wird allerdings ein Leerstring übergeben (also nicht " " mit Leerzeichen, sondern "" ohne was zwischendrin), mit dem übrigens auch die alten Dateien funktionieren.
Der Kern wurde geändert:
Dim valW$                ' valide Werte
valW = "0123456789.-" & vbLf & vbCr
' usw., dann
For iIn = 1 To Len(sIn)
s0 = Mid(sIn, iIn, 1)
If InStr(valW, s0) > 0 Then
sOut = sOut & s0
Else
If WerteTrennung  "" Then
If s0 = WerteTrennung Then sOut = sOut & "|"
Else
sOut = sOut & "|"
While InStr(valW, Mid(sIn, iIn + 1, 1)) = 0 And iIn 

Durch das While werden die "beliebigen" Zeichen nach dem 1., das nicht in valW enthalten ist, ignoriert.
Es scheint zu funktionieren, allerdings ist mir nicht ganz wohl dabei, eine derartige Konstruktion zu verwenden wie:
Sub forTest()
Dim i&
For i = 1 To 5
MsgBox i
If i = 3 Then i = 4
Next
End Sub

bei der der Wert des Schleifenzählers in einer For-Schleife direkt geändert wird.
Eigentlich würde ich lieber eine while..wend verwenden, bin jetzt aber zu faul, das umzuschreiben.
Das Makro erzeugt weiterhin einzelne Blätter. Um da nicht groß eingreifen zu müssen, habe ich einen extra Button für eine Übersicht hinzugefügt, bei man die zu kopierenden Bereiche eingeben kann.
Der neue Code hat den Nachteil, daß die 1. Spalte immer leer bleibt, weil führende " " vorhanden sind.
Auch das könnte man ändern, was allerdings mit einem gewissen Aufwand verbunden ist, weil ich den *kompletten*, eingelesenen String in der Schleife verwurschtele und erst später eine Trennung in einzelne Zeilen vornehme (dann wäre es einfach, Leerzeichen mit trim/ltrim wegzuwerfen).
Na, vielleicht taugt's ja so: https://www.herber.de/bbs/user/111664.xlsm
Schöne Grüße,
Michael
Anzeige
AW: das war wohl von mir...
22.02.2017 14:06:36
mir...
DANKE!
Bez. der 2. Spalte - wenn es nicht zu viel Aufwand ist - wär das natürlich fein!
Ich kann das leider so gar nicht einschätzen.
Es wär genauso ok, wenn einfach immer nur die 2. Spalte eingelesen wird (also es muss nicht unbedingt bei der ersten anders sein! - ich kopier das dann sowieso in mein Auswertungsfile)

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige