# wieder mal: DB-Werte per Script in Excel



## Jelly (15 April 2010)

Hallo zusammen!

Ich muss das Thema wiedermal aufnehmen, habe schon etwa 100 Beiträge hier gefunden, allerdings fehlt jedesmal der entscheidende Teil:

Eine Anlage prüft Ventile auf Funktion und die Messdaten sollen in eine Excel-Tabelle hinterlegt werden. Bei meiner Runtime funktioniert das auch schon gut, die Daten werden per Script in die Tabelle geschrieben, wobei auch die Tabelle, die Datei und auch der Ordner erst erstellt wird. Nun sind das recht viele Prüfungen pro Tag, wodurch eben sehr viele Excel-Dateien entstehen würden. Ich hätte gerne, dass ich die Datei wieder öffnen kann und diese um eine Tabelle ergänze, dann die Daten eintragen und wieder speichern und schliessen.

Wie gesagt, das Grundprinzip hab ich:


```
Dim IP
Dim FrgName
Dim OrdnerName
Dim DateiName
Dim erw
Dim pfad

'Parameter für Skript
IP = "192.168.1.10"
FrgName = "ewj"
OrdnerName = "zgt"
DateiName = "asd"
erw = ".xls"
pfad = "\\" & IP & "\" & FrgName & "\" & OrdnerName

Dim fso
Dim fil
Dim ord
Dim xlApp
Dim xlWB
Dim xlWS

'File-Objekt erstellen
    Set fso = CreateObject("Scripting.FileSystemObject")                    'File-Objekt erstellen
        
'Ordner erstellen, sofern nicht vorhanden
    If Not fso.FolderExists(pfad) Then
        Set ord = fso.CreateFolder(pfad)                                    'Ordner erstellen
    End If
    
'Excel-Applikationen
    Set xlApp = CreateObject("Excel.Application")                            'Excel-Applikation aufrufen        
    xlApp.Visible = True                                                    'Sichtbarkeit von Excel
    
'Excel-Datei erstellen, sofern nicht vorhanden
    If Not fso.FileExists(pfad & "\" & DateiName & erw) Then
        Set xlWB = xlApp.Workbooks.Add()                                    'Datei erstellen
        xlWB.SaveAs(pfad & "\" & DateiName & erw)                            'Datei speichern unter bestimmten Namen    
    End If    

'Worksheet erstellen und Namen vergeben
    Set xlWS = xlWB.Worksheets.Add                                            'Tabelle aussuchen
    xlWS.name = (DateiName)                                                    'Tabellennamen ändern




    
'AB HIER TEST                                            
    Dim xlWS2
    Set xlWS2 = xlWB.Worksheets.Add
    xlWS2.name = ("11123")    
    
'ENDE TEST




    
'Rohtabellen löschen        
    If Not xlWB.Worksheets("Tabelle1") Is Nothing Then
        xlWB.Worksheets("Tabelle1").Delete        
    End If        
    If Not xlWB.Worksheets("Tabelle2") Is Nothing Then
        xlWB.Worksheets("Tabelle2").Delete        
    End If    
    If Not xlWB.Worksheets("Tabelle3") Is Nothing Then
        xlWB.Worksheets("Tabelle3").Delete        
    End If    

'Daten eintragen    
    xlWS.range("c3").Value = "Name"
    xlWS.range("d3").Value = "Jehle"
    xlWS.range("c4").Value = "Vorname"
    xlWS.range("d4").Value = "jippie"
    xlWS.range("c5").Value = "Alter"
    xlWS.range("d5").Value = "sag ich nich"
    xlWS.range("c6").Value = "Song"
    xlWS.range("d6").Value = "Pokerface"
    xlWS.range("c7").Value = "noch mehr Text"
    xlWS.range("d7").Value = "und noch mehr..."
    xlWS.range("c8").Value = "Name 1"
    xlWS.range("d8").Value = "Name 2"
    
'Datei speichern und schliessen    
    xlApp.ActiveWorkbook.Save                                                'Datei speichern
    xlApp.ActiveWorkbook.Close                                                'Datei schliessen
    xlApp.ActiveWorkbook.Quit
    xlApp.Quit                                                                'Excel beenden
    xlApp.Visible = False                                                    'Sichtbarkeit von Excel
    Set xlApp = Nothing
```
Zwischen "AB HIER TEST" und "ENDE TEST" bin ich nun dran. Denn wenn die Datei einmal geöffnet und geschlossen wurde, kann ich sie nicht mehr öffnen bzw. bekomme eben keine weitere Tabelle zugefügt. Für jeden Prüfling hätte ich gerne nur eine neue Tabelle und nicht eine komplett neue Excel-Datei.

Also falls jemand helfen kann, wäre ich sehr dankbar, sitze schon Tage dran, VBS ist auch neu für mich, aber das obenstehende hab ich ja schon mal.

was ich nachher habe: WCF 2008 Adv, MP277 Key per Ethernet mit Rechner mit fester IP verbunden.

Nice day!


----------



## marlob (15 April 2010)

Hast du dazu auch schon den Beitrag in der FAQ gelesen?
http://www.sps-forum.de/showthread.php?t=15348
Dort schreibt Larry unter anderem


> Zitat von *Larry Laffer*
> _Hallo Volker,
> zu dem genannten FAQ hätte ich noch ein schönes Addon.
> Wenn man ständig auf Excel zugreifen möchte, um Daten dahin zu schreiben, dann kann man es auch als Instanz geöffnet lassen (mit dem richtigen Workbook) und dann ständig auf die geöffnete Instanz zugreifen. Das spart Systemresourcen ..._
> die datei (EXCEL-Script.doc) ist im anhang


----------



## Jelly (15 April 2010)

*jep*

Danke, aber die hab ich schon etwa 47 mal angesehen. und hier wird die tabelle auch nur 1x geöffnet, seh ich das richtig? klar scheint logisch, die datei geöffnet zu lassen. aber ich weiss nie, was nach dem Prüfungsende passiert. die lassen die anlage genauso laufen, auch übers wochenende, alles bleibt an. dies könnte man in der sps erkennen, klar.
schliessen und öffnen wäre mir nun lieber.


----------



## Larry Laffer (15 April 2010)

Hallo,
ich habe das gerade mal gegen-gechecked.
In meinem Script Schliesse (und speichere) ich das Workbook und und beende die Applikation - also so :
	
	



```
xlWB.Close
xlApp.Quit
```
... versuch das doch mal ...

Gruß
LL


----------



## Jelly (15 April 2010)

danke das prüf ich mal.

was ich eben gesehen habe:

```
'Excel-Datei erstellen, sofern nicht vorhanden
    If Not fso.FileExists(pfad & "\" & DateiName & erw) Then
        Set xlWB = xlApp.Workbooks.Add()                                    'Datei erstellen
        xlWB.SaveAs(pfad & "\" & DateiName & erw)                            'Datei speichern unter bestimmten Namen    
    End If
```
d.h. wenn die datei schon existiert, wird "Set xlWB = xlApp.Workbooks.Add()" ja nicht bearbeitet, was widerum heisst, dass die Datei gar nicht GEÖFFNET WIRD, sondern nur die Applikation, richtig? ich habe das nun so:


```
'Excel-Datei erstellen, sofern nicht vorhanden
    If Not fso.FileExists(pfad & "\" & DateiName & erw) Then
        Set xlWB = xlApp.Workbooks.Add()                                    'Datei erstellen und automatisch öffnen
    Else
        Set xlWB = xlApp.Workbooks.Open (pfad & "\" & DateiName & erw)        'Datei öffnen, wenn sie bereits existiert
    End If    
    xlWB.SaveAs(pfad & "\" & DateiName & erw)
```
damit kann ich die datei auch wieder öffnen. klapt prima nun!

nur was noch ist, dass beim speichern die Datei überschrieben wird, worauf eine Rückfrage erscheint. Das überschreiben soll aber automatisch gehen.
und KILL geht nicht, da ich sonst meine anderen daten lösche...


----------



## Larry Laffer (15 April 2010)

... da gab es auch noch was ... versuch mal :
	
	



```
xlWB.Close [B][COLOR=red]true[/COLOR][/B]
```
.. die Meldung müßte beim Schliessen desd Workbooks kommen und nicht beim Speichern ...

Gruß
LL


----------



## Jelly (19 April 2010)

*nun so weit...*

also soweit hab ich es mal. Nun läufts per Runtime sehr gut, freu!

