MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Word
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 12.04.2018, 14:57   #1
hubert17
Neuer Benutzer
Neuer Benutzer
Standard VBA - Namen einer Variablen übergeben

Hallo zusammen,

ich möchte gerne mit einer Function eine Textmarke übergeben. Z.B. soll der Wert der Variable "strVariable" an die Textmarke "tmVariable" ausgegeben werden.

Damit das ganze für die Function variabel bleibt, möchte ich mit den ersten zwei Zeilen der nachfolgenden Function, das aus "strVariable", "tmVariable" wird. In der ersten Zeile sollen die ersten 3 Zeichen "str" der Variablen abgeschnitten werden und in der zweiten Zeile wird "tm" davor hinzugefügt.

Der Code funktioniert leider nicht, da ja mit Aufruf der Function textMarke(strVariable) nicht der Name der Variablen übergeben wird, sondern deren Wert/Inhalt.

Code:

' Ändern des Strings der Übergabevariabe in Textmarke
' Ausgabe der Textmarke

Private Function textMarke(ByVal tMarke As String) As String
     
     strWert = Mid(tMarke, 4)
     strMarke = "tm" + strWert

     With ActiveDocument
        If .Bookmarks.Exists("strMarke") Then
            Set TMRange = .Bookmarks("strMarke").Range
            TMRange = tMarke
            .Bookmarks.Add Name:="strMarke", Range:=TMRange
        End If
    End With
End Function
Ich Suche also eine Möglichkeit, den Namen einer Variablen weiterzugeben und nicht deren Wert. Da ich bisher leider nicht fündig geworden, bitte ich Euch um Hilfe.

Gruß
hubert
hubert17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.04.2018, 09:33   #2
haklesoft
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Hubert,

tut mir Leid, so ganz habe ich Dein Ansinnen und Dein Vorgehen nicht verstanden. Die Namen von Variablen gehen eigentlich nur den Entwickler etwas an und ich kann mir nur eine einzige Notwendigkeit vorstellen, die Namen von Variablen in Dokumenten anzugeben: die Erstellung von Entwicklerhandbüchern.

Ein paar Hinweise zu Deinem Code:

benutze Option Explicit im Modulkopf
erstelle eine Sub-Routine statt einer Function, wenn Du kein Rückgabeergebnis ausgibst
übergib der Routine den Namen der Variablen statt die Variable selbst!
Stringverkettung machst Du besser mit dem kaufmännischen Und (&) statt dem Pluszeichen (+)
Wenn Du eine Bookmark per Variable ansprechen willst, darfst Du die Variable nicht in Anführungszeichen setzen
Warum weist Du einem Range einen Variableninhalt zu

__________________

Hang loose, haklesoft

Geändert von haklesoft (13.04.2018 um 09:45 Uhr).
haklesoft ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.04.2018, 10:48   #3
hubert17
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo haklesoft,

erstmal Danke, das Du Dich mit meinem Problem auseinandergesetzt hast.

Da ich noch am Anfang mit VBA stehe, kopiere ich oft Code, probiere es aus und passe es an meine Bedürfnisse an. Daher sicherlich auch die Sache mit Range.
Option Explicit im Modulkopf habe ich immer eingestellt, nur im Code nicht mitkopiert, alles andere werde ich beachten.

Du hast geschrieben "übergib der Routine den Namen der Variablen statt die Variable selbst!". So wie ich dies lese, beschreibt das genau das, was ich möchte, nur weis ich nicht wie.

Ich versuche nochmal zu erklären, was ich möchte.
Eine Variable (str.Variable) soll an eine Textmarke (tmVariable) übergeben werden. Da die Prozedur im Dokument mehrmals vorkommt, habe ich gedacht, ich schreibe eine Function(Sub-Routine) an die ich die Variable (strVariable) übergebe. Da ja die Variablen mit Aufruf der Prozedur übergeben wird, muß ja hieraus die Textmarke abgeleitet werden.
z.B. strFeld -> tmFeld
strText -> tmText

Ich kann natürlich auch den Code für eine Textmarke kopieren und je nach Anzahl einfügen und nur die Benennung der Textmarken ändern. Da ich aber dazu lernen und verstehen wollte, sollte es mit weniger Code und damit übersichtlicher sein.

Eine Frage hätte ich bezüglich der Übergabe an die Textmarke noch. Kann man den Code auch kürzer schreiben?

Gruß
hubert

Geändert von hubert17 (13.04.2018 um 10:55 Uhr).
hubert17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.04.2018, 11:27   #4
haklesoft
MOF Koryphäe
MOF Koryphäe
Standard

Wenn ich es richtig verstanden habe vielleicht nach diesem Strickmuster:
Code:

Option Explicit

Sub einAufrufer()
    Dim strVariabel As String

    strVariabel = "Variabler Inhalt"
    writeVarName2BM "strVariabel"
End Sub

Sub weitererAufrufer()
    Dim strBenannt As String

    strBenannt = "Benannter Inhalt"
    writeVarName2BM "strBenannt"
End Sub


