Discussion:
Grafik, Größe anpassen
(zu alt für eine Antwort)
Andreas
2006-01-21 08:41:45 UTC
Permalink
Hallo,

kann mit VBA die Größe einer Grafik an eine bestimmte Vorgabe
angepasst werden, wenn die Grafik größer ist, als die Vorgabe? Das
Seitenverhältnis soll beibehalten werden. Grafiken, die kleiner als
die Vorgabe sind, sollen so belassen werden, wie sie sind.

Lässt sich das mit einer If...Then...Else-Anweisung machen?
Wie heißen die Eingabefelder, in die die Größe der Grafik eingegeben
wird? Sind das die Folgenden?

Selection.InlineShapes(1).Height = 283.44
Selection.InlineShapes(1).Width = 326.54

Sind die Angaben Pixel? Muss da eine Zahl stehen oder kann auch eine
Variable eingesetzt werden? Kann das in ein metrisches Maß umgerechnet
werden?


Vielen Dank!

Grüße,
Andreas
Thomas Gahler
2006-01-21 16:30:10 UTC
Permalink
Hallo Andreas
Post by Andreas
kann mit VBA die Größe einer Grafik an eine bestimmte
Vorgabe angepasst werden, wenn die Grafik größer ist,
als die Vorgabe?
Ja sicher kann man das machen
Post by Andreas
Das Seitenverhältnis soll beibehalten werden.
Das natürlich auch. Ein Dreisatz macht es möglich ;-)
Post by Andreas
Grafiken, die kleiner als die Vorgabe sind, sollen so
belassen werden, wie sie sind.
Na dann prüfen wir das zuerst ;-)
Post by Andreas
Lässt sich das mit einer If...Then...Else-Anweisung machen?
Genau, das ist gesucht....
Post by Andreas
Wie heißen die Eingabefelder, in die die Größe der Grafik
eingegeben wird? Sind das die Folgenden?
Selection.InlineShapes(1).Height = 283.44
Selection.InlineShapes(1).Width = 326.54
Das sind keine Eingabefelder, das nennt man Eigenschaften.
Post by Andreas
Sind die Angaben Pixel?
Nein in Points.
Post by Andreas
Muss da eine Zahl stehen oder kann auch eine
Variable eingesetzt werden?
Eine Zahl, eine Variable, ein Konstante, eien Berechung. Alles ist
möglich...
Post by Andreas
Kann das in ein metrisches Maß umgerechnet werden?
Jawohl, dazu stehen dir zwei Methoden zur Verfügung
- PointsToCentimeters
und
- CentimetersToPoints


Und so könnte man das machen. Die gewünste Breite ist hier in einer
Konstante definiert. Das Makro prüft, ob innerhalb der Markierung
InlineShapes vorhanden sind und bearbeitet diese. Sind keine InleinShapes in
der Markierung enthalten, dann wird das ganze Dokument überarbeitet. Diese
Verhalten lässt sich natürlich auch anpassen...



Sub Demo()
Const sMAX_WIDTH As Single = 5.5 'cm

Dim rng As Word.Range
Dim ils As Word.InlineShape


If Selection.InlineShapes.Count > 0 Then
Set rng = Selection.Range
Else
Set rng = ActiveDocument.Range
End If

For Each ils In rng.InlineShapes
With ils
If PointsToCentimeters(.Width) > sMAX_WIDTH Then
.LockAspectRatio = True
.Height = CentimetersToPoints(sMAX_WIDTH) * .Height / .Width
.Width = CentimetersToPoints(sMAX_WIDTH)
End If
End With
Next ils
End Sub
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Andreas
2006-01-21 18:36:05 UTC
Permalink
Das funktioniet ja einwandfrei...!

Müsste was geändert werden, wenn ich das hier:

http://groups.google.de/group/microsoft.public.de.word.vba/browse_thread/thread/21c8e60275decc77/7ac83d248dabdbb4#7ac83d248dabdbb4

