Problem bei Übergabe von Werten

Liebe/-r Experte/-in,

Ich habe folgende Procedur mit der ich Inhalte in Textmarken innerhalbe eines Word-Dokumentes schreibe.

Sub TextmarkenEinsetzen(ByVal Textmarke As String, ByVal Wert As String)

On Error GoTo Fehler
Dim r As Range

'Schreibt einen neuen Wert in ein vorhandenes Bookmark
If ActiveDocument.Bookmarks.Exists(Textmarke) Then
Set r = ActiveDocument.Bookmarks(Textmarke).Range
r.Text = Wert
ActiveDocument.Bookmarks.Add Textmarke, r
End If

End Sub

Jetzt habe ich den gleichen Namen in einem Modul für Variablen vergeben, wie die Textmarken in meinem Dokument heißen.

Wenn ich jedoch versuche mit u.g. Code den Inhalt meiner Variablen in die Textmarken zu schreiben, bekomme ich nur den Textmarkenname statt den Wert geschrieben.

Beispiel

Var = „Hallo Welt!“

Ist:
Es wird Var ausgegeben

Es soll:
Hallo Welt! ausgegeben werden!

For i = 1 To ActiveDocument.Bookmarks.Count
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, ActiveDocument.Bookmarks(i).Name)
Next i

Vielen Dank im Voraus!

Hallo!

Wo und wann wird denn „Var“ übergeben? Das geht aus den Codeschnipseln nicht hervor.

In der Zeile
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, ActiveDocument.Bookmarks(i).Name)
wird ja die Bezeichnung des Bookmarks als „Wert“ an die Prozedur übergeben und dort in der Zeile
r.Text = Wert
als Text an die jeweilige Position geschrieben, was eben zu dem genannten Verhalten führt.

Ich bin mir nicht sicher, ob ich genau verstehe, was gewünscht ist, aber die Variable müsste hier
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, Var)
an die Prozedur übergeben werden, dann sollte das auch funktionieren.

Sollte ich was falsch verstanden haben, bitte noch mal melden…

Schöne Grüße!

Florian

Hallo Florian,

vielen dank für deine schnelle Reaktion. Das mit Var war nur eine Beispiel. Die Prozedur „TextmarkenEinsetzen(Name_Textmarke, ZuSchreibender_Wert)“ fügt an der Textmarke den Wert ein. Da ich viele Textmarken habe und Variablen, hatte ich gehofft nicht für jede Textmarke die Procedure aufzurufen sondern in eine Schleife zu packen. da ich die variablen wie die textmarken benannt habe dachte ich es geht mit

For i = 1 To ActiveDocument.Bookmarks.Count
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, ActiveDocument.Bookmarks(i).Name)
Next i

Dabei wird das ganze Dokument nach Textmarken durchsucht. Da der Textmarkenname gleich dem variablenname ist also Name_Textmarke = ZuSchreibender_Wert im Beispiel „TextmarkenEinsetzen(Name_Textmarke, ZuSchreibender_Wert)“ sollte es eigentlich gehen. Es passiert aber so

TextmarkenEinsetzen(Name_Textmarke, „ZuSchreibender_Wert“)

d.h. statt de Inhalt der Variable ZuSchreibender_Wert wird der Text „ZuSchreibender_Wert“ geschrieben.

Viele Grüße Markus

Seruvs,

ich benutze folgen „Function“

Public Function AddShapeTextbox(ByVal Doc As Word.Document, _
ByVal xLeft As Double, ByVal xTop As Double, _
ByVal XWidth As Double, ByVal Xheigt As Double, ByVal Xrange As Word.Range) As Word.Shape

If Val(Left(Doc.Application.Version, 2))

Lieber Markus

leider bin ich nur VBA Experte für Access, es könnte aber sein dass die übergebene Variable „Wert“ nicht funktioniert da dies ein ein sogenannt „reserviertes“ Wort ist.

Gruss

Werner

Hallo!

