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.
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.
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.
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.