【问题标题】:VBA Excel - run string variable as a line of codeVBA Excel - 将字符串变量作为一行代码运行
【发布时间】:2017-11-23 15:51:23
【问题描述】:

为了让来自不同国家的用户使用我的应用程序,我想在每个现有用户表单(标签、命令按钮、消息框、框架等)的开头初始化每个对象的翻译应用。

我会把所有的翻译都写在我的Languages表中:

我已经制作了第一个用户表单,用户可以在其中输入登录名、密码并选择语言。

在这一步之后,名为“菜单”的主用户窗体将被启动。

我已经尝试在我想要运行的 msgbox 中键入一段代码(如下)来查找代码行(例如:menu.commandbutton1.caption="Envoyer email"

Private Sub UserForm_Initialize()

    ' Definition of language selected during login
    Set langue = Sheets("Languages").Cells.Find("chosen", 
    lookat:=xlWhole).Offset(-1, 0)

     ' Initialisation of the texts in the selected language
     Dim cel As Range
     Dim action As String
     For Each cel In Sheets("Languages").Range("d3:d999")
         If cel <> "" Then
             action = cel & "=" & """" & cel.Offset(0, -2) & """"
             MsgBox (action)
         End If
     Next cel

 End Sub

我已经阅读了一些关于这个主题的主题,但这些主题并不完全符合我想要做的。

如果您有解决方案或变通方法,那将非常有帮助。

【问题讨论】:

  • 你为什么要尝试将命令变量作为字符串传递..?即使语言更改,这些控件参数(如 menu.commandbutton1.caption)也是固定的??
  • 您计划支持多少种语言?您是否真的在问如何更改表单上的标签,如何以所选语言显示消息等?如果您尝试“将字符串变量作为一行代码运行”,那么您想要执行的代码示例在哪里?实现多语言标签等有多种方式
  • 不是我写过的最好的代码,但也许这会让你继续前进:jkp-ads.com/Articles/DistributeMacro09.asp

标签: vba excel language-translation


【解决方案1】:

如果您只是想要基于某个国家/地区的不同 MsgBox,这可能是实现它的最简单方法。想象一下你的文件是这样的:

那么像这样简单的事情将允许您根据国家/地区使用不同的字符串:

Public Sub TestMe()

    Dim country             As String
    Dim language            As Long

    country = "Bulgaria" 'or write "England" to see the difference
    language = WorksheetFunction.Match(country, Range("A1:B1"), 0)

    MsgBox (Cells(2, language))
    MsgBox "The capital of " & country & " is " & (Cells(3, language))

End Sub

整个技巧的想法只是传递正确的列,这是通过WorksheetFunction.Match完成的。

【讨论】:

  • 我什至会创建一个ListObject/table,带有“ResourceKey”、“Language”和“Value”列,以获得更强大的布局 - 然后将“ResourceKey”与“Language”连接起来" 便于Match 查找。
  • @Mat'sMug - 是的,Index(Match(), Match()) 可能是一个更好的解决方案。
【解决方案2】:

取自我有 here 的旧 CR 帖子,此解决方案几乎模仿 .NET .resx 资源文件,您可以轻松了解如何将其扩展到其他语言,如果我今天要编写它,我' d 可能使用Index+Match 查找而不是那个相当低效的循环 - 但无论如何它工作得很好:

资源标准模块

Option Explicit
Public Enum Culture
    EN_US = 1033
    EN_UK = 2057
    EN_CA = 4105
    FR_FR = 1036
    FR_CA = 3084
End Enum

Private resourceSheet As Worksheet

Public Sub Initialize()

    Dim languageCode As String

    Select Case Application.LanguageSettings.LanguageID(msoLanguageIDUI)

        Case Culture.EN_CA, Culture.EN_UK, Culture.EN_US:
            languageCode = "EN"

        Case Culture.FR_CA, Culture.FR_FR:
            languageCode = "FR"

        Case Else:
            languageCode = "EN"

    End Select

    Set resourceSheet = Worksheets("Resources." & languageCode)

End Sub

Public Function GetResourceString(ByVal resourceName As String) As String

    Dim resxTable As ListObject
    If resourceSheet Is Nothing Then Initialize
    Set resxTable = resourceSheet.ListObjects(1)

    Dim i As Long
    For i = 1 To resxTable.ListRows.Count
        Dim lookup As String
        lookup = resxTable.Range(i + 1, 1)
        If lookup = resourceName Then
            GetResourceString = resxTable.Range(i + 1, 2)
            Exit Function
        End If
    Next

End Function

这个想法是,类似于 .NET .resx 文件,每种语言都有一个工作表,命名为 e.g. Resources.ENResources.FR

每个工作表都包含一个ListObject/“表”,并且可以(应该)隐藏。这些列基本上是KeyValue,所以您的数据在工作表Resources.EN 上看起来像这样:

Key                                Value
menu.caption                       Menu
menu.commandbutton1.caption        Send email
menu.commandbutton1.controltiptext Click to send the document

Resources.FR 表将有一个类似的表,具有相同的键和特定于语言的值。

不过,我强烈建议您使用更具描述性的名称;例如而不是menu.commandbutton1.caption,我称之为SendMailButtonText,而不是menu.commandbutton1.controltiptext,我称之为SendMailButtonTooltip。如果您的按钮实际上命名为 CommandButton1,请继续将其命名为 SendMailButton - 稍后再感谢您自己。

然后您的代码可以像这样“本地化”您的 UI:

SendMailButton.Caption = GetResourceString("SendMailButtonText")

Resources.Initialize 过程负责根据 Application.LanguageSettings.LanguageID(msoLanguageIDUI) 了解要使用的资源表 - 并回退到 EN,因此如果用户的语言不受支持,您仍然会显示一些内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2021-12-30
    相关资源
    最近更新 更多