TIA WINCC Skript Write to File....in eine bestimmte Zelle schreiben ?

Stephan_GPT

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle miteinander ;)

Mein Ziel ist es Werte, bzw. Daten in einer Datei zu sichern. (Softkey)
Die Datei (wunsch .xls) sollte dann über den PC gedruckt werden.
... bis dahin kein eigentlich kein Problem.....

Aber:

Ich stelle mir das so vor, das schon eine Vorlagen-Datei besteht.. z.B mit Logo
und festen Texten...
Datum:
Materialnummer:
Druck:
Benutzer:
usw. usw. usw.

Das Script öffnet diese Vorlage -> trägt die Variablen in meine gewünschte Zelle (hinter dem festen Text)->
und speichert diese Datei dann mit dem Dateinamen z.B. Materialnummer+Datum+Uhrzeit.xls

ich habe mir gerade von Siemes das BeispielProgramm ReadWrite_to_File angesehen....
... leider verstehe ich von dieser Programmierung nur Bushaltestelle.....

Kann mir vielleicht jemand sagen ob diese Funktion so überhaupt möglich ist ??

Vielen Dank....

Gruß Stephan
 
Ja, Dein Vorhaben ist möglich. Beispiel für schreiben in EXCEL-Datei ist in der FAQ.

Allerdings würde ich persönlich das nicht machen, EXCEL hat für mich viel zu viel Absturz-Potential. Ich gebe mich mit den Lesen/Schreiben von Textdateien (z.B. csv) zufrieden.

Harald
 
Es gibt dabei auch noch eine weitere Problematik : das Ganze ist nicht besonders schnell ...
Das ist natürlich kein Problem, wenn sowieso nur jede Minute (oder noch langsamer) etwas geschrieben werden soll - ist es aber deutlich schneller dann solltest du an Stelle dessen lieber mit einer CSV-Datei liebäugeln. Die ist auch Excel-lesbar - aber sehr viel schneller gelesen/geschrieben. Lediglich das Adressieren einer "Zelle" in der der datei-Mitte ist etwas "tricky".

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn es CSV werden sollte, was ich persönlich auch für besser und einfacher halte, dann stellen sich eigendlich nur zwei Fragen:
Soll in der Vorlagendatei noch etwas anderes drin stehen als jeweils der feste Text?
Oder wird von anderer Stelle in die Datei schon etwas dynamisches reingeschrieben?

Wenn nein, würde ich die Datei immer komplett aus dem Skript heraus erstellen. Denn es ist beim schreiben von Textdateien nicht möglich eine bestimmte Zeile zu adressieren. Man müsste am Anfang anfangen und zeilenweise die Zeilen bis zur gewünschten überspingen. Weiterhin müsste man die Zeilen in die geschrieben werden soll auch erst lesen und dann den neuen Text hinzufügen. Was auch wieder dauert.

Schreibst du die Datei komplett neu aus dem Sript heraus, gibt es nur Schreibbefehle und die Logik drumherum ist auch einfacher weil nicht erst die Zeilen gesucht und gelesen werden müssen.

Einziger Nachteil, wenn an den festen Texten etwas geändert werden soll, muss man das Skript anfassen. Es reicht nicht aus einfach die Vorlagen Datei zu ändern.

Weiterer Nachteil von Textdatei ggü. EXCEL wäre dann eigentlich nur noch das angesprochene Logo und Formatierungen wie Tabellenränder, Hintergrundfarben, Fettschrift usw. Das bekommst über eine Textdatei nicht hin.


Gruß, Nico
 
Hallo Nico,

Vielen Dank für die Informationen.

Hier mal eine kleine Funktionsbeschreibung von dem was passieren soll:

Ein Werkstück soll geprüft werden.
Der Bediener trägt seinen Namen ein.
Die Bezeichnung des Prüflings.
Softkey Start Prüfung (Ca. 10 Start-Werte werden in ein DB geschrieben)
Es wird Druck auf das Werkstück gegeben...
... Druck erreicht...
Die 10 Werte werden erneut geschrieben.....(End-Werte)
Der Bediener beendet den Prüfvorgang....

Per Softkey soll jetzt von dem Bediener die Datei erstellt werden !

