Excel-macro's geschikt maken voor anderen
Pagina's in dit artikel
- Voorbereiding
- Map of add-in
- Menu's
- Toolbars
- Beperk toegang
- Code beveiligen
- Initialiseren
- Instellingen
- Talen
- Installatie
- Conclusie
Internationalisatie (meerdere talen)
Bij veel invoegtoepassingen kan het prettig zijn voor de gebruiker als de taal van de gebruikersinterface veranderd kan worden. Dit houdt in, dat alle teksten die aan de gebruiker getoond moeten worden niet meer vast in de VBA code kunnen blijven staan.
Er zijn verschillende oplossingen denkbaar voor het opslaan van de verschillende talen:
- Een tekstbestand
Voordeel: Kan zo worden ingericht, dat de gebruiker zelf een nieuwe taal kan toevoegen. Nadeel: als de gebruiker een fout maakt, kan het gebeuren dat de applicatie verkeerde teksten gaat gebruiken, met alle (interessante) gevolgen van dien.
- In een werkblad in de invoegtoepassing zelf
Voordeel: Eenvoudig te bewerken, verschillende talen kunnen naast elkaar worden geplaatst. Nadeel (in geval van een invoegtoepassing): Een nieuwe taal kan niet zomaar door de gebruiker worden toegevoegd, tenzij hiervoor speciale voorzieningen getroffen worden.
In het dit voorbeeld wordt gebruik gemaakt van een werkblad.
Het werkblad de volgende indeling (zie afbeelding 10):
Afbeelding 10: Werkblad met vertalingen
Kolom A bevat een beschrijving van de locatie waarvoor de vertalingen bestemd zijn, kolom B het object waar de vertaling bij hoort, kolom C de eigenschap die is vertaald, kolom D en verder de vertalingen zelf, met een kolom voor elke taal. De code die de vertalingen moet inlezen maakt gebruik van een aantal gedefinieerde namen welke de linkerbovenhoek aanduiden van een reeks vertalingen die bij elkaar horen. De naam "Languages" (cel D1) duidt het begin aan van de aanwezige talen. De code zoekt de eerste rij af, te beginnen met cel D1 en stopt bij de eerste lege cel op rij 1. De naam "Userform1" (cel D2) duidt het beginpunt aan van de vertalingen voor Userform1. De code start hier met vertalingen lezen, eerst wordt de juiste kolom gekozen aan de hand van de ingestelde taal. Dan worden de cellen van die kolom van boven naar beneden ingelezen tot een lege cel wordt gevonden. Op soortgelijke wijze wordt de naam "MsgBoxes" gebruikt om alle vertalingen voor berichtvensters op te halen.
De code die de vertalingen inleest wordt getoond in listing 7:
Listing 7
Dim iCount As Long
ReDim gsMsgs(10)
With ThisWorkbook.Names("Languages").RefersToRange
For iCount = 1 To 255
If .Offset(0, iCount - 1).Value = "" Then Exit For
ReDim Preserve gsLanguages(iCount)
gsLanguages(iCount) = .Offset(0, iCount - 1).Value
Next
End With
ReDim gsMsgs(10)
With ThisWorkbook.Names("MsgBoxes").RefersToRange
For iCount = 1 To 500
If .Offset(iCount - 1, giLang - 1).Value = "" Then Exit For
ReDim Preserve gsMsgs(iCount)
gsMsgs(iCount) = .RefersToRange.Offset(iCount - 1, giLang - 1).Value
Next
End With
ReDim gsUserform1Strings(10)
With ThisWorkbook.Names("Userform1").RefersToRange
For iCount = 1 To 500
If .Offset(iCount - 1, giLang - 1).Value = "" Then Exit For
ReDim Preserve gsUserform1Strings(iCount)
gsUserform1Strings(iCount) = .Offset(iCount - 1, giLang - 1).Value
Next
End With
End Sub
Indien dus een andere taal gekozen wordt, dient deze subroutine opnieuw te worden uitgevoerd. Verder is natuurlijk code nodig die de dialoogvensters (userforms) voorziet van de juiste taal:
With Me
.cbOK.ControlTipText = gsUserform1Strings(1)
.cbCancel.ControlTipText = gsUserform1Strings(2)
.cbCancel.Caption = gsUserform1Strings(3)
.lblLanguage.Caption = gsUserform1Strings(4)
.cbxLanguage.ControlTipText = gsUserform1Strings(5)
.Caption = gsUserform1Strings(6)
End With
End Sub
Wanneer er variabelen in de tekst moeten worden opgenomen ontstaat mogelijk een probleem. De positie van deze variabele tekst is soms niet gelijk voor elke taal. Bijvoorbeeld:
U heeft Nederlands gekozen als taal voor de gebruikersinterface. You have chosen English for your userinterface language.
De positie van het vet gedrukte woord is niet dezelfde voor Nederlands en Engels. De oplossing die hiervoor is bedacht is het invoeren van codes in de zinnen:
U heeft _ARG1_ gekozen als taal voor de gebruikersinterface. You have chosen _ARG1_ for your userinterface language.
Een VBA functie (zie listing 8) zoekt bij het samenstellen van de te tonen zin naar deze codewoorden en vervangt deze door de gewenste waarden (deze functie werkt helaas niet in Excel 97 vanwege het gebruik van Replace):
Listing 8
Optional ByVal Arg1 As String, _
Optional ByVal Arg2 As String, _
Optional ByVal Arg3 As String, _
Optional ByVal Arg4 As String, _
Optional ByVal Arg5 As String) As String
If Not IsMissing(Arg1) Then
sMsg = Replace(sMsg, "_ARG1_", Arg1)
End If
If Not IsMissing(Arg2) Then
sMsg = Replace(sMsg, "_ARG2_", Arg2)
End If
If Not IsMissing(Arg3) Then
sMsg = Replace(sMsg, "_ARG3_", Arg3)
End If
If Not IsMissing(Arg4) Then
sMsg = Replace(sMsg, "_ARG4_", Arg4)
End If
If Not IsMissing(Arg5) Then
sMsg = Replace(sMsg, "_ARG5_", Arg5)
End If
sMsg = Replace(sMsg, "_NEWLINE_", vbNewLine)
ReworkMsg = sMsg
End Function
Deze functie kent dus 5 optionele argumenten. Om dus de bovenstaande zinnen te verkrijgen, kan deze functie als volgt worden aangeroepen:
MsgBox ReworkMsg("U heeft _ARG1_ gekozen als taal voor de gebruikersinterface.", "Nederlands")
Zie afbeelding 11.
Afbeelding 11: venster met aangepaste mededeling
In dit voorbeeld zal "_ARG1_" dus vervangen worden door "Nederlands".
Ook het starten van een nieuwe regel kan met deze methode worden gedaan, door invoegen van het codewoord _NEWLINE_ op de plaats waar de nieuwe regel moet starten.
MsgBox ReworkMsg("U heeft _ARG1_ gekozen als taal_NEWLINE_voor de gebruikersinterface.", "Nederlands")
Zie afbeelding 12.
Afbeelding 12: venster met aangepaste mededeling