einbauen wollte?

Oder könnte ich das nach Abarbeiten des vorstehenden Subs einfach
drüberlaufen lassen?

'Ich weiß, den Link hier so einzustellen ist Unfug. Ich arbeite daran,
eine Möglichkeit zu 'finden, die Links zu kürzen...


Vielen Dank, Grüße, Andreas
Thomas Gahler
2006-01-21 19:14:20 UTC
Permalink
Hallo Andreas
Müsste was geändert werden, wenn ich das hier: [...]
Ein bisschen ein langer Thread ;-) Vorallen sehe ich darin auf den ersten
Blick keine InlineShapes.

Poste doch mal deinen ganzen aktuellen Code aus dem besagten Thread hier hin
und dann schaue ich weiter. Wenn Christian schönprogrammiert hat, dann mauss
man nur zwei drei Zeilen an der richtigen Stelle einfüge und schon ist alles
palletti...
Oder könnte ich das nach Abarbeiten des vorstehenden Subs einfach
drüberlaufen lassen?
Das geht sicher auch
'Ich weiß, den Link hier so einzustellen ist Unfug. Ich arbeite daran,
eine Möglichkeit zu 'finden, die Links zu kürzen...
Kein Probelm wie khängen die auch öfters so rein.
Ansonsten gibt es noch www.tinyurl.com
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Andreas
2006-01-21 21:09:04 UTC
Permalink
Also, von der Funktion her hat er noch viel mehr als nur fein
programmiert...!

Hier mal der gesamte (Original)Code von Christian:


Option Explicit

' FileOpen Commondialog
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Public Const OFN_ALLOWMULTISELECT As Long = &H200
Public Const OFN_CREATEPROMPT As Long = &H2000
Public Const OFN_ENABLEHOOK As Long = &H20
Public Const OFN_ENABLETEMPLATE As Long = &H40
Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Public Const OFN_EXPLORER As Long = &H80000
Public Const OFN_EXTENSIONDIFFERENT As Long = &H400
Public Const OFN_FILEMUSTEXIST As Long = &H1000
Public Const OFN_HIDEREADONLY As Long = &H4
Public Const OFN_LONGNAMES As Long = &H200000
Public Const OFN_NOCHANGEDIR As Long = &H8
Public Const OFN_NODEREFERENCELINKS As Long = &H100000
Public Const OFN_NOLONGNAMES As Long = &H40000
Public Const OFN_NONETWORKBUTTON As Long = &H20000
Public Const OFN_NOREADONLYRETURN As Long = &H8000&
Public Const OFN_NOTESTFILECREATE As Long = &H10000
Public Const OFN_NOVALIDATE As Long = &H100
Public Const OFN_OVERWRITEPROMPT As Long = &H2
Public Const OFN_PATHMUSTEXIST As Long = &H800
Public Const OFN_READONLY As Long = &H1
Public Const OFN_SHAREAWARE As Long = &H4000
Public Const OFN_SHAREFALLTHROUGH As Long = 2
Public Const OFN_SHAREWARN As Long = 0
Public Const OFN_SHARENOWARN As Long = 1
Public Const OFN_SHOWHELP As Long = &H10

Dim OFName As OPENFILENAME
Function StripTerminator(sInput As String) As String
Dim ZeroPos As Long
ZeroPos = InStr(1, sInput, vbNullChar)
If ZeroPos > 0 Then
StripTerminator = Left$(sInput, ZeroPos - 1)
Else
StripTerminator = sInput
End If
End Function
Function ShowOpen(c_TemplatePfad As String, Optional sTitel As String)
As String
'Set the structure size
OFName.lStructSize = Len(OFName)
'Set the owner window
OFName.hwndOwner = &O0
'Set the filter
OFName.lpstrFilter = "Grafikformate (*.jpg,*.gif;*.png)" & _
vbNullChar & "*.jpg;*.gif;*.png" & vbNullChar
'Create a buffer
OFName.lpstrFile = String(1023, vbNullChar)
'Set the maximum number of chars
OFName.nMaxFile = 255
'Create a buffer
OFName.lpstrFileTitle = String(254, vbNullChar)
'Set the maximum number of chars
OFName.nMaxFileTitle = 255
'Set the initial directory
OFName.lpstrInitialDir = c_TemplatePfad
'Set the dialog title
OFName.lpstrTitle = sTitel
'no extra flags
OFName.flags = OFN_FILEMUSTEXIST Or OFN_LONGNAMES Or _
OFN_ALLOWMULTISELECT

'Show the 'Open File'-dialog
If GetOpenFileName(OFName) Then
ShowOpen = Trim$(OFName.lpstrFile)
Else
ShowOpen = ""
End If
ShowOpen = StripTerminator(ShowOpen)
End Function
Sub test()
Dim strFiles() As String
Dim i As Integer
Dim strMSG As String
Dim oDoc As Document
Dim shp As Shape
'Pfad bitte anpassen!
strFiles() = Split(ShowOpen("C:\NGTest", "Grafiken auswählen"), " ")
If UBound(strFiles()) = -1 Then Exit Sub
Set oDoc = Documents.Add
If LBound(strFiles()) = UBound(strFiles()) Then
Set shp = oDoc.Shapes.AddPicture(strFiles(0), _
True, False, 200, 200, , , Selection.Range)
ShapePosition shp, oDoc
strMSG = strMSG & strFiles(i) & vbCrLf
Else
For i = LBound(strFiles()) + 1 To UBound(strFiles())
strMSG = strMSG & strFiles(i) & vbCrLf
Set shp = oDoc.Shapes.AddPicture(strFiles(0) & strFiles(i), _
True, False, 200, 200, , , Selection.Range)
If i = UBound(strFiles()) Then
ShapePosition shp, oDoc, False
Else
ShapePosition shp, oDoc
End If
Next i
End If

MsgBox strMSG
Application.Options.ShowControlCharacters = True
End Sub
Function ShapePosition(shp As Shape, oDoc As Document, _
Optional bBreak As Boolean = True)
With shp
.WrapFormat.AllowOverlap = True
If .ZOrderPosition > 0 Then shp.ZOrder msoSendBehindText
.WrapFormat.Type = wdWrapNone
.WrapFormat.Side = wdWrapBoth
.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
.RelativeVerticalPosition = wdRelativeVerticalPositionPage
.Left = (ActiveDocument.PageSetup.PageWidth - .Width) / 2
.Top = (ActiveDocument.PageSetup.PageHeight - .Height) / 2
.Anchor.InsertAfter vbCrLf
End With
Selection.Move wdStory, 1
If bBreak = True Then
Selection.InsertBreak wdPageBreak
End If
Selection.Collapse wdCollapseEnd
Selection.Select
End Function


Hilft das weiter?

Vielen Dank!
Grüße und einen schönen Abend!

Andreas


PS: Möööönsch, habt Ihr aber ein dickes Buch geschrieben...! ;-))
Und auf den ersten Blick scheint das auch gar nicht so schlecht zu
sein...!
Thomas Gahler
2006-01-22 20:22:44 UTC
Permalink
Hallo Andreas
Post by Andreas
Hilft das weiter?
Ja sicher so geht es am Schnellsten :-)


Habe nur diese Funktion ergänzt, einfach am Stück auswechslen


Function ShapePosition(shp As Shape, oDoc As Document, _
Optional bBreak As Boolean = True)

Const sMAX_WIDTH As Single = 5.5 'cm

With shp
.WrapFormat.AllowOverlap = True
If .ZOrderPosition > 0 Then shp.ZOrder msoSendBehindText
.WrapFormat.Type = wdWrapNone
.WrapFormat.Side = wdWrapBoth
.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
.RelativeVerticalPosition = wdRelativeVerticalPositionPage

If PointsToCentimeters(.Width) > sMAX_WIDTH Then
.Height = CentimetersToPoints(sMAX_WIDTH) * .Height / .Width
.Width = CentimetersToPoints(sMAX_WIDTH)
End If

.Left = (ActiveDocument.PageSetup.PageWidth - .Width) / 2
.Top = (ActiveDocument.PageSetup.PageHeight - .Height) / 2
.Anchor.InsertAfter vbCrLf
End With
Selection.Move wdStory, 1
If bBreak = True Then
Selection.InsertBreak wdPageBreak
End If
Selection.Collapse wdCollapseEnd
Selection.Select
End Function
Post by Andreas
PS: Möööönsch, habt Ihr aber ein dickes Buch geschrieben...! ;-))
Und auf den ersten Blick scheint das auch gar nicht so schlecht zu
sein...!
Na hoffentlich hälte es auch einem zweiten Blick stand ;-)
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Christian Freßdorf
2006-01-23 06:56:56 UTC
Permalink
Hallo Andreas,
Post by Andreas
'Ich weiß, den Link hier so einzustellen ist Unfug. Ich arbeite daran,
eine Möglichkeit zu 'finden, die Links zu kürzen...
Du könnstest die Message-ID einfügen:
Message-ID: <***@z14g2000cwz.googlegroups.com>

gescheite Newsreader kommen damit zurecht ;-)
--
Gruß Christian
Rene
2006-02-21 09:38:22 UTC
Permalink
Hallo zusammen,

zuerst einmal danke für die schöne Vorarbeit! Ist echt grossartig!

Leider bin ich aber noch nicht so weit mit VBA, dass ich jetzt diesen
Code an meine Bedürfnisse anpassen kann (arbeite mit Word2000 auf XP):

Ich würde die Bilder gerne beim Aufstarten eines .dot in eine
vorgegebene Tabelle einfügen (4 Bilder pro Seite = Fotoprotokoll)
wobei die Bildbreite der Feldbreite in der Tabelle entsprechen soll.

Vielen Dank und Gruss,
Rene
Thomas Gahler
2006-02-22 07:09:16 UTC
Permalink
Hallo Rene
Post by Rene
Ich würde die Bilder gerne beim Aufstarten eines .dot in eine
vorgegebene Tabelle einfügen (4 Bilder pro Seite = Fotoprotokoll)
wobei die Bildbreite der Feldbreite in der Tabelle entsprechen soll.
Und von wo kommen die Bilder?
Alle im gleichen Verzeichnis?
Alle die gleiche Erweiterung?


--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP1), Office XP (SP3)
Rene
2006-02-22 07:44:49 UTC
Permalink
Guten Morgen Thomas,
Post by Thomas Gahler
Post by Rene
Ich würde die Bilder gerne beim Aufstarten eines .dot in eine
vorgegebene Tabelle einfügen (4 Bilder pro Seite = Fotoprotokoll)
wobei die Bildbreite der Feldbreite in der Tabelle entsprechen soll.
Und von wo kommen die Bilder?
Alle im gleichen Verzeichnis?
Alle die gleiche Erweiterung?
Die Bilder werden jeweils in einem eigenen Folder abgelegt. - Deshalb
ist die oben stehende Routine so praktisch (Wahl des Verzeichnisses)

Bei der Nomenklatur ist es so, dass im Prinzip der Aufbau so ist:
<Bezeichnung des Anlasses> YYY.jpg wobei YYY für fortlaufende Ziffern
steht. Für die Änderung der Reihenfolge liesse sich das ganze auch
umstellen: YYY <Bezeichnung>.jpg

Im Prinzip würde es mir reichen, wenn ich die Bilder mit dem obigen
Skript auswählen kann und diese dann in einer Tabelle anordnen kann.

Vielleicht noch ganz kurz zum .dot-Aufbau:
1.Seite = Frontseite mit Formular-Textfeldern
2.-n. Seite = Fotoprotokoll mit Tabelle (4 Bilder pro Seite mit Rahmen
um die ganze Gruppe; Bilder berühren sich nicht)

