WORD + EXCEL

Der Zugriff per Skript auf WORD und EXCEL ist recht einfach. Man muss nur jeweils einer Variablen das entsprechende Objekt zuweisen, z.B. mit
  • Set word = CreateObject("Word.Application") bzw.
  • Set excel = CreateObject("Excel.Application")

Bezogen auf das Objekt kann man dann VBA-Befehle anwenden, am besten mit

With Objekt
Anweisung
End With

VBS-Beispiel: Übertragung von Bilddaten zu einem WORD-Dokument
Voraussetzung ist, dass WORD installiert ist.
Option Explicit
Dim Eintrag
 
if FF_GetImageCount > 0 then
    call Bilddaten
    call WordDokument
else
    msgbox "Es wurden keine Bilder ausgewählt!",vbExclamation,"Abbruch"
end if
'---------------------------------------------------------------------------------------------
Sub WordDokument
Dim word
 
set word = CreateObject("Word.Application")    'Word-Objekt

'Word-Aufruf
with word
    .Documents.Add            'Standardvorlage öffnen
    .Selection.TypeText Eintrag    'Texteintrag in Word
    .visible = true        'Dokument sichtbar machen
end with
 
Set word = Nothing    'Wordobjekt frei geben

End Sub
'---------------------------------------------------------------------------------------------
Sub Bilddaten
Dim n,p
 
Eintrag = "Pfad " & FF_GetImagePath() & vbNewLine & vbNewLine
 