Private Sub writeVarName2BM(strVarName As String)
    Dim strBMName As String
    Dim rngBM As Range
    
    strBMName = "tm" & Mid(strVarName, 4)
    With ActiveDocument.Bookmarks
        If .Exists(strBMName) = True Then
            Set rngBM = .item(strBMName).Range
        Else
            Set rngBM = Selection.Range
        End If
        rngBM.Text = strVarName ' oder strBMName
        .Add Name:=strBMName, Range:=rngBM
    End With
End Sub

__________________

Hang loose, haklesoft
haklesoft ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.04.2018, 15:22   #5
hubert17
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo haklesoft,

ich habe mal dein Code wie folgt übernommen:
Code:

' Ausgabe der Textmarke
' Ändern des Strings der Übergabevariabe in Textmarke
Private Sub writeVarName2BM(strVarName As String)
    Dim strBMName As String
    Dim rngBM As Range
    
    strBMName = "tm" & Mid(strVarName, 4)
     
     With ActiveDocument.Bookmarks
          If .Exists(strBMName) = True Then
               Set rngBM = .Item(strBMName).Range
          Else
               Set rngBM = Selection.Range
           End If
          rngBM.Text = strVarName ' oder strBMName
          .Add Name:=strBMName, Range:=rngBM
    End With
     
End Sub

Sub TestSub()
    
    Dim strTestVariable As String
    
    strTestVariable = "strTextTextText"
    writeVarName2BM "strTestVariable"
    
    'Wert an Textmarke übergeben
    writeVarName2BM (strTestVariable)
    
End Sub
An der Stelle wo die Textmarke ist, wird "strTestVariable" ausgegebent und an der aktuellen Cursorposition "strTextTextText". Werde weiter testen.

Kannst Du mir bitte den Ausdruck - writeVarName2BM "strTestVariable" - erklären, bei Variablen z.B. ist dazwischen ein "="-Zeichen. Wie sieht es hier aus?
hubert17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.04.2018, 15:43   #6
haklesoft
MOF Koryphäe
MOF Koryphäe
Standard

Zitat: von hubert17 Beitrag anzeigen

Kannst Du mir bitte den Ausdruck - writeVarName2BM "strTestVariable" - erklären, bei Variablen z.B. ist dazwischen ein "="-Zeichen. Wie sieht es hier aus?

Das ist kein Ausdruck sondern der Sub-Aufruf mit Parameter. Dabei schenke ich mir das - hier nicht erforderliche - Call.
Code:

Sub TestSub()
    
    Dim strTestVariable As String
    
    strTestVariable = "strTextTextText"
    
    ' Variablenname an Textmarke übergeben
    writeVarName2BM "strTestVariable"
    ' oder in Langform (mit Einklammerung)
    ' Call writeVarName2BM("strTestVariable")
    
    
    'Wert an Textmarke übergeben (ohne Einklammerung)
    writeVarName2BM strTestVariable
    ' oder in Langform (mit Einklammerung)
    ' Call writeVarName2BM(strTestVariable)
End Sub

__________________

Hang loose, haklesoft
haklesoft ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.04.2018, 15:49   #7
hubert17
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

OK und Danke, kannte das bisher nur mit den Klammern.
hubert17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.04.2018, 15:58   #8
EarlFred
MOF Guru
MOF Guru
Standard

Hallo hubert,

meinst Du so in der Art?

Code:

Option Explicit

Sub start()
If textMarke("Das ist der Inhalt", "Textmarke100") Then MsgBox "Textmarke wurde erfolgreich befüllt!"
If textMarke("Das ist ein anderer Inhalt", "Textmarke5") Then MsgBox "Textmarke wurde erfolgreich befüllt!"
End Sub


Private Function textMarke(ByVal strInhaltDerTextmarke As String, ByVal strNameDerTextmarke As String) As Boolean

Dim rngTemp As Range

  With ActiveDocument
    If .Bookmarks.Exists(strNameDerTextmarke) Then
      Set rngTemp = .Bookmarks(strNameDerTextmarke).Range
      rngTemp.Text = strInhaltDerTextmarke
      .Bookmarks.Add Name:=strNameDerTextmarke, Range:=rngTemp
      textMarke = Err = 0
    End If
  End With
End Function

Die Sub oder Function, an die Du die Variable übergibst, kennt nicht den NAMEN der Variablen, den sie in der aufrufenden Prozedur hat, sondern nur den Inhalt (es sei denn, du übergibst auch den Namen der Variablen...).

Grüße
EarlFred

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 5 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,037% per 04.04.2018) - eine tolle Geste!

Geändert von EarlFred (16.04.2018 um 16:03 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.04.2018, 08:37   #9
hubert17
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Danke (nochmal) an Euch beide. Habe jetzt aus beiden Hilfestellungen meine Lösung gefunden. Der Name der Textmarke wird als zweites Argument als String übergeben.

Code:

' Ausgabe der Textmarke

Private Sub writeVarName2BM(strVariable As String, textMarke As String)
     
     Dim TMRange As Range
     
     With ActiveDocument
          If .Bookmarks.Exists(textMarke) Then
               Set TMRange = .Bookmarks(textMarke).Range
               TMRange = strVariable
               .Bookmarks.Add Name:=textMarke, Range:=TMRange
          End If
     End With

Sub TestSub()
    
    Dim strTestVariable As String
    
    strTestVariable = "strTextTextText"
    writeVarName2BM strTestVariable, "tmVariable"
       
End Sub
hubert
hubert17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.