Die Tabelle ist im Moment wie folgt gestaltet: 5 Zeilen; 3 Spalten um
so die Grösse der Bilder zu fixieren; Rahmen um Tabelle einer Seite
=> Das liesse sich aber mit MaxWidth wesentlich eleganter lösen ;-)

Hoffe damit genügend Info gegeben zu haben
Thomas Gahler
2006-02-22 08:11:25 UTC
Permalink
Hallo Rene
Post by Rene
Die Tabelle ist im Moment wie folgt gestaltet: 5 Zeilen; 3 Spalten um
so die Grösse der Bilder zu fixieren; Rahmen um Tabelle einer Seite
=> Das liesse sich aber mit MaxWidth wesentlich eleganter lösen ;-)
Uff... Schieb mir mal die .dot rüber, dann kann ich das marko gleich auf die
Datei anpassen/umschreiben.

Die grossen Buchstaben gehören nicht zur Mailadresse


Also Honorar reicht so ein nettes Kriställchen dann aus ;-)))



--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP1), Office XP (SP3)
Rene
2006-02-22 10:13:10 UTC
Permalink
Hallo Thomas

Das mit der Mailadresse hat nicht ganz geklappt (keine grossen
Buchstaben gesehen und Adresse vom Profil wird von unseren Servern
nicht akzeptiert...). Kannst mir sonst von einer nicht
spam-verdächtigen adresse ein mail schreiben...

Ist das wirklich so aufwändig? würde es nicht reichen, die Routine so
zu setzen, dass die ausgewählten bilder in einer 2x2 Tabelle pro Seite
einzufügt werden und diese Tabelle folgende Formatierung hat:
- fixe Breite und Höhe
- Cell Margin = 0.2 (top, bottom, left, right)
- Rahmen um die 4 Felder?

Würde auch die variable Anzahl Bilder entsprechend abdecken....
Und das ganze erst ab Seite 2....

Eine ähnliche Routine hast du ja schon einmal zusammengestellt:
http://tinyurl.com/feje2

Danke und Gruss,
Rene
Thomas Gahler
2006-02-22 10:26:03 UTC
Permalink
Hallo Rene
Post by Rene
Das mit der Mailadresse hat nicht ganz geklappt (keine grossen
Buchstaben gesehen und Adresse [...]
Jetzt siehst du sicher welche
Post by Rene
Ist das wirklich so aufwändig?
Weiss nicht, habe mir noch gar nciht angeschauft was Chistian so zusammen
gebastelt hat.
Post by Rene
würde es nicht reichen, die Routine so
zu setzen, dass die ausgewählten bilder in einer 2x2 Tabelle pro Seite
Eigentlich schon nur kann ich mir dein Ding noch nciht so ganz vorstellen,
deshalb die dot.
Post by Rene
http://tinyurl.com/feje2
ja an die habe ich auch gedacht, wird wohl ein zusammengeschnippsel aus
beidem werden...



--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP1), Office XP (SP3)
Rene
2006-02-22 12:08:29 UTC
Permalink
Hallo Thomas

So die Datei sollte jetzt unterwegs sein...

die letzte mail ist die wesentliche.

LG,
Rene
Rene
2006-02-23 07:13:52 UTC
Permalink
Guten Morgen Thomas

Wollte kurz nachfragen, ob die .dot angekommen ist...Bei unseren
Servern ist dies nicht ganz selbstverständlich...und das gleiche für
den Rückweg :-(

Gruss,
Rene
Thomas Gahler
2006-02-23 07:32:07 UTC
Permalink
Hallo Rene
Post by Rene
Wollte kurz nachfragen, ob die .dot angekommen ist...
Ja ja ist alles da, wird aber mind. WoEnde werden ....





--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP1), Office XP (SP3)
Thomas Gahler
2006-02-25 18:36:56 UTC
Permalink
Hallo René

