我开始修改 Excel VBA 以将其本地化为不同的语言。 我将继续解决方案,将变量分配给caption.value,并根据所需的语言分配变量的值。
语言 | FR | CN |
---|---|---|
Ln_日期 | 日期 | 日期 |
Ln_创建者 | Créé par | 创建者 |
在我的示例中,事先设置了语言,我想为每个变量(第一列中的名称)赋予其值。
问题是,我是否必须先设置变量(public ln_Date 作为字符串),然后在第一列中搜索其值并分配其值(variable = range(variable_name + offset(language),1).Text) 或者是否有可能在搜索变量范围及其类型(公共字符串)和值时动态创建?
我正在尝试对之前定义的每个变量在范围内进行搜索并分配其值,但随着程序的发展,该功能变得越来越大/复杂,在我看来,这不是最好的方法做一些事情,因为我必须为每个新的语言变量添加循环.. 最后好像是迷宫
无法在运行时访问变量的名称,因此您的代码将如下所示(我猜您想为所有变量设置命名范围?)
Dim Ln_Date As String
Ln_Date = range("Ln_Date" + offset(language), 1).Text
(... and so on for every variable)
您可能会考虑使用集合或字典。
我的建议是不要将翻译后的单词读入变量,而是创建一个小函数,在需要时提供所需的文本。最简单的变体可能如下所示(我假设翻译表位于名为
Translations
的单独工作表上 - 根据您的需要进行更改)。
Function getLanguageColumn(language As String) As Long
With ThisWorkbook.Sheets("Translations")
Dim col As Long
On Error Resume Next
col = Application.Match(language, ThisWorkbook.Sheets("Translations").Rows(1), 0)
On Error GoTo 0
If col = 0 Then col = 2 ' Default: First column
End With
getLanguageColumn = col
End Function
Function getTranslation(code As String, language As String)
Dim col As Long
col = getLanguageColumn(language)
Dim translation As String
With ThisWorkbook.Sheets("Translations")
On Error Resume Next
translation = WorksheetFunction.VLookup(code, .UsedRange, col, False)
On Error GoTo 0
If translation = "" Then translation = "Can't translate code " & code
End With
getTranslation = translation
End Function
还有改进的空间(更好的错误处理,将翻译表兑现为数组或字典),但只要表不变得太大,就可以了。
然后,在您的代码中,只要需要翻译术语,您就可以调用该函数。例如,您在名为
SetLabels
的用户表单中创建一个子程序,并在显示表单 (UserForm_Activate()
) 时或当用户更改语言(如果您给他们选择的选项)时调用该例程。
Dim Language As String
Private Sub UserForm_Activate()
Language = "FR"
SetLabels
End If
Sub SetLabels
Me.LabelDate = getTranslation("LN_Date", Language)
Me.LabelCreatedBy = getTranslation("Ln_Created by", Language)
(...)
End Sub