nun kommt das große ABER:
was ich nicht beachtet habe (sicher ein Neulings-Fehler): mit der Runtime funzt es ja, nur nicht im Panel.
der bisherige Text sieht so aus:


```
Dim IP
Dim FrgName
Dim OrdnerName
Dim DateiName
Dim erw
Dim pfad

'Parameter für Skript
IP = "192.168.1.10"
FrgName = "ewj"
OrdnerName = "zgt"
DateiName = "asd"
erw = ".xls"
pfad = "\\" & IP & "\" & FrgName & "\" & OrdnerName

Dim fso
Dim fil
Dim ord
Dim xlApp
Dim xlWB
Dim xlWS

'File-Objekt erstellen
      Set fso = CreateObject("Scripting.FileSystemObject")                        'File-Objekt erstellen
        
'Ordner erstellen, sofern nicht vorhanden
    If Not fso.FolderExists(pfad) Then
        Set ord = fso.CreateFolder(pfad)                                    'Ordner erstellen
    End If
    
'Excel-Applikationen
    Set xlApp = CreateObject("Excel.Application")                            'Excel-Applikation aufrufen        
    xlApp.Visible = True                                                    'Sichtbarkeit von Excel
    
'Excel-Datei erstellen, sofern nicht vorhanden und dann öffnen
    If Not fso.FileExists(pfad & "\" & DateiName & erw) Then
        Set xlWB = xlApp.Workbooks.Add()                                    'Datei erstellen und automatisch öffnen
        xlWB.SaveAs(pfad & "\" & DateiName & erw)                            'Datei speichern unter bestimmten Namen    
    Else
        Set xlWB = xlApp.Workbooks.Open (pfad & "\" & DateiName & erw)        'Datei öffnen, wenn sie bereits existiert
        xlWB.Save                                                            'Datei speichern
    End If    
                                    
        
'Worksheet erstellen und Namen vergeben
    Set xlWS = xlWB.Worksheets.Add                                            'Tabelle aussuchen
    xlWS.name = ("6680")                                                    'Tabellennamen ändern

'Rohtabellen löschen        
    If Not xlWB.Worksheets("Tabelle1") Is Nothing Then
        xlWB.Worksheets("Tabelle1").Delete        
    End If        
    If Not xlWB.Worksheets("Tabelle2") Is Nothing Then
        xlWB.Worksheets("Tabelle2").Delete        
    End If    
    If Not xlWB.Worksheets("Tabelle3") Is Nothing Then
        xlWB.Worksheets("Tabelle3").Delete        
End If    

'Daten eintragen    
    xlWS.range("c3").Value = "Prüfprogramm"    
    xlWS.range("c4").Value = "Prüflingsnummer"
    xlWS.range("c8").Value = "Datum"
    xlWS.range("d8").Value = "Uhrzeit"
    
'Datei speichern und schliessen    
    xlApp.ActiveWorkbook.Save                                                'Datei speichern
    xlApp.ActiveWorkbook.Close                                                 'Datei schliessen
    xlApp.ActiveWorkbook.Quit
    xlApp.Quit                                                                'Excel beenden
    xlApp.Visible = False                                                    'Sichtbarkeit von Excel
    Set xlApp = Nothing
```
das nützt aber recht wenig, richtig?

weiss nun jemand, ob das alles fürn Eimer ist?
was sicher sein muss ist, dass ich in eine neue Excel-Tabelle Daten eintragen soll, eine csv oder so tuts nicht...
und eigentlich ist es ja nur der code der die Datei erzeugt usw. richtig?
hat jemand hilfe?


----------



## Larry Laffer (19 April 2010)

Hallo,
damit das Ganze funktioniert muß auf dem Rechner Excel installiert sein. Wenn dein Panel ein Panel-PC ist, dann sehe ich da kein Problem - allerdings schon bei einem Multipanel oder noch darunter ... 

Gruß
LL


----------



## Jelly (19 April 2010)

*hm*

dann hab ich wohl ins schwarze gegriffen....
habe ein mp277 Key

auf dem Empfangs-rechner ist excel drauf, ja. auf dem panel natürlich nicht.

oje...


----------



## Larry Laffer (19 April 2010)

... du mußt dabei berücksichtigen, dass in dem Script die Fähigkeiten und Eigenschaften von Excel (lokal installiert) genutzt werden ...

Was hast du nun vor ?
CSV wäre ja auch noch ein Weg und auf dem PC ggf. eine Art Import initiieren ...


----------



## Jelly (19 April 2010)

Larry Laffer schrieb:


> ... du mußt dabei berücksichtigen, dass in dem Script die Fähigkeiten und Eigenschaften von Excel (lokal installiert) genutzt werden ...
> ...



ja das habe ich mittlerweile auch befürchtet.

Werd nun folgendes probieren:

Ich erstelle eine csv-Datei und trage mir die Werte und Texte ein, muss eben alles schön mit ";" trennen, damit ich eine passende Aufteilung erhalte. aber letztendlich kann ich diese ja sicher einmal als *.csv oder am ende als *.xls speichern. das werd ich jetzt noch probieren...
und wenn das funzt, kann der user diese xls-datei auf SEINEM rechner öffen, nehme ich an...


----------



## Jelly (19 April 2010)

na toll, da brauch ich ja ebenfalls

```
Set fso = CreateObject("Scripting.FileSystemObject")
```
stimmt das?


----------



## JesperMP (19 April 2010)

Es steht alles in Volker's FAQ, unter "wince".


----------



## Jelly (20 April 2010)

Moin!

ja wie schon erwähnt, diese Seite ist mittlerweile meine Startseite im Browser geworden. aber kann das sein, dass die programmzeilen bei wince auch nur auf dem Panel funktionieren und in der Runtime nicht?

Wäre für mich jedenfalls logisch... kann nämlich nicht mal einen Ordner erstellen.


----------



## JesperMP (20 April 2010)

Jelly schrieb:


> aber kann das sein, dass die programmzeilen bei wince auch nur auf dem Panel funktionieren und in der Runtime nicht?


Genau. Code für Win CE kannst Du nicht unter Win XP/Vista/7 testen.
:roll:


----------



## Larry Laffer (20 April 2010)

hattest du denn geplant, die gleiche Applikation in eine Runtime und in ein MP zu spielen ? Das macht doch gar keinen Sinn ...


----------



## Jelly (20 April 2010)

ja sorry, muss auch erst lernen. hatte bisher nicht mit so was zu tun... dachte wenigstens, dass ich die "wince-befehle" in der RT laufen lassen kann, aber ok, ich sehs ja ein...
werd glei mal wieder zur Firma fahren und am Panel probieren.
Trotzdem Dankeschön!


----------



## PN/DP (20 April 2010)

*steht schon alles in dem FAQ*



Jelly schrieb:


> kann das sein, dass die programmzeilen bei wince auch nur auf dem Panel funktionieren und in der Runtime nicht?


Wenn Du in dem von Jesper verlinkten FAQ


JesperMP schrieb:


> Es steht alles in Volker's FAQ, unter "wince".


auch den Beitrag #2 liest, dann findest Du die Antwort auf Deine Frage.


PN/DP schrieb:


> Beachte und vergleiche die *unterschiedlichen* Befehle, je nachdem, ob das Skript unter WinCE (MP270)
> oder Win32 (PC-Windows) läuft.


Und Du findest eine Lösung für das Testen eines Panel-Projektes mit der PC-Runtime:


PN/DP schrieb:


> Damit ich meine Panel-Projekte komplett unter Windows XP testen/simulieren kann,
> habe ich im WCCflexible-Projekt eine interne Panel-Variable "_System\!_RT-Sim_!"
> vom Typ Byte, deren Startwert ich auf 0 oder 1 festlege, je nachdem, ob die Runtime
> auf dem Panel oder auf dem WinXP-Testsystem laufen soll:
> 0=RT auf WinCE-OP / 1=RT auf PC (Simulation/Test)


Alle bei WinCE und Win32 unterschiedlichen Programmzeilen sind dann doppelt in den Scripten vorhanden und mit der 
Panel-Variable "_System\!_RT-Sim_!" wird dann gesteuert, welche Zeilen die Runtime ausführen soll:

```
If SmartTags("_System\!_RT-Sim_!") Then [COLOR="SeaGreen"]' PC-Windows
    ' Programmzeilen für Ablauf unter Win32
    ' ...[/COLOR]
Else [COLOR="SeaGreen"]' WinCE
    ' Programmzeilen für Ablauf unter WinCE
    ' ...[/COLOR]
End If
```
Gruß
Harald


----------