Für alle die mitlesen. Hier der Code. (die überarbeitete .dot habe ich dir
direkt zugemailt)



'----------
Option Explicit

' FileOpen Commondialog
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Public Const OFN_ALLOWMULTISELECT As Long = &H200
Public Const OFN_CREATEPROMPT As Long = &H2000
Public Const OFN_ENABLEHOOK As Long = &H20
Public Const OFN_ENABLETEMPLATE As Long = &H40
Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80
Public Const OFN_EXPLORER As Long = &H80000
Public Const OFN_EXTENSIONDIFFERENT As Long = &H400
Public Const OFN_FILEMUSTEXIST As Long = &H1000
Public Const OFN_HIDEREADONLY As Long = &H4
Public Const OFN_LONGNAMES As Long = &H200000
Public Const OFN_NOCHANGEDIR As Long = &H8
Public Const OFN_NODEREFERENCELINKS As Long = &H100000
Public Const OFN_NOLONGNAMES As Long = &H40000
Public Const OFN_NONETWORKBUTTON As Long = &H20000
Public Const OFN_NOREADONLYRETURN As Long = &H8000&
Public Const OFN_NOTESTFILECREATE As Long = &H10000
Public Const OFN_NOVALIDATE As Long = &H100
Public Const OFN_OVERWRITEPROMPT As Long = &H2
Public Const OFN_PATHMUSTEXIST As Long = &H800
Public Const OFN_READONLY As Long = &H1
Public Const OFN_SHAREAWARE As Long = &H4000
Public Const OFN_SHAREFALLTHROUGH As Long = 2
Public Const OFN_SHAREWARN As Long = 0
Public Const OFN_SHARENOWARN As Long = 1
Public Const OFN_SHOWHELP As Long = &H10

Dim OFName As OPENFILENAME

Private Function StripTerminator(sInput As String) As String
Dim ZeroPos As Long
ZeroPos = InStr(1, sInput, vbNullChar)
If ZeroPos > 0 Then
StripTerminator = Left$(sInput, ZeroPos - 1)
Else
StripTerminator = sInput
End If
End Function

Private Function ShowOpen(c_TemplatePfad As String, Optional sTitel As
String) As String
'Set the structure size
OFName.lStructSize = Len(OFName)
'Set the owner window
OFName.hwndOwner = &O0
'Set the filter
OFName.lpstrFilter = "Grafikformate (*.jpg,*.gif;*.png;*.bmp)" & _
vbNullChar & "*.jpg;*.gif;*.png; *.bmp" & vbNullChar
'Create a buffer
OFName.lpstrFile = String(1023, vbNullChar)
'Set the maximum number of chars
OFName.nMaxFile = 255
'Create a buffer
OFName.lpstrFileTitle = String(254, vbNullChar)
'Set the maximum number of chars
OFName.nMaxFileTitle = 255
'Set the initial directory
OFName.lpstrInitialDir = c_TemplatePfad
'Set the dialog title
OFName.lpstrTitle = sTitel
'no extra flags
OFName.flags = OFN_FILEMUSTEXIST Or OFN_LONGNAMES Or _
OFN_ALLOWMULTISELECT

'Show the 'Open File'-dialog
If GetOpenFileName(OFName) Then
ShowOpen = Trim$(OFName.lpstrFile)
Else
ShowOpen = ""
End If
ShowOpen = StripTerminator(ShowOpen)
End Function

Sub AutoNew()
Const START_PFAD As String = "F:\Temp"

Dim strFiles() As String
Dim i As Integer
Dim strMSG As String
Dim oDOC As Word.Document
Dim oTAB As Word.Table
Dim shp As Shape

strFiles() = Split(ShowOpen(START_PFAD, "Grafiken auswählen"), " ")
If UBound(strFiles()) = -1 Then
Exit Sub
End If

Set oDOC = ActiveDocument
Set oTAB = oDOC.Tables(1)

Dim iBilder As Integer
Dim iZeilen As Integer

'Anzahl gewählter Bilder feststellen
If LBound(strFiles()) = UBound(strFiles()) Then
iBilder = 1
Else
iBilder = UBound(strFiles())
End If

'Anzahl benötigter Zielen berechnen (2 Bilder pro Zeile)
iZeilen = iBilder
iZeilen = iZeilen - 1
iZeilen = iZeilen \ 2
iZeilen = iZeilen + 1

'Sicherstellen dass die Seite gefüllt wird (immer 2 Zeilen pro Seite)
If Not (iZeilen Mod 2 = 0) Then
iZeilen = iZeilen + 1
End If

'Die Tabelle um die zusätzlichen Zeilen erweitern
For iZeilen = 2 To iZeilen
oTAB.Rows.Add
Next iZeilen

'Die Bilder einfügen
System.Cursor = wdCursorWait

iZeilen = 0
If iBilder = 1 Then
oTAB.Cell(1, 1).Range.InlineShapes.AddPicture _
FileName:=strFiles(0), _
LinkToFile:=False, _
SaveWithDocument:=True
Else
For iBilder = 1 To iBilder
If Not (iBilder Mod 2 = 0) Then
iZeilen = iZeilen + 1
End If
Application.StatusBar = "Bilder einfügen... " & strFiles(0) &
strFiles(iBilder)

oTAB.Cell(iZeilen, ((iBilder - 1) Mod 2) +
1).Range.InlineShapes.AddPicture _
FileName:=strFiles(0) & strFiles(iBilder), _
LinkToFile:=False, _
SaveWithDocument:=True
Next iBilder
End If

System.Cursor = wdCursorWait
End Sub
'----------
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)

- Windows XP (SP2), Office XP (SP3)
Rene
2006-02-27 09:17:23 UTC
Permalink
Hallo Thomas

Zuerst einmal vielen Dank! Ist wirklich super gelöst!

Ich habe noch einige kleinen Ergänzungen gemacht, um meine
Bedürfnisse noch besser abzudecken:
Damit ich mind. 90 Bilder auf einmal einfügen kann habe ich in der
ShowOpen Function die Parameter etwas erweitert ;-)

*******

Private Function ShowOpen(c_TemplatePfad As String, Optional sTitel As
String) As String
'Set the structure size
OFName.lStructSize = Len(OFName)
'Set the owner window
OFName.hwndOwner = &O0
'Set the filter
OFName.lpstrFilter = "Grafikformate (*.jpg,*.gif;*.png;*.bmp)" & _
vbNullChar & "*.jpg;*.gif;*.png; *.bmp" & vbNullChar
'Create a buffer
OFName.lpstrFile = String(2047, vbNullChar)
'Set the maximum number of chars
OFName.nMaxFile = 2047
'Create a buffer
OFName.lpstrFileTitle = String(2046, vbNullChar)
'Set the maximum number of chars
OFName.nMaxFileTitle = 2047
'Set the initial directory
OFName.lpstrInitialDir = c_TemplatePfad
'Set the dialog title
OFName.lpstrTitle = sTitel
'no extra flags
OFName.flags = OFN_FILEMUSTEXIST Or OFN_LONGNAMES Or _
OFN_ALLOWMULTISELECT


'Show the 'Open File'-dialog
If GetOpenFileName(OFName) Then
ShowOpen = Trim$(OFName.lpstrFile)
Else
ShowOpen = ""
End If
ShowOpen = StripTerminator(ShowOpen)
End Function

*******

Dann habe ich auf der ersten Seite auch noch eine Tabelle eingefügt,
weil ich damit die Bildgrösse für das Titelbild ebenfalls erzwingen
kann. Demzufolge die eher kleine Anpassung:

*******

Set oDOC = ActiveDocument
Set oTAB = oDOC.Tables(2)

*******

Nun lässt sich mit dieser .dot in Sekundenschnelle ein perfektes
Photoprotokoll erstellen.

Danke vielmals!

Gruss,
Rene

Loading...