Öffnen un Schliessen einer Excel-Datei mit WinCC (VBS)

Datei xy.xls öffnen

Dim objExcelApp
Set objExcelApp = CreateObject("excel.Application")
objExcelApp.Visible = 0 'Excel sichtbar oder nicht sichtbar
objExcelApp.Workbooks.Open "c:\xy.xls" '


Datei xy.xls schließen

objExcelApp.Workbooks.Close 'Exceldatei schlissen
objExcelApp.Quit 'Excel schlissen
Set objExcelApp = Nothing 'Variable freigeben


Es gibt einen recht hilfreichen Trick:
Man zeichnet sich in Excel eine Makro auf kann dann die Befehle in WinCC VBS nutzen.

Gruss

Hallo Fachmänner,

habe dies hier mal umgesetzt, da ich dieses Thema aktuell auch brauche.
Grundsätzlich funktioniert mein Script, Werte werden gelesen und auf die S7-Variable geschrieben.
Aber:
Die Excelliste die ich per Script öffne und dann am Ende schliesse, wird aktualisiert und muss gepeichert werden, gibt es da ein Befehl für?
Weiteres Problem ist, das im Task-Manager pro Script-Durchlauf eine Excel.exe als Prozess startet und auch bestehen bleibt, heißt der Rechner ist irgendwann "zu", was kann man da machen?

Gruß
Move
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Move:
wenn du die Sequenz so beendest :
Code:
objExcelApp.Workbooks.Close True 
objExcelApp.Quit
... dann wird das Workbook geschlossen ohne weitere Rückfrage.
Das "objExcelApp.Quit" beendet die Excel-Instanz im Task-Manager. Wenn die bei dir im Speicher bleibt dann hast du die Befehle wohl anscheinend nicht korrekt angewendet oder eingegeben.

Gruß
Larry
 
Also die Befehle aus dem Makrorecorder kann man nicht ohne weiteres übernehmen.

Viele Befehle aus VBA stehen in VBS nicht zur Verfügung. Das muss man dann umstricken. Hab auch alles hingekiregt was ich wollte auch wenns manhcmal stunden gedauert hat.
 
@Santero:
Das hatte in dem Beispiel von mir nichts mit dem Makro-Rekorder zu tun sondern bezieht sich auf das auch hier im Forum von mir veröffentlichte Code-Beispiel, dass auch in der FAQ zu finden und nachzulesen ist.
Der Code daraus war / ist funktionsfähig (nur war die Excel-Geschichte insgesamt für mich nicht schnell genug).

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oh sorry da war aus dem zusammenhang. Es wird ja öfters mal gepostet das man irgendwas generiert und sich dann die Befehel aus dem Makrorecorder nimmt. Deswegen meinte ich , dass das nicht einfach so geht :)
 
@Move:
wenn du die Sequenz so beendest :
Code:
objExcelApp.Workbooks.Close True 
objExcelApp.Quit
... dann wird das Workbook geschlossen ohne weitere Rückfrage.
Das "objExcelApp.Quit" beendet die Excel-Instanz im Task-Manager. Wenn die bei dir im Speicher bleibt dann hast du die Befehle wohl anscheinend nicht korrekt angewendet oder eingegeben.

Gruß
Larry

Nun ja,
was soll ich sagen, kaum macht man's richtig funzt es auch schon:D
Vielen vielen Dank...
 
Ups,