for n = 0 to FF_GetImageCount -1
    FF_LoadImage(FF_GetImageName(n))
 
    p = InStrRev(FF_GetImageName(n),"\")
    Eintrag = Eintrag & "Bild " & mid(FF_GetImageName(n),p+1)
    if FF_HasExif() then
        Eintrag = Eintrag & vbNewLine & "Kamera " & FF_GetExifTag("Model")
        Eintrag = Eintrag & vbNewLine & "Aufnahme vom " & FF_GetExifTag("DateTimeOriginal")
        Eintrag = Eintrag & vbNewLine & "Belichtung " & FF_GetExifTagAdvanced("ExposureTime") & " sec. "
        Eintrag = Eintrag & "mit Blende " & FF_GetExifTagAdvanced("FNumber")
        Eintrag = Eintrag & vbNewLine & "Brennweite " & FF_GetExifTagAdvanced("FocalLength") & " mm"
        Eintrag = Eintrag & vbNewLine & "ISO " & FF_GetExifTag("ISOSpeedRatings")
        if FF_GetExifTag("Flash") mod 2 = 0 then
            Eintrag = Eintrag & " ohne Blitz"
        else
            Eintrag = Eintrag & " mit Blitz"
        end if
    else
        Eintrag = Eintrag & vbNewLine & "Keine Kameradaten!"
    end if
 
    Eintrag = Eintrag & vbNewLine & vbNewLine
next
 
End Sub
'---------------------------------------------------------------------------------------------
Nach Zusammenfassung der Bilddaten in der Variable Eintrag wird mit Documents.Add die Standardformatvorlage geöffnet und dort mit Selection.TypeText der Inhalt der Variablen eingetragen.
Will man jetzt beispielsweise Schriftart und Größe ändern und soll außerdem der Cursor am Dokumentenanfang stehen, ist das und anderes mit den entsprechenden VBA-Befehlen leicht realisierbar. Wenn man die VBA-Befehle nicht kennt, hilft der eingebaute Makrorekorder.
  • Anklicken von "Makro aufzeichnen"
  • Strg + A betätigen zur Markierung des gesamten Dokuments
  • Schriftart und Größe wählen, hier "Arial" und "10"
  • Strg + Pos1 betätigen um den Cursor auf den Dokumentenanfang zu stellen
  • Anklicken von "Aufzeichnung beenden"
Wählt man dann unter "Makros" das erstellte Makro mit "Bearbeiten" aus, wird die verwendeten VBA-Befehle mit ihren Variablen und Konstanten angezeigt:
Sub Makro1()
' Makro1 Makro
    Selection.WholeStory
    Selection.Font.Name = "Arial"
    Selection.Font.Size = 10
    Selection.HomeKey Unit:=wdStory
End Sub
 
Eine hier verwendete Konstante ist wdStory, die im Skript definiert werden muss. Um den Wert zu ermitteln, startet man das Makro im Einzelschritt mit F8. Wenn man jetzt den Cursor über wdStory verweilen lässt, wird der Wert 6 angezeigt. Man muss also definieren const wdStory = 6 und für Unit:=wdStory nur noch die Konstante einsetzen. Außerdem muss den VBA-Befehlen zur Anbindung an das Objekt jeweils ein Punkt vorangestellt werden.
Das sieht dann für die Routine WordDokument wie folgt aus:
Sub WordDokument
Dim word
 
set word = CreateObject("Word.Application")    'Word-Objekt

'Word-Aufruf
with word
    .Documents.Add            'Standardvorlage öffnen
    .Selection.TypeText Eintrag    'Texteintrag in Word

    '### Makroanfang
    const wdStory = 6
    .Selection.WholeStory
    .Selection.Font.Name = "Arial"
    .Selection.Font.Size = 10
    .Selection.HomeKey wdStory
    '### Makroende

    .visible = true        'Dokument sichtbar machen
end with
 
Set word = Nothing    'Wordobjekt frei geben

End Sub
 
VBS-Beispiel: Übertragung von Bilddaten zu einem EXCEL-Tabellenblatt
Voraussetzung ist, dass EXCEL installiert ist.
Option Explicit
Dim Array
 
if FF_GetImageCount > 0 then
    call Bilddaten
    call ExcelTabelle
else
    msgbox "Es wurden keine Bilder ausgewählt!",vbExclamation,"Abbruch"
end if
'---------------------------------------------------------------------------------------------
Sub ExcelTabelle
Dim excel
 
Set excel = CreateObject("Excel.Application")    'Excel-Objekt

'Excel-Aufruf
With excel
    .Workbooks.Add    'Tabellenblatt hinzufügen

    .ActiveSheet.Cells(3,1).Resize(ubound(Array,1)+1,ubound(Array,2)+1).Value = Array
    .ActiveSheet.Cells(1,1).Value = "Pad " & FF_GetImagePath()
    .visible = true    'Tabellenblatt sichtbar machen
end with
 
Set excel = Nothing        'Excelobjekt frei geben

End Sub
'---------------------------------------------------------------------------------------------
Sub Bilddaten
Dim n,p,HLarray,s
 
'Überschriften in Array eintragen
const HeadLine = "Bild/Kamera/Aufnahme vom/Zeit/Blende/Brennweite/ISO/Blitz"
HLarray = split(HeadLine,"/")
Redim Array(FF_GetImageCount,ubound(HLarray))
for n = 0 to ubound(HLarray)
    Array(0,n) = HLarray(n)
next
 
'Bilddaten in Array eintragen
for n = 0 to FF_GetImageCount -1
    FF_LoadImage(FF_GetImageName(n))
    p = InStrRev(FF_GetImageName(n),"\")
 
    s = 0
    Array(n+1,s) = mid(FF_GetImageName(n),p+1)    : s = s+1
    if FF_HasExif() then
        Array(n+1,s) = FF_GetExifTag("Model")    : s = s+1
        Array(n+1,s) = FF_GetExifTag("DateTimeOriginal")    : s = s+1
        Array(n+1,s) = FF_GetExifTagAdvanced("ExposureTime") & " sec."    : s = s+1
        Array(n+1,s) = FF_GetExifTagAdvanced("FNumber")    : s = s+1
        Array(n+1,s) = FF_GetExifTagAdvanced("FocalLength") & " mm"    : s = s+1
        Array(n+1,s) = FF_GetExifTag("ISOSpeedRatings")    : s = s+1
        if FF_GetExifTag("Flash") mod 2 = 0 then Array(n+1,s) = "Nein" else    Array(n+1,s) = "Ja"
    else
        Array(n+1,s) = "Keine Daten!"
    end if
next
 
End Sub
'------------------------------------------------------------------------------------------------

 
Hier werden die Bilddaten mit Spaltenüberschriften sinnvollerweise in eine Datentabelle Array eingetragen
und dann in das mit Workbooks.Add geöffnete Tabellenblatt mit ActiveSheet.Cells(Zeile,Spalte).Resize ab der 3. Zeile und der 1. Spalte die gesamte Tabelle in einem Rutsch eingetragen. Das geht erheblich schneller, als die Daten Zelle für Zelle zu übertragen.
Anschließend wird noch mit ActiveSheet.Cells(Zeile,Spalte).Value der Pfad des aktuellen Verzeichnis in die 1. Zeile eingetragen.
Will man beispielsweise noch die Spaltenbreite optimieren, ist die Ermittlung der notwendigen VBA-Befehle wie bereits beschrieben mit dem Makrorekorder möglich.
Das aufgenommene Makro sieht so aus:
Sub Makro1()
' Makro1 Makro
    Cells.Select
    Selection.Columns.AutoFit
End Sub
 
Die Routine Exceltabelle wird wie folgt ergänzt:
Sub ExcelTabelle
Dim excel
 
Set excel = CreateObject("Excel.Application")    'Excel-Objekt

'Excel-Aufruf
With excel
    .Workbooks.Add    'Tabellenblatt hinzufügen

    .ActiveSheet.Cells(3,1).Resize(ubound(Array,1)+1,ubound(Array,2)+1).Value = Array
 
    '#### Makroanfang
    .Cells.Select
    .Selection.Columns.AutoFit
    '#### Makroende

    .ActiveSheet.Cells(1,1).Value = "Pad " & FF_GetImagePath()
    .visible = true    'Tabellenblatt sichtbar machen
end with
 
Set excel = Nothing        'Excelobjekt frei geben

End Sub
 
Zu VBA-Befehlen, die nicht mit dem Makrorekorder zu ermitteln sind, findet man bei diversen Foren im Internet Hilfe.