Multilinguale Spielerei

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Multilinguale Spielerei

#1

Beitrag von d'r Bastler »

Moin allerseits,

wenn ein VBAstler nichts zu tun hat, fängt er an zu spielen ;) Ich habe hier mal etwas gebastelt, das in der international vernetzten Welt sicher seinen Sinn hat: ein Grundgerüst, mit dem man die Sprache einer UserForm mit nur einem Klick nach Belieben ändern kann. Das Ganze ist so gestrickt, dass es sich leicht und mit nur minimalen Ergänzungen auch in bereits vorhandene Projekte integrieren lässt.

Als Voraussetzung wird eine einfache Userform1 benötigt, die mit Controls mit beliebigen Namen (Vorgabe oder individuell) gefüllt ist. Alle Controls, die die Eigenschaft Caption haben, machen den meisten Spaß. Wichtig: Es muss eine ComboBox1 dabei sein. Die handelsübliche Tabelle1 wird ja von XL mitgeliefert. Dort kann man aus optischen Gründen (optional) diese Code-Kleinigkeit einfügen:

Code: Alles auswählen

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Columns.AutoFit
End Sub
Für die UserForm1 braucht es dann schon ein bisschen mehr:

Code: Alles auswählen

Option Explicit

Private Sub UserForm_Activate()
Dim i As Integer, c As Integer
Dim ctr As Control

For Each ctr In Controls    'Schleife durch alle Controls
    On Error Resume Next    'nicht alle Controls haben ein Caption
    ctr.Caption = ""        'Löscht vorhandene Caption
Next

c = Cells(1, Columns.Count).End(xlToLeft).Column
    
    For i = 2 To c          'schreibt die vorhandenen Sprachen in die ComboBox1
        ComboBox1.AddItem Cells(1, i)
    Next i
    ComboBox1.SetFocus      'hier geht's für den User los

End Sub

Private Sub ComboBox1_Change()
Dim iCol As Integer
    
iCol = ComboBox1.ListIndex + 2  'addiert zum Index den Offset
    
    SetLanguage iCol            'Aufruf in mdlLanguage mit Spaltennummer
    
End Sub
Dann braucht es noch ein Allg. Modul (ich habe mdlLanguage genannt) mit folgendem Code:

Code: Alles auswählen

Option Explicit

Sub GetControls()               'Liest alle Controls aus Userform1
Dim ctr As Control
Dim i As Integer

i = 2                           'Einträge ab Zeile 2
Cells.Clear

With UserForm1
    For Each ctr In .Controls   'Schleife durch alle Controls
        Cells(i, 1) = ctr.Name  'Namen in aktuelle Tabelle schreiben
        On Error Resume Next    'nicht Controls haben eine Caption
        i = i + 1               'Zeile erhöhen
    Next
End With

End Sub

Sub SetLanguage(iCol As Integer)    'bekommt die ausgewählte Sprache als Spaltennummer
Dim ctr As Control
Dim i As Integer, r As Integer

i = 2                               'Einträge ab Zeile 2

With UserForm1
    For Each ctr In .Controls           'Schleife durch alle Controls
        On Error Resume Next            'nicht aller Controls haben eine Caption
        ctr.Caption = Cells(i, iCol)    'schreibt die Caption
        i = i + 1                       'Zeile erhöhen
    Next
End With

End Sub

Sub ShowUSF()
    UserForm1.Show
End Sub
Hat man diese ersten drei Schritte geschafft, hat man erst einmal das absolute Grundgerüst. Jetzt geht's ans Aufbrezeln. Denn startet man jetzt die Userform, sind alle Buttons und CheckBoxen noch völlig nackig, also ohne Caption.

Also Schritt vier: Mit Alt+F8 ruft man GetControls auf und findet eine Liste der Controls im aktuellen Blatt.
In Schritt fünf trägt man B1 ein Sprachkürzel (z.B. DE für Deutsch) ein und in den Zellen darunter die gewünschten Captions der gelisteten Controls. Weitere Sprachen/Übersetzungen kommen jeweils in die nächste Spalte.

Startet man jetzt die Userform1 (wieder mit Alt+F8) ist sie immer noch nackig. Durch Auswahl eines Sprachkürzels in der ComboBox1 ändert sich das schlagartig.

