Excel-macro's geschikt maken voor anderen

Pagina's in dit artikel

  1. Voorbereiding
  2. Map of add-in
  3. Menu's
  4. Toolbars
  5. Beperk toegang
  6. Code beveiligen
  7. Initialiseren
  8. Instellingen
  9. Talen
  10. Installatie
  11. 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:

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.

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):

Werkblad met vertalingen
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

Sub ReadMessages()
    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:

Sub SetTexts()
    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

Function ReworkMsg(ByVal sMsg As String, _
                   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.

venster met aangepaste mededeling
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.

venster met aangepaste mededeling
Afbeelding 12: venster met aangepaste mededeling