none
Zusammengesetzte String Variable über Function füllen

    Frage

  • Hallo

    ich würde gerne eine Function haben die mir eine Variable füllt

    diese Funktion möchte ich nach aktualisieren eines feldes aufrufen

    meine Variable heist immer so wie das Feld nur mit einem GB davor

    Ich weiss das das folgende nicht geht, aber es  spiegelt in etwa das was ich möchte

    "GB" & Screen.ActiveControl.Name = Screen.ActiveControl

    momentan hinterlege ich eben noch bei jedem element

    GBMeinFeld = MeinFeld

    Freitag, 6. Dezember 2013 14:00

Antworten

  • Hallo MCDPone

    Ich weiss nicht ganz, was Du machen willst.

    Du möchtest immer die gleiche Funktion aufrufen, korrekt? Aber der Name der Variable müsste dann abhängig vom Feldnamen sein.
    Wo ist denn die Variable deklariert? Ist das eine globale Variable?

    Wenn Du das in einer Funktion machen willst, dann wirst Du das auscodieren müssen:

    Public Function setMyValue(ctl as Control)
     Select Case ctl.Name
       Case "irgendwas"
         GBIrgendwas = ctl.Value
       Case "irgendwasanderes"
         GBIrgendwasanderes = ctl.Value
       ...
     End Select
    End Function

    Diese Funktion legst Du dann am besten gleich zur Deklaration der globalen Variablen, damit Du einfach neue Variablennamen eintragen kannst.
    Die Variablen musst Du ja sowieso deklarieren, da kommt es auf die zwei zusätzlichen Zeilen Code auch nicht mehr drauf an.

    Gruss
    Henry
     "MCDPone" schrieb im Newsbeitrag news:87be7cfa-db46-4ef1-9dcf-83faf92a5dca@communitybridge.codeplex.com...

    ich würde gerne eine Function haben die mir eine Variable füllt
    diese Funktion möchte ich nach aktualisieren eines feldes aufrufen
    meine Variable heist immer so wie das Feld nur mit einem GB davor
    Ich weiss das das folgende nicht geht, aber es  spiegelt in etwa das
    was ich möchte
    "GB" & Screen.ActiveControl.Name = Screen.ActiveControl
    momentan hinterlege ich eben noch bei jedem element
    GBMeinFeld = MeinFeld

    • Als Antwort markiert MCDPone Donnerstag, 12. Dezember 2013 08:31
    Dienstag, 10. Dezember 2013 09:32
  • Hallo!

    Mal ganz einfach gedacht:

    Ich gehe davon aus, dass du zum Ändern der Standardwerte ein Formular verwendest, welches an die "Standardwerte-Tabelle" gebunden ist. 
    Änderungen in den Formularfeldern gehen somit direkt in die Tabelle.

    Weiteres gehe ich davon aus, dass man die Standardwerte nicht besonders oft ändert.

    => Was wäre, wenn du einfach beim Schließen des Formulars alle Standardwerte neu einliest?
    Ob das nun 1 ms oder 10 ms dauert ist doch egal, oder? - Und eine Routine zum Einlese aller Standardwerte aus der Tabelle wirst du vermutlich bereits haben.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Als Antwort markiert MCDPone Donnerstag, 12. Dezember 2013 08:30
    Mittwoch, 11. Dezember 2013 15:59

Alle Antworten

  • Hi,

    auch wenn ich das nicht für sinnvoll halte, gäbe es in VBA Eval( ... ). Siehe dazu:

      http://office.microsoft.com/de-de/access-help/eval-funktion-auswerten-HA001228942.aspx

    bzw.:

      http://msdn.microsoft.com/de-de/library/office/ff834705.aspx

    In deinem Fall geht das dann wohl so:

    Eval( "GB" & Screen.ActiveControl.Name & " = Screen.ActiveControl" )


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 6. Dezember 2013 14:03
  • Hallo,

    auch wenn VBA so manches fehlt nach heutigen Standards, wäre das besser mit einem Dictionary gelöst, denn es spart Variablen und sonstige Hilfskonstruktionen. Dazu musst Du nur die Microsort Scripting Runtime (scrrun.dll) als Verweis einbinden.

    Gruß Elmar

    Freitag, 6. Dezember 2013 14:57
  • Hallo Stefan

    Danke erst mal aber es funktioniert so nicht

    mit "GB" & Screen.ActiveControl.Name baue ich mir ja meinen Variablen Namen zusammen

    und mit Screen.ActiveControl möchte ich die Variable gleichzeitig füllen

    aber wie bringe ich VBA dazu "GB" & Screen.ActiveControl.Name als Variable zu erkennen

    so bekomme ich nur eine Fehlermeldung kann den eingegebenen Námen GBMeinControl nicht finden

    weil er ja wohl versucht GBMeinControl auszuwerten



    • Bearbeitet MCDPone Freitag, 6. Dezember 2013 17:00
    Freitag, 6. Dezember 2013 16:58
  • Hi,

    ber wie bringe ich VBA dazu "GB" & Screen.ActiveControl.Name als Variable zu erkennen

    die Frage wird durch den obigen Code beantwortet. Genau so wird das gemacht :)

    Eval( "GB" & Screen.ActiveControl.Name & " = Screen.ActiveControl" )

    Poste bitte mal die genaue und vollständige Fehlermeldung und den Code, der den Fehler verursacht.

    Wenn dein Control dort, wo der Code steht, nicht bekannt ist (ggfs. wird Eval in einem anderen Kontext ausgeführt) kommt es zu einer solchen Meldung. In dem Fall müsstest Du dann noch mehr angeben, bspw:

    Eval( "FormularInstanz.GB" & Screen.ActiveControl.Name & " = Screen.ActiveControl" )


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 6. Dezember 2013 17:29
  • ich würde gerne eine Function haben die mir eine Variable füllt

    diese Funktion möchte ich nach aktualisieren eines feldes aufrufen

    Was möchtest Du denn mit diesem Vorgehen erreichen? Was ist Dein Ziel?

    Vielleicht gibt es einen anderen Weg, der Dich zum Ziel führt.

    CU


    Thomas@Team-Moeller.de
    Blog: Blog.Team-Moeller.de
    Homepage: www.Team-Moeller.de


    Samstag, 7. Dezember 2013 12:04
  • Hallo Stefan
    Ich bin nicht sicher, ob das so machbar ist. Eval muss in VBA zu einem String Wert führen, der zurückgegeben wird. Ich glaube nicht, dass Du da eine beliebige Variable mit einem Wert befüllen kannst.

    Untiges Eval() Statement würde meines erachtens "True" oder "False" zurück liefern, aber keine Anweisung ausführen. Eval wird da vermutlich einen Vergleich in "=" sehen.

    Gruss
    Henry

    "Stefan Falz [MVP]" schrieb im Newsbeitrag news:6171c567-7950-4835-b472-c9995f2ccd28@communitybridge.codeplex.com...

    Eval( "FormularInstanz.GB" & Screen.ActiveControl.Name & " =
    Screen.ActiveControl" )
    Dienstag, 10. Dezember 2013 09:26
  • Hallo MCDPone

    Ich weiss nicht ganz, was Du machen willst.

    Du möchtest immer die gleiche Funktion aufrufen, korrekt? Aber der Name der Variable müsste dann abhängig vom Feldnamen sein.
    Wo ist denn die Variable deklariert? Ist das eine globale Variable?

    Wenn Du das in einer Funktion machen willst, dann wirst Du das auscodieren müssen:

    Public Function setMyValue(ctl as Control)
     Select Case ctl.Name
       Case "irgendwas"
         GBIrgendwas = ctl.Value
       Case "irgendwasanderes"
         GBIrgendwasanderes = ctl.Value
       ...
     End Select
    End Function

    Diese Funktion legst Du dann am besten gleich zur Deklaration der globalen Variablen, damit Du einfach neue Variablennamen eintragen kannst.
    Die Variablen musst Du ja sowieso deklarieren, da kommt es auf die zwei zusätzlichen Zeilen Code auch nicht mehr drauf an.

    Gruss
    Henry
     "MCDPone" schrieb im Newsbeitrag news:87be7cfa-db46-4ef1-9dcf-83faf92a5dca@communitybridge.codeplex.com...

    ich würde gerne eine Function haben die mir eine Variable füllt
    diese Funktion möchte ich nach aktualisieren eines feldes aufrufen
    meine Variable heist immer so wie das Feld nur mit einem GB davor
    Ich weiss das das folgende nicht geht, aber es  spiegelt in etwa das
    was ich möchte
    "GB" & Screen.ActiveControl.Name = Screen.ActiveControl
    momentan hinterlege ich eben noch bei jedem element
    GBMeinFeld = MeinFeld

    • Als Antwort markiert MCDPone Donnerstag, 12. Dezember 2013 08:31
    Dienstag, 10. Dezember 2013 09:32
  • Hallo Elmar

    "Elmar Boye [MVP]" schrieb im Newsbeitrag news:ea4d4b1c-6804-47d2-8673-c877a58e4e91@communitybridge.codeplex.com...

    auch wenn VBA so manches fehlt nach heutigen Standards, wäre das besser
    mit einemDictionary <Dictionary Object> gelöst, denn es spart Variablen
    und sonstige Hilfskonstruktionen. Dazu musst Du nur die Microsort
    Scripting Runtime (scrrun.dll) als Verweis einbinden.

    Mit einer VBA.Collection könnte es auch gehen. Nur wird das ein bisschen komplizierter.

    Da es sich hier ja um eine Datenbank Anwendung handelt, wäre für mich in jedem Fall eine ganz triviale Tabelle vorziehen, Schuster bleib bei Deinen Leisten, sozusagen.
    Tabelle MeineVariablen
    - VariablenName Text, primärschlüssel
    - VariablenWert Memo

    Dann noch ein paar Zeilen Code und schon kann man die Variablen füllen. Und wenn sich diese wie VBA Variablen verhalten sollen, dann halt einfach die Werte der Variablen löschen, wenn die Anwendung gestartet wird.
     Gruss
    Henry

    Dienstag, 10. Dezember 2013 09:43
  • OH kaum ist man 10 Minuten nicht da 100 Antworten :)

    Also was ich möchte da ich ja faul bin ist.

    Ich habe 2 Tabellen mit Standard werten (1 x Client 1 x Server) diese Standardwerte lese ich mir beim Programmstart in Globale Variablen ein damit ich nicht immer wenn ich eine im Programmcode benötige die Tabelle öffnen - abfragen - schliessen muss.

    das geht auch alles so

    die Globale Variablen heissen genauso wie meine Tabellenspalte nur mit einem GB davor also MeineTabellenspalte ist in Globaler Variable = GBMeineTabellenspalte

    nun zu dem teil wo ich eben faul bin

    wenn ich in meinem Programm einen Standardwert in dem Formular der Standardwerte ändere führe ich immer das Ereigniss

    Private Sub MeineStandartwertXY_AfterUpdate()
    DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
    GBMeineStandartwertXY = MeineStandartwertXY
    End Sub

    und diese Übergabe möchte ich nun in eine Function legen damit ich nur diese aufrufen muss

    eben so wie (ich weiss das es so nicht geht und gehen kann)

    "GB" & Screen.ActiveControl.Name = Screen.ActiveControl

    Dienstag, 10. Dezember 2013 17:17
  • Hallo Henry,

    ich befürchte fast, Du hast Recht. Ich hab mir die Beschreibung nicht genau genug angeschaut und habe mich dazu noch an eine falsche Methode in VBScript (Execute) erinnert. Letztere wäre genau das, was gesucht wird, nur eben nicht in VBA, sondern in VBScript.

    @TE: Sorry für die falsche Empfehlung meinerseits.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 10. Dezember 2013 18:52
  • Hallo!

    Mal ganz einfach gedacht:

    Ich gehe davon aus, dass du zum Ändern der Standardwerte ein Formular verwendest, welches an die "Standardwerte-Tabelle" gebunden ist. 
    Änderungen in den Formularfeldern gehen somit direkt in die Tabelle.

    Weiteres gehe ich davon aus, dass man die Standardwerte nicht besonders oft ändert.

    => Was wäre, wenn du einfach beim Schließen des Formulars alle Standardwerte neu einliest?
    Ob das nun 1 ms oder 10 ms dauert ist doch egal, oder? - Und eine Routine zum Einlese aller Standardwerte aus der Tabelle wirst du vermutlich bereits haben.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Als Antwort markiert MCDPone Donnerstag, 12. Dezember 2013 08:30
    Mittwoch, 11. Dezember 2013 15:59
  • Ja - geht natürlich

    war eben nur ein gedanke das ich eine Variable Variable über eine Funktion füllen kann

    aber ich möchte es auch nicht verkomplizieren

    Danke für die gesamte hilfe 

    Donnerstag, 12. Dezember 2013 08:30
  • Hallo!

    Es kommt auf den Aufwand an. ;-)

    Eine Variante mit Select Case wurde bereits genannt.

    Eine andere Variante wäre statt den Variablen Property-Prozeduren in einer Klasse zu verwenden. Diese könntest du später mit CallByName ansprechen.

    Wenn du Property-Prozeduren verwendest, könntest du auch eine Properties-Auflistung nachbilden, indem du die Eigenschaften nicht in einzelnen Variablen je Eigenschaft sondern in einer Collection o. ä. ablegst.
    (Das würde auch in einem Standardmodul funktionieren.)

    Prinzip:

    Private m_Properties As Collection
    
    Private Sub InitPropCollection()
       Set m_Properties = New Collection
       m_Properties.Add 123, "Prop1"
       m_Properties.Add "abc", "Prop2"
    End Sub
    
    Public Property Get PropValue(ByVal PropName As String) As Variant
       If m_Properties Is Nothing Then InitPropCollection
       PropValue = m_Properties(PropName)
    End Property
    
    Public Property Let PropValue(ByVal PropName As String, ByVal NewValue As Variant)
       m_Properties(PropName) = NewValue
    End Property
    
    Public Property Get Prop1() As Long
       Prop1 = PropValue("Prop1")
    End Property
    
    Public Property Get Prop2() As String
       Prop2 = PropValue("Prop2")
    End Property


    Damit könntest über 

    PropValue("Eigenschaftsname") = "Eigenschaftswert"

    Die Wert von deinem Formular über eine einzige Prozedur einstellen.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch





    • Bearbeitet Josef Pötzl Donnerstag, 12. Dezember 2013 08:58
    Donnerstag, 12. Dezember 2013 08:55