Wie gesagt, das Ganze ist ein Grundgerüst, auf dem sich aber Übersetzungen von z.B. Texten in ControlTipText, Text- oder ComboBoxen, Tabellennamen und die Caption der UserForm realisieren lassen. Da lässt sich noch sehr viel ausfeilen.

Zeitaufwand für diese Spielerei: nicht mehr als 15 Minuten. Benötigte VBA-Kenntnisse: Minimal (zum Verständnis beachte man die Kommentare im Code). Sprachkenntnisse: gibt's bei deepL.com ;)

Viel Spaß damit!
Folgende Benutzer bedankten sich beim Autor d'r Bastler für den Beitrag:
thowe
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: Multilinguale Spielerei

#2

Beitrag von d'r Bastler »

So - und nun mal die ersten kleinen Feilereien: Inzwischen kann für jedes handelslübliche Control der entsprechende Wert aus der Sprachtabelle gezogen werden. Dazu muss einfach der Code für die UserForm und das Allg. Modul ersetzt (dort ggf. ergänzt) werden.

Und ich muss zwei falsche Versprechungen zurückziehen: ToolTipTexte lassen sich nicht zur Laufzeit ändern und der Sprachwechsel braucht jetzt doch einen Doppelklick auf die ComboBox1. Nachdem jetzt auch dort der Text geändert werden kann, funktioniert das mit dem Change_Event nicht mehr.

Dafür kann jetzt aber die Caption der UserForm ändern.

Hier der neue Code:

Code: Alles auswählen

Option Explicit

Private Sub UserForm_Activate()
Dim i As Integer, c As Integer
Dim ctr As Control

For Each ctr In Controls    'Schleife durch alle Controls
    On Error Resume Next    'nicht alle Controls haben ein Caption
    ctr.Caption = ""        'Löscht vorhandene Caption
Next

c = Cells(1, Columns.Count).End(xlToLeft).Column
    
    For i = 3 To c          'schreibt die vorhandenen Sprachen in die ComboBox1
        ComboBox1.AddItem Cells(1, i)
    Next i
    ComboBox1.SetFocus      'hier geht's für den User los

End Sub

Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim iCol As Integer
    
iCol = ComboBox1.ListIndex + 3  'addiert zum Index den Offset

    SetLanguage iCol             'Aufruf per DblClk in mdlLanguage mit Spaltennummer
    
End Sub
und

Code: Alles auswählen

Option Explicit

Sub GetControls()               'Liest alle Controls aus Userform1
Dim ctr As MSForms.Control
Dim i As Integer

i = 3                           'Einträge ab Zeile 2
Cells.Clear

With UserForm1
    Cells(2, 1) = .Caption
    For Each ctr In .Controls           'Schleife durch alle Controls
        Cells(i, 1) = ctr.Name          'Namen und
        Cells(i, 2) = TypeName(ctr)     'ControlType in aktuelle Tabelle schreiben
        i = i + 1                       'Zeile erhöhen
    Next
End With

End Sub

Sub SetLanguage(iCol As Integer)    'bekommt die ausgewählte Sprache als Spaltennummer
Dim ctr As MSForms.Control
Dim i As Integer

With UserForm1
    .Caption = Cells(2, iCol)           'die Caption der UserForm ist kein Control
    
    i = 3                               'Einträge ab Zeile 3
    For Each ctr In .Controls           'Schleife durch alle Controls
        Select Case TypeName(ctr)
            Case "TextBox", "ComboBox"
                ctr.Text = Cells(i, iCol)
            Case "CommandButton", "CheckBox", "OptionButton"
                ctr.Caption = Cells(i, iCol)
            Case Else
                MsgBox "Dem ControlTyp " & TypeName(ctr) & " ist keine Eigenschaft zugeordnet"
        End Select
        i = i + 1                       'Zeile erhöhen
    Next

End With

End Sub

Sub ShowUSF()
    UserForm1.Show
End Sub
Achja - und in der Sprachtabelle ist eine Spalte B mit den ControlTypes dazugekommen. Die Texte also bitte erst ab Spalte C.

Enjoy!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste