Ich habe ein Problem mit welchem man mir in microsoft.public.de.word nicht
weiterhelfen konnte. Das Problem ist folgendes:
Ich würde gerne per
{INCLUDEPICTURE "C:\\Bilder\\{ MERGEFIELD Username }\\*.jpg"}
alle Bilder eines Ordners in einen Serienbrief einfügen. Leider muss bei
INCLUDEPICTURE aber explizit der Dateiname angegeben werden, es funktioniert
also nicht wie beabsichtigt.
Nun gab man mir in der oben genannten Newsgroup den Tipp, doch mal wieder
bei Euch nachzuhaken. Das Einfügen der Bilder kann (oder muss sogar?) erst
beim Druck erfolgen. Wie man sieht, ist der Ordnername vom verwendeten
Datensatz abhängig (MERGEFIELD Username). Ist der Ordner leer (bzw.
existiert nicht), dann soll nichts eingefügt werden.
Nun meine Frage: Ist das möglich? Wenn ja: *hust* wie denn? Ich bin kein
Wahnsinns-VBA-Experte und bei so etwas leider hoffnungslos überfragt...
Sich über jegliche Vorschläge freuend,
Aleks.
> alle Bilder eines Ordners in einen Serienbrief einfügen.
Die einzige Lösungsmöglichkeit die ich für dich sehe ist folgende
- Datenquelle zum Serienbreif als Wordtabelle anlegen
- eine Spalte enthält dein Username
- in eine zweite Spalte werden die betreffenden Bilder eingefügt (alle
Bilder pro Username in eine Zelle)
- Jetzt kannst du einen Serienbrief anlegen und ausführen. Die Position der
Bilder kann aber nicht frei definiert werden, die kommen so rein wie diese
im der Datenquelle drinn liegen.
Aber ich bin mir auch nicht so ganz sicher, ob ein Serienbrief für die
überhauot der richtige Lösungsansatz ist. Was willst du denn genau erreichen
bzw. was ist deine Aufgabenstellung. Vielleicht gibt es da ja noch bessere
Ansätze.
--
Thomas Gahler
MVP für WordVBA
- Windows XP (SP1), Office XP (SP3)
> - Datenquelle zum Serienbreif als Wordtabelle anlegen
Wir haben eine Exceltabelle, das dürfte aber keinen großen Unterschied
machen?
> - eine Spalte enthält dein Username
Ist bereits so
> - in eine zweite Spalte werden die betreffenden Bilder eingefügt (alle
> Bilder pro Username in eine Zelle)
Bilder, oder Bildernamen? Kann man Bilder direkt in Excelzellen einfügen?
Bis jetzt steht da nämlich der Name des Bildes drin, ist aber eben nur _ein_
Bild. Trotzdem möchte ich es tunlichst vermeiden, jedes Bild dort namentlich
aufführen zu müssen
> Aber ich bin mir auch nicht so ganz sicher, ob ein Serienbrief für die
> überhauot der richtige Lösungsansatz ist. Was willst du denn genau
erreichen
> bzw. was ist deine Aufgabenstellung. Vielleicht gibt es da ja noch bessere
> Ansätze.
Tja, ganz sicher bin ich mir da auch nicht. Es wurde mir aber von der Firma
so nahegelegt. Es sollen Briefe an Kunden versendet werden. In einem
Unterordner "Bilder" des Kunden (sagen wir mal
"C:\Kunden\Beispielkunde\Bilder\") sollen etwaige Screenshots abgespeichert
werden. Diese Screenshots haben aber immer unterschiedliche Namen, da der
Name den Inhalt beschreibt. Diese dann einzeln in die Exceltabelle
einzutragen wäre für die betreffende Person nicht wirklich günstig, da es
doch einige Kunden sind und es immer zwischen 0 und ca. 5 (manchmal aber
auch mehr) Screenshots gibt.
Gibt da noch irgendwelche Möglichkeiten?
Grüße,
Aleks.
> > - Datenquelle zum Serienbreif als Wordtabelle anlegen
> Wir haben eine Exceltabelle, das dürfte aber keinen großen Unterschied
> machen?
Doch, denn in Excel kannst du eine Grafik nur als Shape (weisse Ankerpunkte)
einfügen, was wir für den Serienbrief aber benötigen ist ein InlineShape
(schwarze Ankerpunkte).
> > - in eine zweite Spalte werden die betreffenden Bilder eingefügt (alle
> > Bilder pro Username in eine Zelle)
> Bilder, oder Bildernamen?
Bilder als InlineShape
> Trotzdem möchte ich es tunlichst vermeiden, jedes Bild dort namentlich
> aufführen zu müssen
Müsste wohl automatisch generiert werden.
> > bzw. was ist deine Aufgabenstellung. Vielleicht gibt es da ja noch
bessere
> Es sollen Briefe an Kunden versendet werden. In einem
> Unterordner "Bilder" des Kunden (sagen wir mal [...]
> Gibt da noch irgendwelche Möglichkeiten?
Serienbrief wie gehabt (aber in Wordtabelle) oder zuerst die Breife erzeugen
und dann die ScreenShots einfügen. Das sehe ich als Möglichkeiten.
Beim Serienbrief wirst du wohl noch auf ein paar Problemchen stossen, die
sind zwar in der andern Variante auch vorhanden aber vielleicht einfacher zu
lösen.
- Grösse der Bilder verändert
- Position der Bilder im Text
- Geschwindigkeit
- Grösse der Datenquelle usw.
Aber bei beiden Varianten musst du dir ein Gedanken manchen, wie die
Reihenfolge der Bilder gewährleistet wird. VBA nimmt diese nächlich in der
Reihenfolge wie diesem dem Filesystem hinzugefügt wurden.
> > Wir haben eine Exceltabelle, das dürfte aber keinen großen Unterschied
> > machen?
> Doch, denn in Excel kannst du eine Grafik nur als Shape (weisse
Ankerpunkte)
> einfügen, was wir für den Serienbrief aber benötigen ist ein InlineShape
> (schwarze Ankerpunkte).
OK, damit erübrigt sich auch meine nächste Frage...
> Bilder als InlineShape
Die Frage meinte ich :D
> > Trotzdem möchte ich es tunlichst vermeiden, jedes Bild dort namentlich
> > aufführen zu müssen
> Müsste wohl automatisch generiert werden.
Ist schwierig, weil der Mitarbeiter einfach aus einem großen
"Screenshotpool" ein paar Bilder auswählt und diese in den Ordner des
jeweiligen Users verschiebt.
> > Gibt da noch irgendwelche Möglichkeiten?
> Serienbrief wie gehabt (aber in Wordtabelle) oder zuerst die Breife
erzeugen
> und dann die ScreenShots einfügen. Das sehe ich als Möglichkeiten.
Das mit der Wordtabelle ist schlecht möglich, da die Exceltabelle _sehr_
umfangreich ist und noch allerhand andere Funktionen beinhaltet. Letzteres
wäre wohl besser. Wäre es denn möglich, z.B. beim Serienbriefdruck in ein
neues Dokument "nur" einen Text à la
"<screenshotordner>C:\Kunden\Beispieluser\Bilder\</screenshotordner>"
auszugeben und dann nachträglich ein Makro darüberlaufen zu lassen, welches
stattdessen die Bilder die in diesem Ordner sind der Reihe nach einfügt?
Vielleicht sogar automatiisch?
> Beim Serienbrief wirst du wohl noch auf ein paar Problemchen stossen, die
> sind zwar in der andern Variante auch vorhanden aber vielleicht einfacher
zu
> lösen.
> - Grösse der Bilder verändert
Ich glaube, die Bilder werden doch automatisch verkleinert, damit sie von
der Breite her auf die Seite passen? Das wäre in Ordnung!
> - Position der Bilder im Text
Die Position wird dann durch den oben angegebenen Text definiert, die
Reihenfolge ist eigentlich unerheblich. Vielleicht wäre eine alphabetische
Sortierung aber sinnvoll.
> - Geschwindigkeit
Dazu kann ich noch nicht viel sagen.
> - Grösse der Datenquelle usw.
Dürfte sich bei der nun angepeilten Lösung in Grenzen halten, da die Bilder
ja im Ordner sind und die Bilder über ein extra Makro hinzugefügt werden?
> Aber bei beiden Varianten musst du dir ein Gedanken manchen, wie die
> Reihenfolge der Bilder gewährleistet wird. VBA nimmt diese nächlich in der
> Reihenfolge wie diesem dem Filesystem hinzugefügt wurden.
Das wäre, wie bereits gesagt, nicht sonderlich schlimm. Vielleicht wäre aber
ein alphabetische Sortierung nicht schlecht, aber das sollte doch möglich
sein?
Tausend Dank für Deine Unterstützung,
Aleks.
> Wäre es denn möglich, z.B. beim Serienbriefdruck in ein
> neues Dokument "nur" einen Text à la
> "<screenshotordner>C:\Kunden\Beispieluser\Bilder\</screenshotordner>"
> auszugeben [...]
Ja, kannst du sogar mit Excel «berechnen»
> und dann nachträglich ein Makro darüberlaufen zu lassen, welches
> stattdessen die Bilder die in diesem Ordner sind der Reihe nach einfügt?
Ja
> Vielleicht sogar automatiisch?
Jein.
> > - Grösse der Bilder verändert
> Ich glaube, die Bilder werden doch automatisch verkleinert, damit sie von
> der Breite her auf die Seite passen? Das wäre in Ordnung!
Und wenn sie kleiner sind ;-) oder nicht alle gleich gross?
> > Vielleicht sogar automatiisch?
> Jein.
Püdde wie? :)
> > > - Grösse der Bilder verändert
> > Ich glaube, die Bilder werden doch automatisch verkleinert, damit sie
von
> > der Breite her auf die Seite passen? Das wäre in Ordnung!
> Und wenn sie kleiner sind ;-) oder nicht alle gleich gross?
Wenn sie kleiner sind, dann soll diese kleinere Größe auch verwendet werden.
Ungefähr so wie Word das eh macht, wenn ich eine Grafik einfüge. Es
verkleinert sie - soweit ich weiß - nur dann, wenn sie nicht auf eine Seite
passt. Ansonsten wird die Größe belassen...
Ich habe gerade - unter Zuhilfenahme des Autotext-Makros bei dem Ihr mir
schon einmal unglaublich geholfen habt - ein Makro zusammengeschustert,
welches die Bilder nachträglich einfügt. Könntest Du Dir das vielleicht kurz
ansehen und mir sagen was daran schlecht ist? Bin leider wirklich nicht
sonderlich bewandert in VBA, aber auf diese Weise funktioniert es wenigstens
bereits.
Was mir daran nicht gefällt: Ich wollte die Bilder mit dem Rangeobjekt
einfügen, daher auch das "InlineShape" , allerdings habe ich das Problem,
dass - sobald das erste Bild eingefügt wird - die Tags wohl bereits
überschrieben werden und damit gibt es beim zweiten Bild eine Fehlermeldung.
Deswegen lösche ich nun den Range erst und füge dann die Bilder ein, was
komischerweise funktioniert(?).
Aaaaalso, hier der Code:
***insertImages***
Option Explicit
Const MARKER_START = "<screenshots>" 'Bezeichnet den Beginn der
Screenshots
Const MARKER_END = "</screenshots>" 'Bezeichnet das Ende der Screenshots
Const LINK_IMAGES = False 'Wenn wahr, dann werden die Bilder
nur verknüpft
Sub insertImages()
Dim oRNG As word.Range
Set oRNG = ActiveDocument.Range
With oRNG.Find
.ClearFormatting
.Replacement.ClearFormatting
.text = EscapeOffRegexChars(MARKER_START) + "*" +
EscapeOffRegexChars(MARKER_END)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
While .Execute
procInsertImages _
cFolder:=funcTagContents(oRNG.text), oRange:=oRNG
Wend
End With
End Sub
Private Function funcTagContents(ByVal cTemp As String) As String
Dim cName As String
Dim iPos As Integer
iPos = InStr(1, cTemp, MARKER_START, vbBinaryCompare)
cTemp = Mid$(cTemp, iPos + Len(MARKER_START))
iPos = InStr(1, cTemp, MARKER_END, vbBinaryCompare)
cTemp = Mid$(cTemp, 1, iPos - 1)
If Not Right(cTemp, 1) = "\" And Not cTemp = "" Then
cTemp = cTemp + "\"
End If
funcTagContents = cTemp
End Function
Private Function EscapeOffRegexChars(ByVal strString As String) As String
Dim FindTerm As Variant, FindThis As Variant
FindTerm = Array("*", "@", "\", "(", ")", "[", "]", "?", "<", ">", "!",
"{", "}")
For Each FindThis In FindTerm
Dim intPos As Integer, intLP As Integer, intLen As Integer, strTemp
As String
intLen = Len(FindThis)
intPos = InStr(strString, FindThis)
While intPos <> 0
strTemp = strTemp & Left$(strString, intPos - 1)
strTemp = strTemp & "\" & FindThis
strString = Right$(strString, Len(strString) - intPos - intLen +
1)
intPos = InStr(strString, FindThis)
Wend
Next
strTemp = strTemp & strString
EscapeOffRegexChars = strTemp
End Function
Sub procInsertImages(ByVal cFolder As String, ByVal oRange As word.Range)
Dim cFile As String
'Dim oISH As InlineShape
oRange.Delete
If Not cFolder = "" Then
cFile = Dir$(cFolder)
While Not Len(Trim$(cFile)) = 0
oRange.InlineShapes.AddPicture FileName:= _
cFolder + cFile, LinkToFile:= _
LINK_IMAGES, SaveWithDocument:=True
'oISH = ActiveDocument.InlineShapes.AddPicture(FileName:=cFolder
+ cFile, Range:=oRange)
cFile = Dir$
Wend
End If
End Sub
***insertImages***
Beste Grüße,
Aleks.