Excel-macros geschikt maken voor anderen.
Menu's
De macro’s en functies in de nieuwe invoegtoepassing moeten natuurlijk toegankelijk gemaakt worden voor de gebruiker. Hiertoe staan de Menu’s en taakbalken ter beschikking.
Een extra item in het menu van Excel kan zeer eenvoudig worden gemaakt:
- Klik met de rechter muisknop op een menu en kies Aanpassen. Of kies uit het menu: Beeld>>Werkbalken>>Aanpassen;
- Klik op het tabje Opdrachten en selecteer bij de categorieën
"Macro’s" (zie afbeelding 5);
Afbeelding 5: Het menu Aanpassen van Taakbalken.
- Versleep nu een menuopdracht uit het venster aanpassen naar de juiste positie in het menu zodat deze daar wordt ingevoegd;
- Rechtsklik op het nieuwe item (zie afbeelding 6) om onder meer een macro aan de nieuwe menu optie toe te wijzen of om de titel, het icoontje en andere zaken te veranderen.
Afbeelding 6, Rechtsklikmenu aanpassen nieuw menu item.
Deze werkwijze heeft echter een groot nadeel: de wijzigingen aan het menu worden lokaal opgeslagen in een systeembestand (afhankelijk van de Excel versie 97, 2000, XP 0f 2003 heet dit bestand respectievelijk gebruikersnaam8.xlb, excel.xlb, excel10.xlb of excel11.xlb) en het is op deze manier niet mogelijk het aangepaste menu op andere PC’s te installeren.
De enige manier om dat wel te kunnen doen is door gebruik te maken van VBA (Zie Listing 1).
Listing 1
Sub MakeMenu()
Dim cControl As CommandBarControl
RemoveMenu 'Voorkom dat het menu er dubbel in komt te staan
Set cControl = Application.CommandBars(1).FindControl(ID:=30007).Controls.Add _
(Type:=msoControlButton, temporary:=True)
With cControl
.Caption = "&XL Utility Voorbeeld"
.OnAction = "DemoSub"
End With
End Sub
Sub RemoveMenu()
On Error Resume Next
Application.CommandBars(1).FindControl(ID:=30007).Controls("&XL Utility Voorbeeld").Delete
On Error GoTo 0
End Sub
Sub DemoSub()
MsgBox "Je hebt het nieuwe menu item gekozen!!!"
End Sub
De macro "MakeMenu" zorgt ervoor, dat in het Menu Extra een keuzemogelijkheid wordt toegevoegd. Dit wordt bereikt middels de regel:
Set cControl = Application.CommandBars(1).FindControl(ID:=30007).Controls.Add _ (Type:=msoControlButton, temporary:=True)
De findcontrol methode kan ook controls zoeken op basis van hun naam, maar dit is niet wenselijk omdat gebruikers met een andere taalversie van Excel dan hoogstwaarschijnlijk een foutmelding krijgen. De ID eigenschap is taalonafhankelijk. Het menu Extra kent een ID van 30007. De overige ID’s van Excel’s complete menu structuur zijn terug te vinden in het bestand xlmenufundict.zip dat gedownload kan worden vanaf deze pagina. Voor het gemak een overzichtje van de ID’s van de hoofditems in de werkbladmenubalk:
Door vanuit de macro MakeMenu eerst de macro RemoveMenu aan te roepen voordat het nieuwe item wordt aangemaakt, wordt voorkomen dat per ongeluk hetzelfde menuitem twee keer verschijnt (dit zou kunnen gebeuren indien om welke reden dan ook de macro MakeMenu twee keer wordt aangeroepen). De macro RemoveMenu dient vervolgens bij het sluiten van de invoegtoepassing te worden aangeroepen om het item uit het menu te verwijderen. Strikt genomen is RemoveMenu niet noodzakelijk omdat het argument "Temporary:=true" is gebruikt, hetgeen ervoor zorgt dat de wijzigingen aan het menu bij sluiten van Excel ongedaan worden gemaakt. Het is echter aan te bevelen dat het menu ook verdwijnt wanneer het bestand met de bijbehorende macro’s gesloten wordt en niet Excel als geheel (bijvoorbeeld wanneer de gebruiker besluit de invoegtoepassing te de-installeren).