Refereren naar Aanroepende Knop?

Status
Niet open voor verdere reacties.

reneemettrie

Terugkerende gebruiker
Lid geworden
1 aug 2006
Berichten
1.281
Iemand wil in Excel 2003 één macro maken die vanuit verschillende knoppen wordt aangeroepen. Naargelang de aanroepende knop moet de macro een andere actie verrichten.

Ik heb dat gesimuleerd met op verschillende sheets een aantal benoemde gebieden te maken, “België”, “NL”, “Frankrijk”.

Ik maak dan met de Control toolbox 3 knoppen met als Caption “België”, “NL”,”Frankrijk”
In een gewone module zet ik het volgende:

Code:
Option Explicit
Public land As String

Public Sub druk_af()
Dim tabel As Range
Set tabel = Range(land)
tabel.PrintOut preview:=True
End Sub

Aan de knoppen koppel ik de volgende code:

Code:
Private Sub cmd_België_Click()
land = cmd_België.Caption
druk_af
End Sub

Private Sub cmd_Frankrijk_Click()
land = cmd_Frankrijk.Caption
druk_af
End Sub

Private Sub cmd_Nl_Click()
land = cmd_Nl.Caption
druk_af
End Sub

Maar nu is mijn vraag: kan dat eleganter?
Heb je die variabele “land” nodig?
Of kan je in de afdrukmacro de variabele” land” wijzigen in iets dat neerkomt op AanroependeKnop.Caption? (dus zoiets als de PreviousControl.acption in Access VBA) en dan die afdrukmacro aanroepen vanuit alle 3 die knoppen?

In VB6 kan je een array van knoppen maken die allemaal hetzelfde doen, ik veronderstel dat dit in VBA niet kan?

Hoop dat het duidelijk geformuleerd is…
 
Methode I
voer de aktie in in de clickgebeurtenis van de knop

Code:
Private Sub cmd_België_Click()
  Range(cmd_België.Caption).printout true
End Sub

Private Sub cmd_Frankrijk_Click()
  Range(cmd_Frankrijk.Caption).Printout true
End Sub

Private Sub cmd_Nl_Click()
  Range(cmd_Nl.Caption).printout true
End Sub

Methode II
doorgeven van de caption van de knop als argument aan een gemeenschappelijke macro

Code:
Public Sub druk_af(land)
  Range(land).PrintOut preview:=True
End Sub

Private Sub cmd_België_Click()
  druk_af cmd_België.Caption
End Sub

Private Sub cmd_Frankrijk_Click()
  druk_af cmd_Frankrijk.Caption
End Sub

Private Sub cmd_Nl_Click()
  druk_af cmd_Nl.Caption
End Sub

Methode III
doorgeven van een argument bij de Click-geberutenis van de knop, onafhankelijk van de eigenschappen van de knop

Code:
Public Sub druk_af(j)
  Range(choose(j,"België","Frankrijk","Nederland")).PrintOut True
End Sub

Private Sub cmd_België_Click()
  druk_af 1
End Sub

Private Sub cmd_Frankrijk_Click()
  druk_af 2
End Sub

Private Sub cmd_Nl_Click()
  druk_af 3
End Sub
 
Dit kan je doen via Application.Caller.

Snap ik niet goed!?

Ik plaatste nu na bekijken van de Help volgende code achter een knop:

Private Sub CommandButton1_Click()
MsgBox TypeName(Application.Caller)
End Sub

En het antwoord is ERROR? Hoe kan ik dan een eigenschap zoals de caption te weten komen via code?
 
Methode I
voer de aktie in in de clickgebeurtenis van de knop

Code:
Private Sub cmd_België_Click()
  Range(cmd_België.Caption).printout true
End Sub

Private Sub cmd_Frankrijk_Click()
  Range(cmd_Frankrijk.Caption).Printout true
End Sub

Private Sub cmd_Nl_Click()
  Range(cmd_Nl.Caption).printout true
End Sub

Methode II
doorgeven van de caption van de knop als argument aan een gemeenschappelijke macro

Code:
Public Sub druk_af(land)
  Range(land).PrintOut preview:=True
End Sub

Private Sub cmd_België_Click()
  druk_af cmd_België.Caption
End Sub

Private Sub cmd_Frankrijk_Click()
  druk_af cmd_Frankrijk.Caption
End Sub

Private Sub cmd_Nl_Click()
  druk_af cmd_Nl.Caption
End Sub

Methode III
doorgeven van een argument bij de Click-geberutenis van de knop, onafhankelijk van de eigenschappen van de knop

Code:
Public Sub druk_af(j)
  Range(choose(j,"België","Frankrijk","Nederland")).PrintOut True
End Sub

Private Sub cmd_België_Click()
  druk_af 1
End Sub

Private Sub cmd_Frankrijk_Click()
  druk_af 2
End Sub

Private Sub cmd_Nl_Click()
  druk_af 3
End Sub


Bedankt! Ik denk dat hij zoiets als methode 3 wil toepassen.Die Choose had ik nog nooit in VBA gebruikt.
 
Als je knoppen van de Formulieren werkbalk zou nemen, en aan elke knop dezelfde macro zou hangen, dan werkt het wel met minimale inspanningen en onderhoud.

Bvb.

Code:
Sub doehet()
    druk_af
End Sub

Private Sub druk_af()
    MsgBox Application.Caller
End Sub

Elke knop voert de macro "doehet" uit. Je hebt dan geen werk met parameters doorgeven.

Wigi
 
Als je knoppen van de Formulieren werkbalk zou nemen, en aan elke knop dezelfde macro zou hangen, dan werkt het wel met minimale inspanningen en onderhoud.

Bvb.

Code:
Sub doehet()
    druk_af
End Sub

Private Sub druk_af()
    MsgBox Application.Caller
End Sub

Elke knop voert de macro "doehet" uit. Je hebt dan geen werk met parameters doorgeven.

Wigi

Ondertussen heb ik ook gemerkt dat het alleen gaat met een knop uit de Forms Toolbar, had het geprobeerd met een ActiveX knop (uit de Control Toolbox). Vraag me af hoe je het met deze laatste zou moeten doen?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan