在范围内搜索变量名称并为其赋值

问题描述 投票:0回答:1

我开始修改 Excel VBA 以将其本地化为不同的语言。 我将继续解决方案,将变量分配给caption.value,并根据所需的语言分配变量的值。

语言 FR CN
Ln_日期 日期 日期
Ln_创建者 Créé par 创建者

在我的示例中,事先设置了语言,我想为每个变量(第一列中的名称)赋予其值。

问题是,我是否必须先设置变量(public ln_Date 作为字符串),然后在第一列中搜索其值并分配其值(variable = range(variable_name + offset(language),1).Text) 或者是否有可能在搜索变量范围及其类型(公共字符串)和值时动态创建?

我正在尝试对之前定义的每个变量在范围内进行搜索并分配其值,但随着程序的发展,该功能变得越来越大/复杂,在我看来,这不是最好的方法做一些事情,因为我必须为每个新的语言变量添加循环.. 最后好像是迷宫

excel vba localization
1个回答
0
投票

无法在运行时访问变量的名称,因此您的代码将如下所示(我猜您想为所有变量设置命名范围?)

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
© www.soinside.com 2019 - 2024. All rights reserved.