.. ich wäre auch mit einer .csv zufrieden !

Ja ich würde gerne Logos in den Vorlagen haben.
(bzw. Bilder von den verschiedenen Prüflingen)
Ich würde mir für jeden Prüfling (ca. 8 Stck) eine Vorlage erstellen wollen.
Und je nach Prüfling die Vorlage aufrufen.

Eigentlich habe ich genug Zeit um die csv. oder .xls zu beschreiben...
... dieser Vorgang erfolgt so ca. 3x am Tag.

Frage: warum muss ich die Zelle erst lesen ?
... also kann ich nicht z.B sagen "schreibe in Zelle D1" ... das geht also nicht :-(

Gruß Stephan
 
@Stephan:
Wenn du es so, wie beschrieben, machen möchtest, dann spricht aus meiner Sicht gar nichts dagegen, direkt mit Excel-Files zu arbeiten.
Dort würdest du dann auch direkt die Zelle ansprechen (die auch schon formatiert sein kann) und den Wert da rein schreiben. Du kannst hier auch mit einer Vorlagen-Datei arbeiten, die du dann unter einem neuen Namen abspeicherst. Schau dir dazu einfach mal das Beispiel von mir in der von Harald verlinkten FAQ an ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest die Datei auch aus einer Vorlage-Datei mit Platzhaltern + Daten mixen. Wie bei Etikettendruckern oder einer Serienbrief-Druckfunktion. Um eine formatierte Protokoll-Datei zu erstellen muß man nicht die Datei im EXCEL-Binärformat erstellen (dazu braucht man EXCEL), man kann auch Textdateien mit Formatsteueranweisungen erstellen z.B. rtf oder html oder xml. Solche Dateien lassen sich ohne Hilfsprogramme einfach per VBS-Skript erzeugen. Bilder/Logos müssen nicht unbedingt in der Datei eingebettet sein, sie können auch nur verlinkt sein.


In Textdateien, wozu auch csv-Dateien gehören, kann man nicht "Zellen" adressieren. Will man einen Wert ändern, dann muß man die Datei bis zu der zu ändernden Stelle kopieren, den neuen Wert einfügen und den Rest der Datei kopieren.

Beispiel: "Nettogewicht: 98,3 kg" ändern in "Nettogewicht: 103,7 kg"
- "Nettogewicht: " aus Originaldatei oder Vorlagedatei einlesen und in Ausgabedatei schreiben
- "98,3" aus Originaldatei oder Vorlagedatei einlesen
- "103,7" in Ausgabedatei schreiben
- " kg" aus Originaldatei oder Vorlagedatei einlesen und in Ausgabedatei schreiben

Prinzip Vorlagedatei: Die Zahlenwerte durch besonders markierte Platzhalter ersetzen, z.B. "Nettogewicht <GN> kg" oder "Nettogewicht <GN%4.1f> kg". Beim Erstellen der Ausgabedatei die Platzhalter der Vorlage durch aktuelle Datenwerte ersetzen.

Harald
 
Moin moin,

kurzer Status Bericht:

Ich habe am WE genau das hinbekommen, was ich mir vorgestellt habe !
Vorlage öffnen... gezielt Zellen beschreiben... Datei unter gewünschten Namen(+Datum+Zeit).xls speichern .... Datei schließen !:D

Vielen Dank an alle die mir geholfen haben !!!!!

Noch eine abschließende Frage...... :cool:

besteht die Möglichkeit die Datei(.xls) vor dem Schließen noch mal schnell an
den Standard Drucker zu senden ????

Gruß Stephan
 
Dafür müßte dir das Excel-Objekt selbst auch eine Methode zur Verfügung stellen.
Versuch dazu mal die PrintOutEx-Methode ...

Gruß
Larry
 
Hallo Larry,

das verfahren ist mir bekannt, aber Stephan schreibt ja, dass er eine Lösung hat um gezielt Zellen zu beschreiben.

Das würde mich interessieren.

Gruß
Mecha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das "gezielt" Zellen beschreiben ist in dem mehrfach verlinkten FAQ beschrieben:
Exceldatei lesen / schreiben (Danke auch an Larry Laffer)
[...]
Code:
' Zelle beschreiben
wsExcel.Cells (Zeile , 1) = date
wsExcel.Cells (Zeile , 2) = time
wsExcel.Range("D1") = Zeile

Harald
 
Moin moin....
hier erst einmal die Lösung fürs drucken der xls Datei...
habe mir eine Excel Datei mit mit Makro erstellt ...
in der steht folgendes:

' in die gewünschte Tabelle in VBA einfügen
' column 7 entspricht "G"
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 15 And Target.Column = 7 Then
If Target.Value = "1" Then
ActiveWindow.SelectedSheets.PrintOut Copies:=1, _
Collate:=True
End If
End If

End Sub

.... wenn ich mir nun gezielt in die Zelle G15 eine 1 schreibe druckt er mir
die Datei....
... bei 0 wird nur gespeichert !!!

Gruß Stephan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin Mecha....

hier mein Lösungsansatz zum schreiben in eine Zelle mit/ohne drucken der Datei ;)