Jetzt kapiere ich, was Du meinst…
Leider gibt es tatsächlich keine Möglichkeit, über einen String, der dem Variablennamen entspricht, auf den Inhalt dieser Variablen zuzugreifen (zumindest war das der Tenor aller Quellen, die ich ergoogeln konnte).
Als Workaround fällt mir momentan nur der Umweg über zwei Arrays ein, eines mit den Namen aller Variablen/Textmarken und ein zweites mit dem Inhalt derselben.
Dazu müssen im Grunde nur die Variablennamen bekannt sein.

Ich weiß nicht, ob Dir das wirklich hilft, aber mein Vorschlag wäre in etwa so:

Sub test()

Dim namen As Variant, werte As Variant 'beide Arrays als Variant deklarieren

Dim marke1, marke2, marke3, marke4 As String 'die einzelnen Bookmarks/Variablen deklarieren (falls gewünscht)

namen = Array(„marke1“, „marke2“, „marke3“, „marke4“) 'erstes Array: hier stehen nacheinander die Bookmark/-Variablennamen drinnen

‚‘’’ hier werden die Variablen definiert
marke1 = „Katze“
marke2 = „Schweissausbruch“
marke3 = „Brokkoli“
marke4 = „Herzilein“
‚‘’’ Ende

werte = Array(marke1, marke2, marke3, marke4) 'Zweites Array, UNMITTELBAR VOR DER SCHLEIFE! Die Werte der gleichnamigen Variablen/Bookmarks werden eingelesen. In diesem Array unbedingt die gleiche Reihenfolge wie im ersten verwenden!

For i = 0 To ActiveDocument.Bookmarks.Count - 1
Call TextmarkenEinsetzen(namen(i), werte(i))
Next i
End Sub

Viel Erfolg!

Florian

Hallo Herr Körner,

um den Inhalt einer Textmarke auslesen zu können, muss anstelle det Eigenschaft „Name“ die Eigenschaft „Range.Text“ ausgelesen werden.
Bsp. :

Debug.Print ActiveDocuments.Bookmarks(i).range.Text

Viele Grüße,
BigBen

Zunächst einmal sieht das so ganz sauber aus. Allerdings verstehe ich nicht so ganz wo dein problem besteht, da du in deiner Sub TxtmarkenEinsetzen die beiden geforderten Parameter mit der selben Variable (den Namen der Textmarke) füllst. Laut deiner Sub musst du also als ersten Parameter den Namen deiner Textmarke und als zweiten Parameter den Wert angeben, der in die Textmarke geschrieben werden soll. In deinem Beispiel ist das allerdings auch der Name der Textmarke.
Also:
Var = „Hallo Welt!“

For i = 1 To ActiveDocument.Bookmarks.Count
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, Var)
Next i

würde in jede Textmarke den Wert „Hallo Welt“ einsetzen.
Aber vielleicht habe ich dich ja einfach nicht richtig verstanden.
mfg Ulli

Puuuuh, mit Word und VBA habe ich seit Jahren nicht mehr gearbeitet. Ich vermute dass der Prozedur ein falscher Parameter übergeben wird: ActiveDocument.Bookmarks(i).Name ist doch der Name der Bookmark und nicht der Inhalt, oder?
Aber wie gesagt, Word ist lange , lange her.
Viel Erfolg
Rainer

Hallo Markus

Mit

Sub TextmarkenEinsetzen(ByVal Textmarke As String, ByVal Wert
As String)

Und

For i = 1 To ActiveDocument.Bookmarks.Count
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name,
ActiveDocument.Bookmarks(i).Name)
Next i

setzt Du in jeder Textmarke im Word die Namen der Textmarke ein.

Bei Dir muss irgenwo so etwas wie
var = „Hello World“
i= ‚Index einer Textmarke‘
call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, var)

stehen.
Du musst die Variable auch irgendwo richtig übergeben.
Mehr kann ich Dir mit dem spärlichen Ausschnitt nicht helfen.

Gruß
Vincenz

Liebe/-r Experte/-in,

Ich habe folgende Procedur mit der ich Inhalte in Textmarken
innerhalbe eines Word-Dokumentes schreibe.

