meta data for this page
  •  

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.

  1. Option Explicit
  2. Dim Eintrag
  3.  
  4. if FF_GetImageCount > 0 then
  5. call Bilddaten
  6. call WordDokument
  7. else
  8. msgbox "Es wurden keine Bilder ausgewählt!",vbExclamation,"Abbruch"
  9. end if
  10. '---------------------------------------------------------------------------------------------
  11. Sub WordDokument
  12. Dim word
  13.  
  14. set word = CreateObject("Word.Application") 'Word-Objekt
  15.  
  16. 'Word-Aufruf
  17. with word
  18. .Documents.Add 'Standardvorlage öffnen
  19. .Selection.TypeText Eintrag 'Texteintrag in Word
  20. .visible = true 'Dokument sichtbar machen
  21. end with
  22.  
  23. Set word = Nothing 'Wordobjekt frei geben
  24.  
  25. End Sub
  26. '---------------------------------------------------------------------------------------------
  27. Sub Bilddaten
  28. Dim n,p
  29.  
  30. Eintrag = "Pfad " & FF_GetImagePath() & vbNewLine & vbNewLine
  31.  
  32. for n = 0 to FF_GetImageCount -1
  33. FF_LoadImage(FF_GetImageName(n))
  34.  
  35. p = InStrRev(FF_GetImageName(n),"\")
  36. Eintrag = Eintrag & "Bild " & mid(FF_GetImageName(n),p+1)
  37. if FF_HasExif() then
  38. Eintrag = Eintrag & vbNewLine & "Kamera " & FF_GetExifTag("Model")
  39. Eintrag = Eintrag & vbNewLine & "Aufnahme vom " & FF_GetExifTag("DateTimeOriginal")
  40. Eintrag = Eintrag & vbNewLine & "Belichtung " & FF_GetExifTagAdvanced("ExposureTime") & " sec. "
  41. Eintrag = Eintrag & "mit Blende " & FF_GetExifTagAdvanced("FNumber")
  42. Eintrag = Eintrag & vbNewLine & "Brennweite " & FF_GetExifTagAdvanced("FocalLength") & " mm"
  43. Eintrag = Eintrag & vbNewLine & "ISO " & FF_GetExifTag("ISOSpeedRatings")
  44. if FF_GetExifTag("Flash") mod 2 = 0 then
  45. Eintrag = Eintrag & " ohne Blitz"
  46. else
  47. Eintrag = Eintrag & " mit Blitz"
  48. end if
  49. else
  50. Eintrag = Eintrag & vbNewLine & "Keine Kameradaten!"
  51. end if
  52.  
  53. Eintrag = Eintrag & vbNewLine & vbNewLine
  54. next
  55.  
  56. End Sub
  57. '---------------------------------------------------------------------------------------------

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:

  1. Sub Makro1()
  2. ' Makro1 Makro
  3. Selection.WholeStory
  4. Selection.Font.Name = "Arial"
  5. Selection.Font.Size = 10
  6. Selection.HomeKey Unit:=wdStory
  7. 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:

  1. Sub WordDokument
  2. Dim word
  3.  
  4. set word = CreateObject("Word.Application") 'Word-Objekt
  5.  
  6. 'Word-Aufruf
  7. with word
  8. .Documents.Add 'Standardvorlage öffnen
  9. .Selection.TypeText Eintrag 'Texteintrag in Word
  10.  
  11. '### Makroanfang
  12. const wdStory = 6
  13. .Selection.WholeStory
  14. .Selection.Font.Name = "Arial"
  15. .Selection.Font.Size = 10
  16. .Selection.HomeKey wdStory
  17. '### Makroende
  18.  
  19. .visible = true 'Dokument sichtbar machen
  20. end with
  21.  
  22. Set word = Nothing 'Wordobjekt frei geben
  23.  
  24. End Sub

VBS-Beispiel: Übertragung von Bilddaten zu einem EXCEL-Tabellenblatt
Voraussetzung ist, dass EXCEL installiert ist.

  1. Option Explicit
  2. Dim Array
  3.  
  4. if FF_GetImageCount > 0 then
  5. call Bilddaten
  6. call ExcelTabelle
  7. else
  8. msgbox "Es wurden keine Bilder ausgewählt!",vbExclamation,"Abbruch"
  9. end if
  10. '---------------------------------------------------------------------------------------------
  11. Sub ExcelTabelle
  12. Dim excel
  13.  
  14. Set excel = CreateObject("Excel.Application") 'Excel-Objekt
  15.  
  16. 'Excel-Aufruf
  17. With excel
  18. .Workbooks.Add 'Tabellenblatt hinzufügen
  19.  
  20. .ActiveSheet.Cells(3,1).Resize(ubound(Array,1)+1,ubound(Array,2)+1).Value = Array
  21. .ActiveSheet.Cells(1,1).Value = "Pad " & FF_GetImagePath()
  22. .visible = true 'Tabellenblatt sichtbar machen
  23. end with
  24.  
  25. Set excel = Nothing 'Excelobjekt frei geben
  26.  
  27. End Sub
  28. '---------------------------------------------------------------------------------------------
  29. Sub Bilddaten
  30. Dim n,p,HLarray,s
  31.  
  32. 'Überschriften in Array eintragen
  33. const HeadLine = "Bild/Kamera/Aufnahme vom/Zeit/Blende/Brennweite/ISO/Blitz"
  34. HLarray = split(HeadLine,"/")
  35. Redim Array(FF_GetImageCount,ubound(HLarray))
  36. for n = 0 to ubound(HLarray)
  37. Array(0,n) = HLarray(n)
  38. next
  39.  
  40. 'Bilddaten in Array eintragen
  41. for n = 0 to FF_GetImageCount -1
  42. FF_LoadImage(FF_GetImageName(n))
  43. p = InStrRev(FF_GetImageName(n),"\")
  44.  
  45. s = 0
  46. Array(n+1,s) = mid(FF_GetImageName(n),p+1) : s = s+1
  47. if FF_HasExif() then
  48. Array(n+1,s) = FF_GetExifTag("Model") : s = s+1
  49. Array(n+1,s) = FF_GetExifTag("DateTimeOriginal") : s = s+1
  50. Array(n+1,s) = FF_GetExifTagAdvanced("ExposureTime") & " sec." : s = s+1
  51. Array(n+1,s) = FF_GetExifTagAdvanced("FNumber") : s = s+1
  52. Array(n+1,s) = FF_GetExifTagAdvanced("FocalLength") & " mm" : s = s+1
  53. Array(n+1,s) = FF_GetExifTag("ISOSpeedRatings") : s = s+1
  54. if FF_GetExifTag("Flash") mod 2 = 0 then Array(n+1,s) = "Nein" else Array(n+1,s) = "Ja"
  55. else
  56. Array(n+1,s) = "Keine Daten!"
  57. end if
  58. next
  59.  
  60. End Sub
  61. '------------------------------------------------------------------------------------------------

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:

  1. Sub Makro1()
  2. ' Makro1 Makro
  3. Cells.Select
  4. Selection.Columns.AutoFit
  5. End Sub

Die Routine Exceltabelle wird wie folgt ergänzt:

  1. Sub ExcelTabelle
  2. Dim excel
  3.  
  4. Set excel = CreateObject("Excel.Application") 'Excel-Objekt
  5.  
  6. 'Excel-Aufruf
  7. With excel
  8. .Workbooks.Add 'Tabellenblatt hinzufügen
  9.  
  10. .ActiveSheet.Cells(3,1).Resize(ubound(Array,1)+1,ubound(Array,2)+1).Value = Array
  11.  
  12. '#### Makroanfang
  13. .Cells.Select
  14. .Selection.Columns.AutoFit
  15. '#### Makroende
  16.  
  17. .ActiveSheet.Cells(1,1).Value = "Pad " & FF_GetImagePath()
  18. .visible = true 'Tabellenblatt sichtbar machen
  19. end with
  20.  
  21. Set excel = Nothing 'Excelobjekt frei geben
  22.  
  23. End Sub

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