426 Aufrufe
Gefragt in Tabellenkalkulation von

Hallo zusammen

ich habe das Problem, dass ich meine "*.abs" Bewehrungs-Ausgabedateien jeweils nach bearbeiten muss.
Von Seite Softwarelieferant werde ich grad etwas im Stich gelassen. Der Aufwand für die Programmierung lohne sich nicht wurde mir gesagt. Ich bin scheinbar ein Einzelfall mit meiner Ausgabedateieproblematik, weil ich als Einzelkämpfer an nicht "null acht fünfzehn" Dingen arbeite.

Bei einfachen Projekten gibt es pro Datei nur eine Zeile pro @pxxx@-Wert und nicht wie bei mir mehrere Zeilen wobei sich diese sich durch unterschiedliche @nxx@-Werte unterscheiden und natürlich der @Cxx@ Prüfsumme pro Zeile am Schluss.

Hier ein Ausschnitt aus einer meiner "*.abs"-Dateien:

BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p124@l3910@n9@e2.412@d10@gIV S@s60@v@Gl3910@w0@C84@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p123@l4060@n16@e4.913@d14@gIV S@s84@v@Gl4060@w0@C91@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p130@l3910@n2@e3.472@d12@gIV S@s72@v@Gl3910@w0@C82@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p128@l1238@n30@e0.489@d8@gIV S@s30@v@Gl580@w90@l80@w90@l580@w0@C88@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p129@l339@n30@e0.134@d8@gIV S@s30@v@Gl100@w90@l140@w90@l100@w0@C94@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p126@l1879@n30@e0.742@d8@gIV S@s30@v@Gl150@w90@l180@w90@l1100@w90@l100@w90@l350@w0@C71@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p127@l1719@n30@e0.679@d8@gIV S@s30@v@Gl150@w90@l180@w90@l1080@w90@l160@w90@l150@w0@C89@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p125@l362@n26@e0.143@d8@gIV S@s30@v@Gl100@w90@l180@w180@l80@w0@C86@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p124@l3910@n6@e2.412@d10@gIV S@s60@v@Gl3910@w0@C87@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p121@l2260@n30@e0.893@d8@gIV S@s30@v@Gl350@w90@l100@w90@l1360@w90@l100@w90@l350@w0@C82@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p122@l1740@n30@e0.687@d8@gIV S@s30@v@Gl150@w90@l180@w90@l1080@w90@l180@w90@l150@w0@C67@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p123@l4060@n16@e4.913@d14@gIV S@s84@v@Gl4060@w0@C91@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p125@l362@n26@e0.143@d8@gIV S@s30@v@Gl100@w90@l180@w180@l80@w0@C86@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p124@l3910@n12@e2.412@d10@gIV S@s60@v@Gl3910@w0@C74@
BF2D@Hj2019-67@r203 bis 221, 268, 269@i@p121@l2260@n60@e0.893@d8@gIV S@s30@v@Gl350@w90@l100@w90@l1360@w90@l100@w90@l350@w0@C79@

Ich habe bis anhin die Datei manuell im notepad++ geöffnet.
Mittels alles markieren, kopieren, ein ein vorbereitetes Excel Tabellenblatt in Spalte "D" ab Zeile "2" eingefügt.
Dort wird der Wert @pxxx@ dann automatisch in einer separaten Spalte "C" ausgewertet mit der Formel "=TEIL(D2;SUCHEN("@p";D2;1)+1;SUCHEN("@";D2;SUCHEN("@p";D2;1)+1)-SUCHEN("@p";D2;1)-1)"
Alles ist gesperrt und der Schutz eingeschaltet ausser "D2" bis "D400", wo die Werte aus dem notepad++ eingefügt werden können.

Anschliessend habe ich eine Schaltfläche erstellt, dort ein Makro hinterlegt, welches den Schutz aufhebt, die letzte genutzte Zeile ermittelt, alles nach den Werten in Spalte C aufsteigend sortiert und den Schutz wieder aktiviert.

Nun muss ich die neu sortierten Werte der Spalte"D" markieren, kopieren, im notepad++ alle bisherigen Werte ersetzten und die Datei speichern.

Dies ist meine momentane Minimallösung.


Erweitern würde ich dies als erstes einmal gerne damit:
Ich öffne nur meine Excel-Datei mit dem Makro und der Schaltfläche auf dem Tabellenblatt.
Dort klicke ich die Schaltfläche, im öffnen Dialog wähle ich die gewünschte "*.abs" Datei aus und dann funktioniert das Einlesen ins Excel Tabellenblatt, das Sortieren und wieder ausgeben/abspeichern unter dem selben Namen automatisch ohne Umweg über notepad++.

Als nächsten Schritt müsste ich das dann erweitern:
Alle Zeilen mit dem selben @pxxx@-Wert möchte ich zu einer Zeile zusammenzufassen, indem ich die @nxx@ Werte zusammenzähle. der Rest bleibt dabei identisch ausser der Cheksummeblock @Cxx@ zu hinterst. den muss ich dann entsprechend inkl. der neuen Summe beim @nxx@ Block in der Zeile neu errechnen und anfügen. Die nun hinfälligen Zeilen werden gelöscht.
Dies sollte natürlich über die ganze Datei so geschehen.
Zum Schluss soll dann die so geschrumpfte Zeilenzahl wieder in die ursprüngliche "*.abs" Datei ausgegeben und die alten Werte ersetzt werden.