Sub TextmarkenEinsetzen(ByVal Textmarke As String, ByVal Wert
As String)

On Error GoTo Fehler
Dim r As Range

'Schreibt einen neuen Wert in ein vorhandenes Bookmark
If ActiveDocument.Bookmarks.Exists(Textmarke) Then
Set r = ActiveDocument.Bookmarks(Textmarke).Range
r.Text = Wert
ActiveDocument.Bookmarks.Add Textmarke, r
End If

End Sub

– hast du ein Beispiel wo dein Sub funktioniert wie gewollt?
– mir ist nicht klar was du meinst mit „Modul für Variablen“

Jetzt habe ich den gleichen Namen in einem Modul für Variablen
vergeben, wie die Textmarken in meinem Dokument heißen.

– ich kann mir aber vorstellen, dass „ByVal Textmarke As String“ besser „ByVal Textmarke As Textmark“ (oder wie auch immer die Klasse heisst, weiss ich nicht aus dem Kopf) waere!

Wenn ich jedoch versuche mit u.g. Code den Inhalt meiner
Variablen in die Textmarken zu schreiben, bekomme ich nur den
Textmarkenname statt den Wert geschrieben.

Beispiel

Var = „Hallo Welt!“

Ist:
Es wird Var ausgegeben

Es soll:
Hallo Welt! ausgegeben werden!

For i = 1 To ActiveDocument.Bookmarks.Count
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name,
ActiveDocument.Bookmarks(i).Name)
Next i

Vielen Dank im Voraus!

Hallo,

soweit ich es nachvollziehen konnte, iterierst du über alle Bookmarks in deinem Dokument. Dabei rufst du deine Funktion „TextmarkenEinsetzen“ auf. Dabei haben beide Argumente – „Textmarke“ und „Wert“ – den gleichen Wert zugewiesen bekommen, nämlich „ActiveDocument.Bookmarks(i).Name“

Sprich, Textmarkenname und Wert sind laut Deinem Code bei Funktionsaufruf identisch. Wenn Sie verschieden sein sollen, muss Dein Funktionsaufruf am Ende anders lauten. Z.B. wie folgt:

Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, „Hier steht mein eigenlicher Wert“)

MfG xtc99

Hallo Markus,

sei mir jetzt nicht böse, aber ich musste wirklich etwas schmunzeln *G* … vom Ansatz her hast Du ja alles richtig gemacht und auch richtig verstanden…
Du hast allerdings einen kleinen Logikfehler in Deinem Aufruf: Wenn Du Äpfel übergibst, kommen auch Äpfel an!
Dein Aufruf lautet :
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, ActiveDocument.Bookmarks(i).Name)
also übergibst Du zweimal den Namen der Textmarke… Änder das mal in :
Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, Var)
dann übergibst Du den Namen der Textmarke und den Wert, der geschrieben werden soll.
Wenn der hie abgebildete Code vollständig ist, solltest Du den ERROR-Block in Deiner Funktion noch definieren… Ich habe mal ein Muster angehängt *G*

Ich hoffe, das es Dir weiterhilft und wünsche Dir noch ein schönes Wochenende,
Burkhard

Muster:

Sub TextmarkenEinsetzen(ByVal Textmarke As String, ByVal Wert As String)
 Dim r As Range
 Dim a As Integer

 'Fehlerbehandlung
 On Error GoTo Fehler

 'Austauschschleife
 If ActiveDocument.Bookmarks.Exists(Textmarke) Then
 Set r = ActiveDocument.Bookmarks(Textmarke).Range
 r.Text = Wert
 ActiveDocument.Bookmarks.Add Textmarke, r
 End If
 ' Ende weil fehlerfrei ausgeführt
 Exit Sub

Fehler:
 ' Hochintelligente Fehlerbehandlung
 On Error Resume Next
 a = MsgBox("Da läuft was schief", vbCritical, "Blöd gelaufen")
End Sub


Sub testlauf()
 Dim var As String

 var = "Hallo Welt!"

 ' Austauschleife für alle Textmarken
 For i = 1 To ActiveDocument.Bookmarks.Count
 Call TextmarkenEinsetzen(ActiveDocument.Bookmarks(i).Name, var)
 Next i
 ' Happyend