zu früh gefreut:
Hier mal mein Vorhaben:
Das schliessen funktioniert aber die Excel.exe in der Task bleibt erhalten:-(
Die Excel müsste durch WinCC bei mir nicht geöffnet werden, reines lesen reicht.
Nur wie setzt man das um, ich finde immer nur die Open-Befehle
Gruß
Move

Option Explicit
Function action
Dim excel, wbActive, wsActive
'Create an Excel-Application object
Set excel = CreateObject("Excel.Application")
excel.Visible = 0
Set wbActive = excel.Workbooks.Open("D:\Postfach\KIS Wetterprognose WinCC.xls")
Set wsActive = wbActive.Worksheets("Tabelle1")
'----------------- WinCC Variable schreiben --------------------
'wsActive.cells(2,3) = Zeile 2, Spalte 3

Dim objTag

Set objTag = HMIRuntime.Tags("Temp_00_T0_B2") ' Temperatur 0:00 Uhr
objTag.Value = wsActive.cells(2,2).Value
objTag.Write

Set objTag = HMIRuntime.Tags("Temp_01_T0_B3") ' Temperatur 1:00 Uhr
objTag.Value = wsActive.cells(3,2).Value
objTag.Write

' etc...

excel.Workbooks.Close True 'Exceldatei schliessen
excel.Quit 'Excel schliessen
Set excel = Nothing 'Variable freigeben
End Function
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ...
Es geht nur so. Mit "CreateObject" wird Excel gestartet. Mit dem "Open" wird das Workbook aufgeschlagen (geöffnet). Was du dann damit machst bleibt dir überlassen. Anschließend schließt du das Workbook wieder und beendest die Applikation.

Wenn du allerdings (wie du schreibst) nur den Inhalt des Workbooks liest dann verstehe ich nicht, weshalb Excel eine Änderung der Datei feststellt.
Kann es sein, dass du das gleiche Script ggf. noch ein weiteres Mal aufrufst ? Wie ist das bei dir organisiert ?
Genauso muß der "excel.Quit" die gestartete Instanz aus dem Taskmanager entfernen. Auch das deutet für mich auf ein zweites Aufrufen von Excel hin.

Gruß
Larry
 
Hi,

ja das ganze sieht so aus, das die Exceldatei die geöffnet wird Verweise auf eine andere Excelliste besitzt. Somit aktualisiert sie sich und will beim Schliessen gespeichert werden.
Sollte das das Probelm sein?
Gruß
Move
 
Hi,

ich denke das Problem liegt nicht am Excel-Sheet.
Ich habe jetzt mal eine Tabelle angelegt mit zwei
Zahlen als Eintrag, also ganz simpel.

Dann diese mit VBS geöffent, gespeichert und geschlossen.
Fazit: Im Taskmanager bleibt Excel.exe stehen.
Schliesse ich die Excel-Datei händisch also click auf [x], dann verschwindet auch Excel.exe.

Was kann es sein?

Gruß
Move
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja das ist alles ein bisschen wirr.

aber wenn du willst kann ich dir hier die brutalo methode posten die alle excel.exe prozesse aus dem taskmanager killt. ist zwar nicht elegant aber geht wenn dich das zufrieden stellt
 
... also auch wenn du Verweise auf ein anderes Sheet hast sollte das keine neue Instanz erzeugen. Ggf. im Sheet gemachte Änderungen behandelt der ".close true".
Wann wird dein Script aufgerufen ?
Hast du mal den taskmanger beobachtet um zu sehen wann Excel das 2. Mal gestartet wird ?

Gruß
Larry
 
Hallo Benny

hier das Versprochene Beispielprogamm. Das Projekt bitte auf das Verzeichnis C:\ ablegen, damit auf die Tabellen zugegriffen werden kann.
Softwarestand: Step7 Version 5.5 WinCC 2008 SP2.

Vorgehensweise zum Testen:

In Stepp7 Programm ist ein Verzeichnis ProgFuer_Simulator, Simulation öffnen und diese Bausteine in den Simulator laden und mit P-Run starten.
Dann mit Bild "Tabelle" WinCC öffnen, danach mit dem Button "Runtime Start" Projekt aktivieren.

Dieses Beispiel ist aus einen von meinen Projekten erstellt worden, und ist somit kein rein Zugeschnittenes Beispielprogramm. Es wird bei schreib und Leseaktionen abgefragt, ob schon ein Excel Prozess aktiv ist.
Wenn du die Syntax zur Abfrage der Explizierten Tabelle hast, könntest du? die Skriptanweisung auf dieser Seite veröffentlichen.

Mit freundlichen Grüßen
Waldi
 

Anhänge

  • Vorschau.jpg
    Vorschau.jpg
    129,2 KB · Aufrufe: 35
  • S7EXCEL.zip
    3,3 MB · Aufrufe: 15
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

also das Script wird derzeit jede Minute aufgerufen, im Endausbau jedoch nur alle 24h.
Die Excel.exe wird im Task-Manager eingetragen,sobald die Excel-Datei gestartet wird und bleibt dann dort bestehen auch wenn die Datei per Script wieder geschlossen wird.
Nach Ablauf der Minute kommt das die nächste Excel.exe usw usw.
Nur wenn ich die Excel-Datei selber händisch schliesse, dann verschwindet auch die Excel.exe.
Sehr suspekt..

Gruß Move
 
Dim objExcelApp
Set objExcelApp = CreateObject("excel.Application")
objExcelApp.Visible = 0 'Excel sichtbar oder nicht sichtbar
objExcelApp.Workbooks.Open "c:\xy.xls" '

Datei xy.xls schließen

objExcelApp.Workbooks.Close 'Exceldatei schlissen
objExcelApp.Quit 'Excel schlissen
Set objExcelApp = Nothing 'Variable freigeben

wenn du die Sequenz so beendest :
Code:
[B]objExcelApp.Workbooks.Close True[/B] 
objExcelApp.Quit
... dann wird das Workbook geschlossen ohne weitere Rückfrage.
Das "objExcelApp.Quit" beendet die Excel-Instanz im Task-Manager. Wenn die bei dir im Speicher bleibt dann hast du die Befehle wohl anscheinend nicht korrekt angewendet oder eingegeben.

In dem folgenden VBScript funktioniert der obige Programmcode von Larry Laffer nicht richtig:

Code:
Dim objExcel 
Dim objWBExcel
Dim objWSExcel
 
Set objExcel = CreateObject("Excel.Application") 
Set objWBExcel = objExcel.Workbooks.Open("F:\Mappe1.xls")
Set objWSExcel = objWBExcel.Worksheets("Tabelle1")
 
objWSExcel.Cells(2, 1).Value = objWSExcel.Cells(1, 1).Value * 2
 
[B]objExcel.Workbooks.Close True[/B] 
objExcel.Quit

Das VBScript bricht mit einem Laufzeitfehler in der folgenden Programmzeile ab:

Code:
[B]objExcel.Workbooks.Close True[/B]

Windows_Script_Host.jpg

Die nachfolgende Programmzeile wird nicht mehr bearbeitet und die Excel-Instanz wird im Windows Task-Manager nicht beendet:

Code:
objExcel.Quit

Mit der nachfolgenden Programmänderung funktioniert das VBScript dann richtig:

Code:
Dim objExcel 
Dim objWBExcel
Dim objWSExcel
 
Set objExcel = CreateObject("Excel.Application") 
Set objWBExcel = objExcel.Workbooks.Open("F:\Mappe1.xls")
Set objWSExcel = objWBExcel.Worksheets("Tabelle1")
 
objWSExcel.Cells(2, 1).Value = objWSExcel.Cells(1, 1).Value * 2
 
[B]objWBExcel.Close True[/B]
objExcel.Quit

Siehe dazu auch das folgende Programmbeispiel:

http://www.sps-forum.de/showpost.php?p=316176&postcount=11

Gruß Kai
 
Das schliessen funktioniert aber die Excel.exe in der Task bleibt erhalten:-(

Option Explicit
Function action
Dim excel, wbActive, wsActive
'Create an Excel-Application object
Set excel = CreateObject("Excel.Application")
excel.Visible = 0
Set wbActive = excel.Workbooks.Open("D:\Postfach\KIS Wetterprognose WinCC.xls")
Set wsActive = wbActive.Worksheets("Tabelle1")
'----------------- WinCC Variable schreiben --------------------
'wsActive.cells(2,3) = Zeile 2, Spalte 3

Dim objTag

Set objTag = HMIRuntime.Tags("Temp_00_T0_B2") ' Temperatur 0:00 Uhr
objTag.Value = wsActive.cells(2,2).Value
objTag.Write

Set objTag = HMIRuntime.Tags("Temp_01_T0_B3") ' Temperatur 1:00 Uhr
objTag.Value = wsActive.cells(3,2).Value
objTag.Write

' etc...

excel.Workbooks.Close True 'Exceldatei schliessen
excel.Quit 'Excel schliessen
Set excel = Nothing 'Variable freigeben
End Function

Das VBScript sollte mit der folgenden Programmänderung funktionieren:

Option Explicit
Function action
Dim excel, wbActive, wsActive
'Create an Excel-Application object
Set excel = CreateObject("Excel.Application")
excel.Visible = 0
Set wbActive = excel.Workbooks.Open("D:\Postfach\KIS Wetterprognose WinCC.xls")
Set wsActive = wbActive.Worksheets("Tabelle1")
'----------------- WinCC Variable schreiben --------------------
'wsActive.cells(2,3) = Zeile 2, Spalte 3

Dim objTag

Set objTag = HMIRuntime.Tags("Temp_00_T0_B2") ' Temperatur 0:00 Uhr
objTag.Value = wsActive.cells(2,2).Value
objTag.Write

Set objTag = HMIRuntime.Tags("Temp_01_T0_B3") ' Temperatur 1:00 Uhr
objTag.Value = wsActive.cells(3,2).Value
objTag.Write

' etc...

wbActive.Close True 'Exceldatei schliessen
excel.Quit 'Excel schliessen
Set excel = Nothing 'Variable freigeben
End Function

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachtrag:

Der Speicher, den die Excel-Objekte belegen, muss freigegeben werden, damit die Excel-Instanz im Windows Task-Manager beendet wird.

Während der Laufzeit des VBScripts kann der Speicher freigegeben werden, indem den Objektvariablen der Wert Nothing zugewiesen wird.

Ansonsten wird spätestens beim Beenden des VBScripts der verwendete Speicher wieder freigegeben

Code:
Dim objExcel 
Dim objWBExcel
Dim objWSExcel
 
Set objExcel = CreateObject("Excel.Application") 
Set objWBExcel = objExcel.Workbooks.Open("F:\Mappe1.xls")
Set objWSExcel = objWBExcel.Worksheets("Tabelle1")
 
objWSExcel.Cells(2, 1).Value = objWSExcel.Cells(1, 1).Value * 2
 
objWBExcel.Close True
objExcel.Quit
 
Set objWSExcel = Nothing
Set objWBExcel = Nothing
Set objExcel = Nothing

Code:
Option Explicit
Function action 
Dim excel, wbActive, wsActive 
'Create an Excel-Application object 
Set excel = CreateObject("Excel.Application") 
excel.Visible = 0
Set wbActive = excel.Workbooks.Open("D:\Postfach\KIS Wetterprognose WinCC.xls") 
Set wsActive = wbActive.Worksheets("Tabelle1") 
'----------------- WinCC Variable schreiben -------------------- 
'wsActive.cells(2,3) = Zeile 2, Spalte 3
 
Dim objTag 
 
Set objTag = HMIRuntime.Tags("Temp_00_T0_B2") ' Temperatur 0:00 Uhr
objTag.Value = wsActive.cells(2,2).Value 
objTag.Write 
 
Set objTag = HMIRuntime.Tags("Temp_01_T0_B3") ' Temperatur 1:00 Uhr 
objTag.Value = wsActive.cells(3,2).Value 
objTag.Write 
 
' etc...
 
wbActive.Close True 'Exceldatei schliessen 
excel.Quit 'Excel schliessen 
Set wsActive = Nothing 'Speicher freigeben
Set wbActive = Nothing
Set excel = Nothing 
End Function

Gruß Kai
 
Hi an alle,

also genützt hat bisher nichts, aber ich habe jetzt mal auf verschiedenen Rechnern mein Script laufen lassen und siehe da, auf beiden Rechnern (Office 2003 SP3 + Office 2002) funktioniert alles, excel.exe wird geschlossen. Nur auf meinem Rechner (auch Office 2003, Excel 11.8307.8221 SP3) läuft es nicht. Ich schätze da ist bei mir was vergurkt?
Ich versuche es mal mit einer Neuinstallation und melde mich nochmal.

Gruß
Move
 
Hi Fangemeinde,

bin jetzt auf der Anlage wo auch der Siemens-Rechner (Rack-PC) mit der install. Office 2003 Version steht.
Hier funktioniert jetzt alles tadellos. Excel.exe schließt jedesmal nach Scriptende.

Also Dank an alle.

Gruß
Move
 
Zurück
Oben