我可以在 VBA 中使用 .res(资源)文件吗?这样做有什么好处吗?
Can I use .res (resource) files in VBA and is there an advantage to doing so?
背景
在一篇标题为 Optimize string handling in VB6 - Part I 的文章中,在 sub-section "Store strings in .res files" 下,作者讨论了将字符串存储在 .res 文件中,每个字符只需要 1 个字节,而每个字符需要 2 个字节VB6 中的字符串文字。
这篇文章是关于 VB6 的,但我正在 VBA(基于 VB6)中查看它的应用。
问题
- 如何使用 VBA 中的 .res/Resource 文件(如果可能的话)?
- 有什么好处?
无论如何你不能 - 不能直接。在 VB6 中,.res 文件是您可以添加到项目中的各种组件类型之一,但在 VBA 中,精简版 IDE 没有 资源编辑器 功能(不确定它的实际名称,已经有一段时间了..),毫无疑问是现代 .resx 设计器的直接祖先 Visual Studio.
您 技术上可以 在您的 VBA 项目中使用 .res 文件,但您也可以使用更现代的 .resx 格式,即 MSXML 技术上应该 能够使用...虽然,即使在 .NET 中,我们通常也不会直接操作 .resx 文件,并且有一个代码生成器涉及将每个资源密钥转换为 属性 生成的 class - 就是这样:
<data name="SelectAll_Button" xml:space="preserve">
<value>Select All</value>
</data>
...自动变成这样:
/// <summary>
/// Looks up a localized string similar to Select All.
/// </summary>
public static string SelectAll_Button {
get {
return ResourceManager.GetString("SelectAll_Button", resourceCulture);
}
}
使用 .res/.resx 文件作为资源字符串的优势从一开始就,即使您的应用程序“只需要 en-US 字符串”,主要是关于关注点分离:资源字符串不是代码,它们是数据,数据不属于代码。
现在,在 VBA 地区,分发带有 .resx 文件的 Excel 工作簿是......嗯。 .res/.resx 只是一种数据格式,重要的是它要解决的问题:资源键的存储。在 VBA-land 托管在 Excel 中,这很容易成为一些隐藏工作表上的 table。
然后 ResourceManager
可以是一个 VBA class ,其职责是进入隐藏的 table (可能将内容缓存到某个字典中以避免重复点击工作表)并获取给定 文化键 的给定字符串(“en-US”、“fr-CA”、“de-DE”等),尽管 LCID 代码可能会使事情更容易与 COM 领域集成(例如 native/Win32 API 可以使用此类 ID)。
假设您正在构建一个复杂的内部应用程序,并从一开始就这样做:您将可显示的字符串内容与代码分开,然后以这种方式构建所有内容。有一天公司在西班牙收购了一家公司,或者在德国开了一个办事处,突然你的应用需要翻译。
因为本地化一直是一个问题,你所要做的就是翻译资源字符串,噗!,应用程序知道隐藏的 table 中有一个新列,因此有一种新的语言可供选择,一切都“正常工作”,生活很美好。请取消隐藏工作表并按照说明按原样发送它们。
如果本地化是事后才想到的……我真诚的同情……这不会有趣。 #BTDT
背景
在一篇标题为 Optimize string handling in VB6 - Part I 的文章中,在 sub-section "Store strings in .res files" 下,作者讨论了将字符串存储在 .res 文件中,每个字符只需要 1 个字节,而每个字符需要 2 个字节VB6 中的字符串文字。
这篇文章是关于 VB6 的,但我正在 VBA(基于 VB6)中查看它的应用。
问题
- 如何使用 VBA 中的 .res/Resource 文件(如果可能的话)?
- 有什么好处?
无论如何你不能 - 不能直接。在 VB6 中,.res 文件是您可以添加到项目中的各种组件类型之一,但在 VBA 中,精简版 IDE 没有 资源编辑器 功能(不确定它的实际名称,已经有一段时间了..),毫无疑问是现代 .resx 设计器的直接祖先 Visual Studio.
您 技术上可以 在您的 VBA 项目中使用 .res 文件,但您也可以使用更现代的 .resx 格式,即 MSXML 技术上应该 能够使用...虽然,即使在 .NET 中,我们通常也不会直接操作 .resx 文件,并且有一个代码生成器涉及将每个资源密钥转换为 属性 生成的 class - 就是这样:
<data name="SelectAll_Button" xml:space="preserve">
<value>Select All</value>
</data>
...自动变成这样:
/// <summary>
/// Looks up a localized string similar to Select All.
/// </summary>
public static string SelectAll_Button {
get {
return ResourceManager.GetString("SelectAll_Button", resourceCulture);
}
}
使用 .res/.resx 文件作为资源字符串的优势从一开始就,即使您的应用程序“只需要 en-US 字符串”,主要是关于关注点分离:资源字符串不是代码,它们是数据,数据不属于代码。
现在,在 VBA 地区,分发带有 .resx 文件的 Excel 工作簿是......嗯。 .res/.resx 只是一种数据格式,重要的是它要解决的问题:资源键的存储。在 VBA-land 托管在 Excel 中,这很容易成为一些隐藏工作表上的 table。
然后 ResourceManager
可以是一个 VBA class ,其职责是进入隐藏的 table (可能将内容缓存到某个字典中以避免重复点击工作表)并获取给定 文化键 的给定字符串(“en-US”、“fr-CA”、“de-DE”等),尽管 LCID 代码可能会使事情更容易与 COM 领域集成(例如 native/Win32 API 可以使用此类 ID)。
假设您正在构建一个复杂的内部应用程序,并从一开始就这样做:您将可显示的字符串内容与代码分开,然后以这种方式构建所有内容。有一天公司在西班牙收购了一家公司,或者在德国开了一个办事处,突然你的应用需要翻译。
因为本地化一直是一个问题,你所要做的就是翻译资源字符串,噗!,应用程序知道隐藏的 table 中有一个新列,因此有一种新的语言可供选择,一切都“正常工作”,生活很美好。请取消隐藏工作表并按照说明按原样发送它们。
如果本地化是事后才想到的……我真诚的同情……这不会有趣。 #BTDT