End Sub

SetzeMarke()
call textmarkenEinsetzen(TextMarke1,„Moin“)
end sub

Sub TextmarkenEinsetzen(ByVal Textmarke As String, ByVal Wert As String)

On Error GoTo Fehler
Dim r As Range

If ActiveDocument.Bookmarks.Exists(Textmarke) Then
Set r = ActiveDocument.Bookmarks(Textmarke).Range
r.Text = Wert
ActiveDocument.Bookmarks.Add Textmarke, r
End If

exit sub
Fehler:
msgbox „Es ist ein fehler aufgetreten“ & vbcrlf & err.description,vbCritical,„Fehler“
End Sub

TextmarkenEinsetzen wird sowohl mit dem Namen als auch im Wert mit ActiveBookmarks(i).Name aufgerufen, d.h. Name und Wert sind immer identisch.

Ansonsten verstehe ich das mit dem Var nicht ganz:
Mit welchen Namen sind Variablen benannt? Und wo werden die aufgerufen/verwendet?
Wie sieht der Aufruf für Var aus in dem Beispiel? Es wird nur das Ergebnis dargestellt - die Ausgabe sehe ich nirgends…

Hallo Florian,

sorry hatte am Freitag deiner Mail geantwortet. Naja wer lesen kann ist klar im Vorteil :wink:

Dein Tipp mit dem Array war es! Irgendwie hatte ich den Gedanken auch scjon Mal vorher aber hatte ihn nicht zu Ende gedacht.

Für ähnlich leidende will ich jetzt meine Lösung präsentieren.

Statt der vielen variablen, die mit den Textnamen im Namen übereinstimmden, gibt es jetzt ein dynamisches Array.

Dim Textmarkenbefüllung() As String
ReDim Textmarkenbefüllung(1 To 42, 1 To 42)

Textmarkenbefüllung(1, 1) = „Bez_Referenzen“: Textmarkenbefüllung(1, 2) = „Ihre Referenzen“

For i = 1 To UBound(Textmarkenbefüllung, 1)
'MsgBox "Textmarkenbefüllung(i, 1) " & i & ": " & Textmarkenbefüllung(i, 1) & vbCrLf & "Textmarkenbefüllung(i, 2) " & i & ": " & Textmarkenbefüllung(i, 2)
Call TextmarkenEinsetzen(Textmarkenbefüllung(i, 1), Textmarkenbefüllung(i, 2))
Next i

End Sub

Sub TextmarkenEinsetzen(ByVal Textmarke As String, ByVal Wert As String)

On Error GoTo Fehler
Dim i As Byte
Dim r As Range

Wert = Trim(Wert)

'Schreibt einen neuen Wert in ein vorhandenes Bookmark
If ActiveDocument.Bookmarks.Exists(Textmarke) Then
Set r = ActiveDocument.Bookmarks(Textmarke).Range
r.Text = Wert
ActiveDocument.Bookmarks.Add Textmarke, r
End If

End Sub

Vielen Danbk auch allen anderen!

VG Markus

Hallo Manfred,

vielen Dank für Deine Hilfe. Florian brachte mich auf die Idee es mit einem Array zu machen. Habe dort auch meine Lösung gepostet.

Vielen Dank und viele Grüße Markus

Hallo Werner,

vielen Dank für Deine Hilfe. Florian brachte mich auf die Idee es mit einem Array zu machen. Habe dort auch meine Lösung gepostet.

Vielen Dank und viele Grüße Markus

Hallo Ulli,

vielen Dank für Deine Hilfe. Florian brachte mich auf die Idee es mit einem Array zu machen. Habe dort auch meine Lösung gepostet.

Vielen Dank und viele Grüße Markus

Hallo Rainer,

vielen Dank für Deine Hilfe. Florian brachte mich auf die Idee es mit einem Array zu machen. Habe dort auch meine Lösung gepostet.

Vielen Dank und viele Grüße Markus