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