Code:
On Error Resume Next
 
Dim appExcel , fs , wsExcel , wbExcel
Dim Verzeichnis , Datei_Org , Datei_Neu

SCRIPT_AKTIV = True
' Bool-Variable Button auf Panel grün = Skript_aktiv (Anzeige) 

Verzeichnis = "f:\"
Datei_Neu = "Daten,"& Material &","& Date &".xls"
Datei_Org = "Produktions-Daten_mit Makros.xlsm"

If Not a_Excel_geoeffnet Then ' Excel ist noch nicht geöffnet
   Set appExcel = CreateObject ("EXCEL.Application")
   a_Excel_geoeffnet = True 

   Set fs = CreateObject ("Scripting.FileSystemObject")
   If Not fs.FileExists (Verzeichnis + Datei_Neu) Then ' Ziel-Datei noch nicht vorhanden
      Set wbExcel  = appExcel.Workbooks.Open (Verzeichnis + Datei_Org)
      Set wsExcel  = wbExcel.Worksheets("Daten")
      wbExcel.Author = "STEPHAN_GPT"
      wsExcel.Range("B5") = Now   
      wsExcel.Range("H5") = 10 ' erste Schreib-Zeile 
      wbExcel.SaveAs Verzeichnis + Datei_Neu ,True
   Else ' Ziel-Datei ist schon vorhanden
      Set wbExcel  = appExcel.Workbooks.Open (Verzeichnis + Datei_Neu)
      Set wsExcel  = wbExcel.Worksheets("Daten")
   End If 
   a_Excel_Dateiname_akt = Datei_Neu
End If

Set wbExcel = appExcel.Workbooks.Open (Verzeichnis + Datei_Neu )
Set wsExcel = wbExcel.Worksheets("Tabelle1")
 
' Zellen beschreiben --> mit Variablen
wsExcel.Range("F1") = Material
wsExcel.Range("F2") = Pressure
wsExcel.Range("F3") = Temperature
wsExcel.Range("F4") = Date
wsExcel.Range("D5") = Time
wsExcel.Range("C3") = Material

' In diese Zelle schaut Excel rein um ggf. zu drucken-->
wsExcel.Range("G15") = Drucken ' REAL 0=Nein/1=JA


' Tabelle abspeichern
wbExcel.Close True 'false
appExcel.Quit 



If a_Excel_geoeffnet Then 
   Set appExcel = GetObject ( , "EXCEL.Application")
      Set wbExcel  = appExcel.ActiveWorkbook
      Set wsExcel  = wbExcel.Worksheets("Daten")

      wbExcel.Close True  'false
      appExcel.Quit ()
   a_Excel_geoeffnet = False
End If

SCRIPT_AKTIV = False
 
'------------------------------------------------------------------------------
' verwendeten Speicher wieder freigeben
Set wsExcel = Nothing
Set wbExcel = Nothing
Set fs = Nothing
Set appExcel = Nothing
Set Verzeichnis = Nothing
Set Datei_Neu = Nothing


End Sub

kann dir auch nicht 100%ig erklären was da steht....:ROFLMAO:
.... aber es funzt !!!
Die Kollegen werden bestimmt noch ein paar Zeilen Datenmüll entdecken......:cool:

Nochmals Vielen Dank ...
Gruß Stephan
 
Zurück
Oben