WinCC TIA V16 WinCC RT Advanced VBS .xmls File in .csv umspeichern bzw. konvertieren

ebene10

Member
Beiträge
20
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

ich bin mal wieder am skripten und stehe vor folgendem Problem.
Ich habe eine Runtime (TIA V16 WinCC RT Advanced) auf einer Siemens Nanobox am laufen.
In dem VB Skript wird eine Excel Vorlage (.xlsm) geöffnet und Daten in die Tabelle eingetragen.
Es ist Excel 2016 installiert.
Danach wird sie gespeichert und geschlossen. In dieser Excel Vorlage sind Makros vorhanden.
Ich habe jetzt das Problem, dass ich das gleiche Excel File nochmal als .csv speichern muss.
was aber nicht so einfach funktioniert, weil das .xlsm Format einen Header besitzt.
Jetzt meine Frage, kann ich mit VBS die Datei in .csv umspeichern (ohne Header).
Wenn ich das .xlms File mit Excel öffne, kann ich es einfach mit "speichern unter" .csv abspeichern
und das Format passt. Die Datei wird dann ohne Header gespeichert.
Wen ich das aus dem Skript heraus mache (Dateiendung auf .csv) und vom Skript aus speichere,
funkioniert es nicht. Hier ist immer der Header mit dabei :-(

Ich hoffe ihr könnt mir helfen.

Grüße aus Franken
Jochen
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Wenn ich das .xlms File mit Excel öffne, kann ich es einfach mit "speichern unter" .csv abspeichern
und das Format passt. Die Datei wird dann ohne Header gespeichert.
Wen ich das aus dem Skript heraus mache (Dateiendung auf .csv) und vom Skript aus speichere,
funkioniert es nicht. Hier ist immer der Header mit dabei :-(
Mit welcher Funktion/Methode machst Du das "Speichern unter" mit Dateiendung csv?
Vielleicht kann man der Excel.Application mit einem Parameter mitteilen, das Speichern im csv-Format und ohne Header zu machen?
Du könntest mit dem Excel-Macrorecorder das "Speichern unter" mitschneiden und dann im erzeugten VBA-Code nachschauen.

Bei Deinem Speichern per Skript: Ändert sich nur die Dateiendung zu csv oder wird die Datei tatsächlich im Format einer csv-Textdatei gespeichert? Dann könntest Du danach die erzeugte csv-Datei öffnen und den ungewollten Header entfernen, z.B. Datei ohne den Header zeilenweise in eine zweite csv-Datei umkopieren.

Wie sieht denn die erzeugte csv-Datei mit Header aus? (schau Dir die Datei mit einem Texteditor wie Notepad an)

Harald
 
OP
E

ebene10

Member
Beiträge
20
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Harald,

danke für die schnelle Antwort.

Ich habe mich da unverständlich ausgedrückt.

Ich habe eine Vorlage.xlms die ich im Skript öffne.
Dann werden Daten in das Excel File eingetragen.

Wenn alles eingetragen ist, möchte ich das geöffnete Excel File unter anderen Namen mit der Endung .csv abspeichern.
Hier der Befehl dazu:
appExcel.ActiveWorkbook.SaveAs (Netzwerkpfad_Excel_Files + Neuer_Name_Excel_File + .csv)
Und genau das funktioniert nicht.

Ich vermute wegen dem Header der beim .xlms File dabei ist.
Mein Skript kann die Datei mit Endung .csv nicht erzeugen.
 

Heinileini

Well-known member
Beiträge
3.728
Punkte Reaktionen
717
Mit .xmls und .xlms meinst Du wahrscheinlich .xlsm.
Aus Excel heraus kann man immer nur 1 ArbeitsBlatt bzw. einen Bereich aus einem ArbeitsBlatt als .csv abspeichern.
Oder per VBA Beliebiges.
Was genau wird benötigt und was stört?

Wo soll jetzt ein Skript aktiv werden? In Excel, um von hier die .csv-Datei aus einem Excel-ArbeitsBlatt zu zaubern?
Oder Willst Du dort, wo per Skript die .xlsm-Vorlage "befruchtet" wird, zusätzlich (oder alternativ) per Skript eine .csv-Datei erzeugen?
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Vielleicht kann man der Excel.Application mit einem Parameter mitteilen, das Speichern im csv-Format und ohne Header zu machen?
Versuche mal so (ungetestet):
Code:
[COLOR="#0000FF"]Const xlCSV = 6[/COLOR]
Dim appExcel, ...

Set appExcel = CreateObject ("EXCEL.Application")
...
appExcel.ActiveWorkbook.SaveAs Netzwerkpfad_Excel_Files & Neuer_Name_Excel_File & ".csv"[COLOR="#0000FF"], xlCSV[/COLOR]

Harald
 

Heinileini

Well-known member
Beiträge
3.728
Punkte Reaktionen
717
Zuviel Werbung?
->Hier kostenlos registrieren
Anbei Excel 2010 VBA Routine, die den markierten Bereich (Zellen des ArbeitsBlattes) als CSV-Datei schreibt.
Als TrennZeichen wird ';' benutzt, geschrieben wird Datei 'D:/Test.csv'.
Werden die SpaltenÜberschriften mit markiert, so werden sie ausgegeben.
Werden sie nicht mit markiert, werden sie nicht ausgegeben.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
xTmp$ = Target.Address
If InStr(xTmp$, ",") > 0 Or InStr(xTmp$, ":") = 0 Then Exit Sub
xDrvNamExt$ = "D:/Test.csv"
Open xDrvNamExt$ For Output As #1
For Each cc In Range(xTmp$)
    xRow& = cc.Row
    If xRowPre& = 0 Then
        xRowPre& = xRow&
        xLin$ = cc.Value
    ElseIf xRowPre& <> xRow& Then
        xRowPre& = xRow&
        Print #1, xLin$
        xLin$ = cc.Value
    Else
        xLin$ = xLin$ & ";" & cc.Value
        End If
    xVal$ = cc.Value
    Next cc
Print #1, xLin$
Close #1
End Sub
Anhang anzeigen CSV-schreiben.xlsm.pdf >>>===> nach dem Herunterladen '.pdf' entfernen!
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Wo soll jetzt ein Skript aktiv werden?
In einer WinCC Advanced PC Runtime will er in einem VBS Skript eine "unsichtbare" Instanz (z.B. ein ActiveX-Objekt) des installierten Excel "fernsteuern"/verwenden, um eine Tabelle auszufüllen und diese im csv-Format zu speichern.

Harald
 

Heinileini

Well-known member
Beiträge
3.728
Punkte Reaktionen
717
In einer WinCC Advanced PC Runtime will er in einem VBS Skript eine "unsichtbare" Instanz (z.B. ein ActiveX-Objekt) des installierten Excel "fernsteuern"/verwenden, um eine Tabelle auszufüllen und diese im csv-Format zu speichern.
Danke, Harald!

Mein bisheriges Verständnis: Bisher funktioniert es, wo und wie auch immer, eine ExcelVorlage einer xlsm-Datei zu öffnen, darin eine Tabelle auszufüllen und diese xlsm-Datei (als "Nicht-Vorlage") zu speichern. Die verwendete Vorlage enthält bereits VBA-Makros, die vermutlich u.a. dazu dienen, die genannte Funktionalität (öffnen, ausfüllen, abspeichern, schliessen) umzusetzen, auszuführen.
Woran es bisher scheitert, die ausgefüllte Tabelle ausserdem im CSV-Format zu exportieren, ist Excels manchmal penetrantes Mitdenken und "Besserwissen".
Wir wollen die SpaltenÜberschriften der Tabelle NICHT mit in die csv-Datei schreiben, aber Excel "besteht darauf" und wir finden (bisher) keine Möglichkeit, dies zu unterbinden.
Der Export der csv-Datei funktioniert zwar bisher schon, aber leider nur in der Variante mit Header.

- Eine unschöne Möglichkeit, die SpaltenÜberschriften nicht in der csv-Datei erscheinen zu lassen, ist:
Das TabellenBlatt darf zum Zeitpunkt des csv-Exports keine SpaltenÜberschriften enthalten! Furchtbar banal, aber damit kommt Excel anscheinend widerspruchsfrei klar! :icon_mrgreen:
Also, per VBA entweder ...
. - die SpaltenÜberschriften vor dem csv-Export löschen und nach dem Export rekonstruieren und dann erst als xlsm-Datei speichern oder
. - (wenn möglich) bis nach dem csv-Export mit dem Eintragen der SpaltenÜberschriften warten oder
. - die Datei im xlsm-Format mit SpaltenÜberschriften speichern, dann die SpaltenÜberschriften löschen und den csv-Export ausführen, dann die Excel-ArbeitsMappe schliessen, ohne sie nochmal abzuspeichern.

- Alternativ hatte ich mir vorgestellt, den csv-Export à la µSoft nicht zu benutzen und stattdessen per VBA zu Fuss zu realisieren.

Eigentlich sollte es realisierbar sein, die xlsm-Vorlage um das/die benötigte[n] VBA-Makro zu erweitern und es/sie in den TemplateÖffnen-Auffüllen-Speichern-WorkBookSchliessen-Ablauf zu integrieren.

Gruss, Heinileini
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
16.865
Punkte Reaktionen
4.949
Zuviel Werbung?
->Hier kostenlos registrieren
Hmm, ich weiß nicht ob das Automation Object "EXCEL.Application" das Ausführen von VBA-Makros in der Excel.Application unterstützt. Ich meine, man muß die VBA-Funktionalität (die in der Excel.Application ablaufen würde) in VBS nachbauen (was in der WinCC Adv. Runtime VBS Engine ablaufen würde).

Das Excel selber kann so speichern wie der TE sich das vorstellt. Er weiß nur nicht wie er das "Speichern unter" im csv-Format der Excel.Application in VBS sagen kann.
Wenn ich das .xlms File mit Excel öffne, kann ich es einfach mit "speichern unter" .csv abspeichern
und das Format passt. Die Datei wird dann ohne Header gespeichert.
Leider hat der TE noch nicht die Zeit gefunden, hier zu antworten, ob mein Vorschlag aus #5 funktioniert und was er mit dem störenden "Header" meint.

Harald
 

Heinileini

Well-known member
Beiträge
3.728
Punkte Reaktionen
717
Leider hat der TE noch nicht die Zeit gefunden, hier zu antworten, ob mein Vorschlag aus #5 funktioniert und was er mit dem störenden "Header" meint.
Mittlerweile bin ich mir sicher, dass mich der "Header" auf eine vollkommen falsche Fährte gelockt hat.
Nicht die SpaltenÜberschriften sind gemeint, sondern all die Informationen, die Excel ausmachen, aber in einer csv-Datei absolut nichts zu suchen haben.
SchriftArt, -Grösse, -Farbe, Rahmen und sonstige Formatierungen, u.s.w. u.s.w. ...
Der TE hat anscheinend versucht, eine csv-Datei zu erzeugen, ohne das csv-Format vorzugeben, allein durch Vorgabe der drei Buchstaben in der Datei-Extension.
Das kann nicht zum Ziel führen.
Etwas in dieser Art (als VBA-"Makro") sollte eigentlich funktionieren:
Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ActiveWorkbook.SaveAs Filename:="D:\Festplatte_C\CSV-schreiben-XL-cl.csv", _
        FileFormat:=xlCSV, CreateBackup:=False
End Sub
 
OP
E

ebene10

Member
Beiträge
20
Punkte Reaktionen
0
Hallo zusammen,

erstmal Danke für die zahlreichen Beiträge.
Ich werde diese Woche weiter mit dem Problem kämpfen und versuchen eure Vorschläge
umsetzten bzw. ausprobieren.

@Heinileini
In dem Excel File das mir zur Vorlage dient, werden Makros verwendet
z.B. zum PDF drucken.

"""Die verwendete Vorlage enthält bereits VBA-Makros, die vermutlich u.a. dazu dienen, die genannte Funktionalität (öffnen, ausfüllen, abspeichern, schliessen) umzusetzen, auszuführen"""
Das erledigt alles mein VB Skript :)

Ich berichte zeitnah ob ich mit euren Vorschlägen Erfolg hatte.


Grüße aus Franken
Jochen
 
Oben