VBA Excel-以代码行形式运行字符串变量

VBA Excel-以代码行形式运行字符串变量,vba,excel,language-translation,Vba,Excel,Language Translation,为了允许来自不同国家的用户使用我的应用程序,我想在应用程序开始时初始化每个现有用户表单中每个对象(标签、命令按钮、msgbox、框架等)的翻译 我将用我的语言工作表编写所有翻译: 我已经创建了第一个userform,用户在其中键入他的登录名、密码并选择他的语言 完成此步骤后,将启动名为“Menu”的主用户窗体 我已经尝试在我想要运行的msgbox(例如:menu.commandbutton1.caption=“Envoyer email”)中键入一段代码(如下所示)来查找代码行 Private

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

我将用我的
语言
工作表编写所有翻译:

我已经创建了第一个userform,用户在其中键入他的登录名、密码并选择他的语言

完成此步骤后,将启动名为“Menu”的主用户窗体

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

Private子用户表单_Initialize()
'登录期间所选语言的定义
Set langue=Sheets(“Languages”).Cells.Find(“selected”,
注视:=xlWhole)。偏移量(-1,0)
'用选定语言初始化文本
暗淡的cel As范围
作为字符串的Dim操作
表格中的每个cel(“语言”)。范围(“d3:d999”)
如果cel“”那么
action=cel&“=”和“”&cel.Offset(0,-2)和“”
MsgBox(行动)
如果结束
下一个细胞
端接头
我已经读过一些关于这个主题的主题,但这些并不完全符合我想做的


如果您有一个解决方案或解决方案,这将非常有帮助。

如果您只是希望基于一个国家的不同MsgBox,这可能是实现它的最简单方法。假设您的文件如下所示:

SendMailButton.Caption = GetResourceString("SendMailButtonText")

然后,像这样简单的操作将允许您根据国家使用不同的字符串:

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

整个技巧的思想就是传递正确的列,这是通过
工作表函数完成的。Match

取自我的一篇旧CR文章,此解决方案非常类似.NET.resx资源文件,您可以很容易地看到如何将其扩展到其他语言,如果我今天写的话,我可能会使用
Index
+
Match
查找,而不是那种效率很低的循环,但不管怎样,它工作得很好:

资源标准模块

与.NET.resx文件类似,其思想是每种语言有一个工作表,名为
Resources.EN
Resources.FR

每个工作表都包含一个
ListObject
/“表”,可以(应该)隐藏。这些列基本上是
,因此您的数据在工作表
参考资料中如下所示。EN

Key                                Value
menu.caption                       Menu
menu.commandbutton1.caption        Send email
menu.commandbutton1.controltiptext Click to send the document
Resources.FR
表将有一个类似的表,具有相同的键和特定于语言的值

不过,我强烈建议使用更具描述性的名称;e、 g.我将其称为
sendmailbuttonext
,而不是
menu.commandbutton1.caption
,我将其称为
sendmailbuttonotext
,而不是
menu.commandbutton1.controltiptext
。如果您的按钮实际命名为
CommandButton1
,请继续命名为
SendMailButton
——然后感谢您自己

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

SendMailButton.Caption = GetResourceString("SendMailButtonText")

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

为什么尝试将命令变量作为字符串传递。。?这些控件参数(如menu.commandbutton1.caption)是固定的,即使语言正确更改??您计划支持多少种语言?您是否真的在询问如何更改表单上的标签,如何以所选语言显示消息等。?如果您试图“以代码行的形式运行字符串变量”,那么您希望执行的代码示例在哪里?有几种方法可以实现多语言标签,等等。这不是(我)写过的最好的代码,但这可能会让你开始:我甚至会将它做成一个
ListObject
/表,带有“ResourceKey”、“language”和“Value”列,以获得更健壮的布局,然后将“ResourceKey”与“language”连接起来为了便于
Match
查找。@Mat'sMug-yup,
Index(Match(),Match())
可能是更好的解决方案。
SendMailButton.Caption = GetResourceString("SendMailButtonText")