Ich habe zwar schon einiges mit VBA  in Excel gemacht, aber Daten aus einer Datei auslesen und wieder abspeichern gehörte nicht dazu. Und das Berechnen der Prüfsumme ist mir auch noch ein Rätsel.
Ich habe folgendes mittlerweile durch Recherche herausgefunden, wie das genau berechnet werden soll.
Prüfsumme-Formel
Nur sehe ich da noch nicht genau durch, um das in VBA zu übersetzen.

Wäre super, wenn mir hier jemand unter die Arme greifen könnte.

Besten Dank bereits mal.

4 Antworten

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo,

wenn ich das richtig sehe, willst du die einzelnen Zeilen aus der Datei insgesamt einlesen und nicht nach Werten trennen (Trennzeichen ist wohl @)?

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo M.O.

Ja genau. Die erste Zeile kommt in die Zelle D2, die zweite Zeile in die Zelle D3, usw.
Fürs Erste würde mir eine VBA-Routine, um mit meinem Makro automatischen einlesen und sichern zu können zum Schluss, das Leben bereits einiges vereinfachen.

Dazwischen wird mittels Formel in die analoge Zell der Spalte C der @pxxx Wert herausgesucht, das ganze nach diesem Wert sortiert. Zum Schluss soll die Spalte ab D2 bis D... wieder in das *.abs File ausgegeben werden.

Die Formel zum Herauslesen des @pxxx - Wertes funktioniert und das Sortieren mittels einem Makro geht auch bereits. Das Einlesen der Daten in die Spalte D und das Zurücksichern nach dem Sortieren habe ich so noch gar nie gemacht.

Ich kann den Pfad und den Dateinamen nicht hartvercoden, da ausser der Erweiterung ".abs" alles immer wieder wechselt. Ich bin mir nicht sicher, ob das ganze über den normalen Excel öffnen/sichern Dialog erledigt werden kann. GetOpenFilename() wäre das glaube ich, oder ob ich da das Rad neu erfinden muss und mit "open" selbst etwas erstellen muss.

Über eine kleine Starthilfe würde mich sehr freuen.

Besten Dank.

Gruss R.H.
+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo,

mit dem GetOpenFilename liegst du schon richtig. Die beiden Makros gehören in ein allgemeines Modul. Die Daten werden in das aktuelle Tabellenblatt eingelesen bzw. von dort ausgelesen. Den Namen der geöffneten und wieder zu speichernden Datei habe ich in die Zelle X2 geschrieben, so dass die importierte Datei automatisch überschrieben wird. Das kannst ggf. einfach anpassen.

Sub absDatei_einlesen()

Dim Datei As Variant
Dim TxtDatei
Dim strDatei As String
Dim arrDatei As Variant
Dim i As Integer
Dim lngLetzte As Long

'letzte Zeile in Spalte D ermitteln
lngLetzte = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row

'ggf vorhandene Daten löschen
Range("D2:D" & lngLetzte).Clear
'Zelle für Pfad und Name der Datei löschen
Range("X2").Clear

'Datei-Öffnen Dialog aufrufen
Datei = Application.GetOpenFilename(FileFilter:="Abs-Dateien (*.abs*), *.abs*", Title:="EINE Datei zum Öffnen auswählen")
    
If Datei = False Then
   'Makro abbrechen wenn Benutzer den Öffnen-Dialog abbricht
   MsgBox "Der Benutzer hat abgebrochen.", vbInformation
   Exit Sub
End If

'Textdatei auslesen
Set FSO = CreateObject("Scripting.FilesystemObject")
Set TxtDatei = FSO.OpentextFile(Datei)
strDatei = TxtDatei.readall
TxtDatei.Close

'Nach Datensätzen splitten
arrDatei = Split(strDatei, vbCrLf)

'Daten in aktuelles Tabellenblatt ab Zelle D2 schreiben
For i = LBound(arrDatei) To UBound(arrDatei)
  Cells(2 + i, 4) = arrDatei(i)
Next i

Range("X2") = Datei

End Sub

Sub absDateiErstellen()

Dim Ausgabepfad As String
Dim z  As Long
Dim arrAusgabe As Variant

'Bildschirmaktualiserung ausschalten
Application.ScreenUpdating = False

'Ausgabepfad wird festgelegt; Pfad der zuvor importierten Datei steht in Zelle X2
Ausgabepfad = Range("X2")

'letzte Zeile in Spalte D ermitteln
lngLetzte = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row

'Daten für Ausgabe in Array einlesen
arrAusgabe = Range("D2:D" & lngLetzte)

'vorhandene Datei löschen
If Dir(Ausgabepfad) <> "" Then
    Kill (Ausgabepfad)
End If

'Datei Öffen zur Ausgabe
Open Ausgabepfad For Output As #1

For z = 1 To UBound(arrAusgabe)
    'Ausgabe in Datei
    Print #1, arrAusgabe(z, 1)
    Next z
 
Close #1 'Datei schliessen

'Bildschirmaktualiserung
Application.ScreenUpdating = True

'Nachricht, dass Exportdatei erstellt wurde
MsgBox "Die Ausgabedatei wurde erstellt", vbOKOnly, "Export abgeschlossen"

End Sub

Probiere das aber erst einmal mit einer Testdatei aus.

Gruß

M.O.

0 Punkte
Beantwortet von ditc Einsteiger_in (6 Punkte)

Hallo M.O

besten Dank für den Code.
Es hat jetzt zwar über ein Jahr gedauert, bis ich endlich dazu kam das Excel File komplett zu automatisieren, aber nun läuft es.
Der Code hat mir dabei sehr gut gedient. Mit ein paar kleinen Anpassungen an meine neusten Bedürfnisse in dem Zusammenhang bin ich nun sehr glücklich mit dem Endresultat. smiley

Also nochmals Danke.

Gruss

R.H.

...