# VBScript: Speicherpfad einer neuen Datei (cvs) festlegen mit Pfad Browser



## mcb (18 Mai 2019)

Hallo,

an dieser Stelle erst einmal ein grosses Lob an dieses Forum. Man findet hier richtig viele Informationen und meisst bleiben die Chats auch sachlich und loesungsorientiert.

Da dies hier mein 1. Beitrag ist, stelle ich mich kurz vor:
Michael, 32, Oberschwaben, IBN'er (selbstst.).

Mein Problem:
Ich wuerde gerne ein Skript schreiben, welches es dem Benutzer ermoeglicht *ein Dateibrowser zu Oeffnen*, in welchem er einen *neuen Dateinamen* eingeben kann und dann eine *neue (csv) Datei angelegt wird* (welches mein Skript dann mit Daten fuellt).

Leider funktioniert folgende Funktion in Win7 nicht mehr (nur in WinXP):
("UserAccounts.CommonDialog")
Mit dieser Funktion wurde das Problem bisher so geloest:
...
Dim objDialog 
Set objDialog = CreateObject("UserAccounts.CommonDialog") 
objDialog.InitialDir = "g:\FLASH\Datensaetze"
objDialog.Filter = "CSV (*.csv)|*.csv"
objDialog.FilterIndex = 0
objDialog.ShowOpen()
...
If fso.FileExists(path) = 0 Then   
   fso.CreateTextFile path, 0
...

PS:
Ich habe schon viel in diesem Forum und im Netz gesucht und es gibt auch viele Lösungen, aber immer nur welche, bei dem sich die zu im-oder exportierende Datei in einem festen Pfad (ohne Browserfunktion) befindet. Oder mit einer Browserfunktion, nur eine bereits bestehende Datei ausgewählt werden kann.

Vielen Dank im Vorraus fuer eure Hilfe!
Michael


----------



## PN/DP (18 Mai 2019)

In welcher Visu auf welchem Gerät soll Dein VBS Skript laufen?
In TIA WinCC Advanced PC Runtime könntest Du mit "ÖffneDateiBrowser" den Ordner/Pfad der Datei auswählen lassen und in einem (zusätzlichen) EA-Feld den gewünschten Dateiname eingeben lassen.

Harald


----------



## mcb (18 Mai 2019)

Hallo Harald,

ich habe schon viele gute Beiträge von dir gelesen, an dieser Stelle vielen Dank für deinen Einsatz!

Habe mit dem Stichwort "ÖffneDateiBrowser" mal gesucht und gesehen das ich nicht der einzige mit diesem Problem bin.
Leider scheint es bisher nur eine Workaround Lösung zu geben.

Falls ich noch eine bequemere Lösung im Netz finde oder mich ein Geistesblitz trifft (bei meinen VBScript Kenntnissen wohl nicht zu erwarten), stelle ich es hier ein.


----------



## Heinileini (19 Mai 2019)

mcb schrieb:


> Ich wuerde gerne ein Skript schreiben, welches es dem Benutzer ermoeglicht *ein Dateibrowser zu Oeffnen*, in welchem er einen *neuen Dateinamen* eingeben kann und dann eine *neue (csv) Datei angelegt wird* (welches mein Skript dann mit Daten fuellt).


Ich weiss nicht, ob ich Deine Aufgabenstellung richtig verstanden habe und auch nicht, inwieweit man in diesem Punkt von VBA auf VBS schliessen kann.
Das Problem scheint mir zu sein, dass Du zuerst eine Datei "anlegen" möchtest und sie erst später mit Inhalt füllen willst.
Wäre es denn in Deinem Fall möglich, Die Datei zunächst als leere Datei anzulegen, sie später mit APPEND zu öffnen und Deinen Inhalt an die in der Datei vorhandenen Leere anzuhängen?
Wenn es darum geht, dem Bediener einen "vorgefertigten" DateiNamen anzubieten, den er nur noch geringfügig anpassen/ergänzen muss, könntest Du speziell für diesen Zweck eine schreibgeschützte  DummyDatei mit dem vorgefertigten Namen anlegen, so dass der Bediener in diesem Namen herum editieren kann, ohne aber die Vorlage zu zerstören.
In VBA gibt es z.B.

```
With Application.FileDialog(msoFileDialogFilePicker)
'    msoFileDialogFolderPicker. einen Ordner auswählen
'    msoFileDialogFilePicker.   eine Datei auswählen [COLOR=#222222][FONT=Verdana](s.o.)
[/FONT][/COLOR]'    msoFileDialogOpen.         eine Datei öffnen
'    msoFileDialogSaveAs.       eine Datei speichern
'   .Filters.Add "*export*", "*.csv", 1
'   .Filters.Add "anything goes", "*.*", 2
    .FilterIndex = 1
    .AllowMultiSelect = False
    .InitialFileName = DummyFile ' Pfad + DateiName einer vorhandenen Datei, z.B. gefunden per Pfad & "\" & Dir(Pfad & "\*.csv")
    .Show
    xSoFiNa = .SelectedItems(1)
    End With
```
wie ich es mal zum Auswählen einer zu öffnenden Datei verwendet habe. Die 4 angebotenen Varianten (Folder auswählen, File auswählen, File auswählen und öffnen, File auswählen oder FileName eingeben und Datei abspeichern) habe ich oben als Kommentar eingefügt.
Vielleicht kann das als Basis für Experimente dienen?

Gruss, Heinileini

