Zelfde code aan x knoppen

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.281
Ik heb op eenAccess formulier 31 knoppen die allemaal dezelfde actie moeten uitvoeren: op basis van hun caption iets in een variabele zetten.
Hoe los ik dit het meest elegant op? (dus niet de code achter elke knop gaan zetten)
De knoppen waarvan sprake hebben een tag om ze te onderscheiden van eventuele later geplaatste knoppen met een andeer actie.
 
Wil je met één actie triggeren dat alle knoppen gaan draaien? Of wil je de routine per knop de code laten uitvoeren die ze moeten uitvoeren?
In het laatste geval maak je van de routine die wordt uitgevoerd een aparte sub of functie, die je dan steeds aanroept.

Code:
Function AlgemeneKlus(Var as Variant)
     Hier je routine met de variabele
End Function
Op de Knop:
Code:
Private Sub cmdKnop_Click()
     Call AlgemeneKlus(Me.cmdKnop.Tag)
End Sub
Of iets dergelijks...
 
Wil je met één actie triggeren dat alle knoppen gaan draaien? Of wil je de routine per knop de code laten uitvoeren die ze moeten uitvoeren?
In het laatste geval maak je van de routine die wordt uitgevoerd een aparte sub of functie, die je dan steeds aanroept.

Code:
Function AlgemeneKlus(Var as Variant)
     Hier je routine met de variabele
End Function
Op de Knop:
Code:
Private Sub cmdKnop_Click()
     Call AlgemeneKlus(Me.cmdKnop.Tag)
End Sub
Of iets dergelijks...

Bedankt, maar dat wist ik al. Alleen staat in de algemene klus al een verwijzing naar ActiveControl.Tag.
Maar nu moet ik evengoed die algemene klus aanroepen vanaf elk van die 31 knoppen en dat is juist wat ik hoopte te vermijden.
In VB6 kon je een array van knoppen maken, allemaal dezelfde naam en een andere index en die kon je dan allemaal tegelijk programmeren. Nu weet ik wel dat dit niet bestaat in VBA.
Ik zocht eigenlijk meer in de richting van het OnClick event van het formulier.
Nu kun je wel bij de OnOpen event van het formulier zeggen: Me.Onclick= "test" waarbij test dan een MACRO is die uitgevoerd wordt telkens je op bvb. een willekeurige knop klikt. Maar ik zie geen mogelijkheid een VBA procedure ipv een macro aan deze gebeurtenis te koppelen. En ik denk niet dat je met een macro naar de ActiveControl kunt verwijzen, of een waarde aan een globale variabele geven.
Dus ik denk dat het idd 31 keer die algemene klus aanroepen zal worden (niet zoveel werk maar wel onelegant vind ik)
 
Ik zag dat je dezelfde discussie ook in een ander forum hebt gestart, en dat je daar meer van verwacht dan van deze... Daarom ga ik gewoon hier verder ;)
Met deze functie kom je volgens mij toch een heel eind.

Code:
Function Labels()
sNaam = Screen.ActiveControl.Name
For Each ctl In Controls
    With ctl
        Select Case .ControlType
            Case acTextBox
                If Not .Tag = "" Then
                    If .Name = sNaam Then
                        MsgBox .Tag
                        Exit Function
                    End If
                End If
            Case Else
        End Select
    End With
Next ctl
End Function
Op een Teksvak zet je dan bij het <Bij klikken> event: =Labels()
Moet je verder wel uit kunnen komen lijkt me...
 
Laatst bewerkt:
Ik zag dat je dezelfde discussie ook in een ander forum hebt gestart, en dat je daar meer van verwacht dan van deze... Daarom ga ik gewoon hier verder ;)
Met deze functie kom je volgens mij toch een heel eind.

Code:
Function Labels()
sNaam = Screen.ActiveControl.Name
For Each ctl In Controls
    With ctl
        Select Case .ControlType
            Case acTextBox
                If Not .Tag = "" Then
                    If .Name = sNaam Then
                        MsgBox .Tag
                        Exit Function
                    End If
                End If
            Case Else
        End Select
    End With
Next ctl
End Function
Op een Teksvak zet je dan bij het <Bij klikken> event: =Labels()
Moet je verder wel uit kunnen komen lijkt me...

Ik geloof dat ik op geen van beide fora een antwoord vind op de vraag hoe ik de 31 knoppen tegelijk kan programmeren zonder achter elkeafzonderlijk een sub aan te roepen.
Misschien kan het gewoon niet in VBA (kon wel in bvb. VB6, daar kon je een array van knoppen maken met allemaal dezelfde naam en aan andere index en die kon je dan allemaal tegelijk programmeren.
Ik denk dat je mijn vraag niet helemaal begrepen hebt, het is veel eenvoudiger ;)


Public GekozenDatum As Date

'Aan te roepen sub
Sub DatumInvullen()
txt_GekozenDatum = DateSerial(Cbo_Jaar, Cbo_maand, ActiveControl.Tag)
GekozenDatum = DateSerial(Cbo_Jaar, Cbo_maand, ActiveControl.Tag)
End Sub

'
en achter ELK (en dat wou ik nu juist vermijden!) van de 31 knoppen waarop een dag van de gekozen maand staat:

Private Sub Cmd1_Click()
DatumInvullen
End Sub
 
Ik heb een nogal rare oplossing gevonden via een combinatie van VBA en een macro.

1. De functie die ik wil aanroepen (snap wel niet goed dat dit een functie moet zijn en geen sub)

Code:
Public GekozenDatum As Date
Function DatumInvullen()

    txt_GekozenDatum = DateSerial(Cbo_Jaar, Cbo_maand, ActiveControl.Tag)
    GekozenDatum = DateSerial(Cbo_Jaar, Cbo_maand, ActiveControl.Tag)

End Function

2. Een macro: RunCode met als argument DatumInvullen(), dus bovenstaande VBA functie

3. En in de Open Event van de Form:

Code:
Private Sub Form_Open(Cancel As Integer)

For Each Knop In Me.Controls

If TypeOf Knop Is CommandButton And Knop.Tag <> "" Then
    Knop.OnClick = "mcr_VBADatum"
End If
Next

'rest van de code
 
En:
Code:
If TypeOf Knop Is CommandButton And Knop.Tag <> "" Then
    Knop.OnClick = "=DatumInvullen()"
End If
wrkt niet? Bj mij namelijk wel, en ik heb er geen macro voor hoeven maken.
 
En:
Code:
If TypeOf Knop Is CommandButton And Knop.Tag <> "" Then
    Knop.OnClick = "=DatumInvullen()"
End If
wrkt niet? Bj mij namelijk wel, en ik heb er geen macro voor hoeven maken.

Dit lijkt me logisch en had ik al geprobeerd, maar ik krijg dan de melding:

The expression On Click you entered as the event property setting produced the following error: the object does not contain the automation Object 'DatumInvullen'

Vraag me af wat ik fout doe :evil:
 
Ik gebruik 2003, misschien is dat de boosdoener... zie mijn bijdragen over 2007 :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan