我可以在 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)中查看它的应用。

问题

  1. 如何使用 VBA 中的 .res/Resource 文件(如果可能的话)?
  2. 有什么好处?

无论如何你不能 - 不能直接。在 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