wijzig taal:

Als een applicatie gebruikt wordt door gebruikers met verschillende talen dan is het voor de gebruikers ervaring prettig dat elke gebruiker het formulier te zien krijgt in zijn of haar eigen taal.

Bij het opstarten van een formulier moet dan eerst de taal van de applicatie worden gecheckt waarna het formulier automatisch in de taal van de gebruiker wordt getoond. Als een vertaling niet beschikbaar is, dan wordt de standaardtaal getoond. Na het opstarten van het formulier heeft de gebruiker dan ook nog de mogelijkheid om de taal zelf te wijzigen.

maken van meertalig formulier

Om een formulier meertalig te maken zal eerst een vertaaltabel op een apart tabblad toegevoegd moeten worden aan het bestand. Noem in de VBA-editor deze sheet shTranslations.

Elke vertaling moet daarbij een unieke ID krijgen.

In de kolomkop moet de de taalcode van de betreffende vertaling worden neergezet. Deze kan dan vergeleken worden met de huidige taal van de applicatie.

vertaal tabel

Taalcodes kunnen opgezocht worden op taal codes. Verschillende taalcodes voor dezelfde taal kunnen in dezelfde kolom worden neergezet gescheiden door een underscrore. De taal van de applicatie kan uitgelezen worden met: Application.LanguageSettings.LanguageID(msoLanguageIDUI)

Op het formulier moet vervolgens bij elk besturingselement dat vertaald moet worden, bij de Tag-eigenschap van het besturingselement, de ID worden neergezet van de betreffende vertaling.

Bij het opstarten van het formulier worden dan eerst automatisch deze tags uitgelezen en daarna worden de bijbehorende besturingselementen voorzien van de juiste vertaling.

Voor het vertalen van deze besturingselementen kan de volgende code worden gebruikt:

'------------------------------------------------------------------------------------------------------------------------------
' Auteur    : Manfred van den Noort
' Copyright : © 2021 worksheetsvba.com, alle rechten voorbehouden
' Versie    : 1.0
' Datum     : 2021-01-03
' Doel      : Meertalig formulier
'------------------------------------------------------------------------------------------------------------------------------

Public Sub TranslateForm(oForm As Object, lLangCode As Long)
    Dim ctl As Control, lLangColumnNumber As Long, sTranslation As String, i As Long, arr
    lLangColumnNumber = GetColumnNumberOfLanguageCode(lLangCode)
    If IsNumeric(oForm.Tag) Then
        sTranslation = GetTranslation(lLangColumnNumber, oForm.Tag)
        If sTranslation <> vbNullString Then
            oForm.Caption = sTranslation
        End If
    End If
    For Each ctl In oForm.Controls
        Select Case TypeName(ctl)
            Case "CommandButton", "Label", "Frame", "CheckBox", "OptionButton", "ToggleButton"
                If IsNumeric(ctl.Tag) Then
                    sTranslation = GetTranslation(lLangColumnNumber, ctl.Tag)
                    If sTranslation <> vbNullString Then
                        ctl.Caption = sTranslation
                    End If
                End If
            Case "TabStrip"
                If ctl.Tag <> vbNullString Then
                    arr = Split(ctl.Tag, "_")
                    For i = 0 To ctl.Tabs.Count - 1
                        If i <= UBound(arr) Then
                            If IsNumeric(arr(i)) Then
                                sTranslation = GetTranslation(lLangColumnNumber, CLng(arr(i)))
                                If sTranslation <> vbNullString Then
                                    ctl.Tabs(i).Caption = sTranslation
                                End If
                            End If
                        End If
                    Next
                End If
            Case "MultiPage"
                For i = 0 To ctl.Pages.Count - 1
                    With ctl.Pages(i)
                        If IsNumeric(.Tag) Then
                            sTranslation = GetTranslation(lLangColumnNumber, .Tag)
                            If sTranslation <> vbNullString Then
                                .Caption = sTranslation
                            End If
                        End If
                    End With
                Next
        End Select
    Next
End Sub

Public Function GetColumnNumberOfLanguageCode(lLangCode As Long) As Long
    Dim lColNo As Long, i As Long
    lColNo = 2 'default
    For i = 2 To shTranslations.UsedRange.Columns.Count
        If InStr(shTranslations.Cells(1, i).Value, "_" & lLangCode & "_") Then
            lColNo = i
        End If
    Next
    GetColumnNumberOfLanguageCode = lColNo
End Function

Private Function GetTranslation(lLangColumnNumber As Long, iTranslationID As Integer) As String
    Dim iTranslationRow As Long
    iTranslationRow = Evaluate("iferror(match(" & iTranslationID & ",'" & shTranslations.Name & "'!A:A,0)," & 0 & ")")
    If iTranslationRow > 0 Then
        GetTranslation = shTranslations.Cells(iTranslationRow, lLangColumnNumber).Value
    End If
End Function

Vervolgens moeten aan het formulier keuzerondjes worden toegevoegd voor elke taal en wordt bij het opstarten van het formulier de taal van de applicatie uitgelezen.

Met deze code kunnen de meest gangbare besturingselementen vertaald worden. Als gezegd moet de vertaal-ID opgeslagen worden in de Tag eigenschap van het besturingselement. Als deze Tag op dit moment ook al ergens anders voor gebruikt wordt, dan moet de code hiervoor aangepast worden. Ook zijn aanpassingen nodig als tevens de ControlTipText van besturingselementen en de Accelerator van een opdrachtknop vertaald/vertaald moeten worden. Dit kan bijvoorbeeld gedaan worden door meerdere vertaal-IDs in een Tag te zetten, die gescheiden worden door een pipe.

Hieronder kan een voorbeeldbestand worden gedownload waarin de uitwerking van een meertalig formulier te zien is. Dit bestand bevat Engelse en Nederlandse voorbeeld vertalingen. Als een taal van een gebruiker niet gevonden wordt, dan wordt standaard de Engelse vertaling getoond. Hopelijk kan dit bestand helpen bij het maken van een eigen meertalig formulier.

Download meertalig formulier demobestand:
zip-13Meertalig formulier 1.0
 

Vragen / suggesties

Hopelijk heeft dit artikel geholpen bij het maken van een meertalig VBA formulier. Als er verdere vragen over dit onderwerp zijn of suggesties voor verbetering, plaats dan een reactie hieronder.

arrow_up