PS:
Durch mein Testen in VBA unter Excel und Angabe des Objektes Application, entsteht ein DateiName z.B. wie "DummyFile.csv.xlsx".
Man könnte aber problemlos noch zwischen Anlegen und Auffüllen der Datei den DateiNamen per Script umbenennen.


----------



## PN/DP (19 Mai 2019)

Heinileini schrieb:


> Ich weiss nicht [...] inwieweit man in diesem Punkt von VBA auf VBS schliessen kann.


Der Datei-Browser-Dialog, den Du in VBA in MSOffice aufrufst, den kann man in VBS in WinCC Runtime nur nutzen wenn auf dem Runtime System MS Office installiert ist.

Das Problem ist, daß früher ein Datei-Browser-Dialog aus einer externen DLL aufgerufen wurde, die es ab Win 7 nicht mehr gibt.
Anscheinend gibt es in Windows keinen anderen aus Anwendungen nutzbaren ("globalen") Datei-Browser-Dialog.
Als Alternative hat die WinCC Runtime einen eigenen Datei-Öffnen-Dialog, der allerdings nicht mit dem Name einer nicht existierenden Datei verlassen werden kann - er kann so nicht für Datei-Speichern-Unter verwendet werden.

Harald


----------



## faust (19 Mai 2019)

Hallo,

es gibt von Siemens seit einiger Zeit eine sogenannte HMI Toolbox. Link habe ich leider gerade nicht zur Hand.
Darin gibt es auch einen script-basierten Datei-Explorer, dieser enthält auch eine "Speichern als..."-Funktion.
Hier ein Screenshot:




Gruß, Fred


----------



## DeltaMikeAir (19 Mai 2019)

> Link habe ich leider gerade nicht zur Hand.



https://support.industry.siemens.com/cs/document/106226404/toolbox-für-hmi-projekte?dti=0&lc=de-WW


----------



## Heinileini (21 Mai 2019)

> es gibt von Siemens seit einiger Zeit eine sogenannte HMI Toolbox. Link habe ich leider gerade nicht zur Hand.
> Darin gibt es auch einen script-basierten Datei-Explorer, dieser enthält auch eine "Speichern als..."-Funktion.


Also sollte auf diesem Wege umsetzbar sein, was ich in #4 so unpassend in VBA angedacht hatte!?
Datei (leer oder mit unerwünschtem Inhalt) erstmal "anlegen", nur um an den DateiNamen zu kommen und später ggfs mit APPEND auffüllen oder löschen und neu anlegen und mit dem gültigen Inhalt auffüllen. Das ist natürlich ein umständliches WorkAround mit einem blödsinnigen ZwischenProdukt, aber, wenn's denn sein muss . . .


----------



## mcb (22 Mai 2019)

Servus,

es hat nun ein bischen gedeuert (komme nur Abends dazu an dem Projekt zu arbeiten) hier nun meine Vorgehensweisse, welche eine Mischung aus allen Beitraegen ist:


1. Ich habe 3 Buttons Uebereinander angelegt und jeweils mit der Funktion "OeffneDateiBrowser" versehen. (mit entsprechend eingestellten Sichtbarkeiten)

2. Der 1. Button startet den Browser mit dem Pfad "C:\Program Files\Microsoft Office\Office15" in welchem sich die Excel.exe befindet (welche dann vom Benutzer ausgewählt wird). Als Rueckgabewert wird der Pfad der ausgewaehlten Applikation (hier Excel) in eine Variable_1 gespeichert.

3. Der 2. Button startet den Browser mit dem Pfad "C:\Kunden\Kunde xy\Biegemschine\Datensätze" in welchem sich die Vorlagedatei befindet (welche dann vom Benutzer ausgewählt wird). Als Rueckgabewert wird der Pfad der ausgewaehlten Vorlage (hier Dummy) in eine Variable_2 gespeichert.

4. Der 3. Button startet mein Skript welches wie folgt aufgebaut ist:
'Übergabe des Speicherpfades der ausgewaehlten Vorlagedatei
path = SmartTags("DB 010 HMI_Komunikation_VBS_Export_Pfad Dummy")
' Fuellen der Vorlage mit Daten
....
'Excel Oeffnen um Daten in neue Exceldatei speichern zu koennen    
StartProgram SmartTags("DB 010 HMI_Komunikation_VBS_Export_Excel Pfad"), SmartTags("DB 010 HMI_Komunikation_VBS_Export_Pfad Dummy"),hmiShowNormal, hmiYes
                                            --> Pfad von Button 1 (Applikation)                                                  --> Pfad von Button 2 (Vorlage)                

5. Die Exceldatei mit den aktuellen Daten ist nun offen und kann vom Benutzer wie gewohnt gehandelt werden (bearbeiten, speichern unter, usw.).

Info: Der Button 1 und 2 werden unsichtbar nachdem ein Pfad ausgewaehlt wurde (somit muss dies nur beim 1. mal gemacht werden, da die Pfade in einen Remanenten DB gepeicher werden)


@ Heinileini
Danke fuer den Tip mit: "Application.FileDialog(msoFileDialogFilePicker)", leider kennt TIA den Befehl "msoFileDialogFilePicker" nicht.
Danke fuer den Tip mit der leeren Datei, welche anschliessend gefuellt wird.

@ Harald
Korrekt: Der Datei-Oeffnen Dialog (oder Datei Explorer aus den Toolbox Funktionen) enthaelt leider keine "Speichern unter" Funktion.

@ faust
Siehe @ Harald

@ DeltaMikeAir
Danke fuer den Link


Verbesserungsvorschlaege sind natuerlich gern wilkommen.

Nochmals vielen Dank und viele Gruesse an alle!!!


----------

