【问题标题】:Can I use .res (resource) files in VBA and is there an advantage to doing so?我可以在 VBA 中使用 .res(资源)文件吗?这样做有好处吗?
【发布时间】:2020-06-03 18:27:31
【问题描述】:

背景

在标题为Optimize string handling in VB6 - Part I 的文章中,在“将字符串存储在 .res 文件中”小节下,作者讨论了将字符串存储在 .res 文件中,与VB6.

这篇文章是关于 VB6 的,但我正在研究它在 VBA(基于 VB6)中的应用。

问题

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

【问题讨论】:

  • @BigBen 我在 MS Office 中使用 Visual Basic 编辑器 (VBE)。我意识到这篇文章是关于 VB6 的。我想知道VBA有没有跨应用。
  • 所需的存储字节参数在 1997 年可能有一定的分量,但我很确定这几个字节不再重要 - 但使用资源字符串比节省存储空间要多得多(我什至没有想到)。

标签: excel vba localization vb6


【解决方案1】:

你不能 - 无论如何也不能直接。在 VB6 中,.res 文件是您可以添加到项目中的各种组件类型之一,但在 VBA 中,精简的 IDE 没有 Resource Editor 功能(不确定它,已经有一段时间了..),毫无疑问,它是现代 Visual Studio 中 .resx 设计器的直接祖先。

技术上可以在您的 VBA 项目中使用 .res 文件,但是您不妨使用更现代的 .resx 格式,MSXML 技术上应该能够做到这一点使用...虽然,即使在 .NET 中,我们通常也不直接操作 .resx 文件,并且有一个代码生成器涉及将每个资源键转换为生成的类的属性 - 就是这样:

<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 只是一种数据格式,重要的是它要解决的问题:资源键的存储。在 Excel 中托管的 VBA 领域中,这很容易成为某个隐藏工作表上的表格。

然后ResourceManager 可以是一个 VBA 类,其职责是进入该隐藏表(可能将内容缓存到某些字典中以避免重复点击工作表)并获取给定字符串的给定 文化键(“en-US”、“fr-CA”、“de-DE”等),尽管LCID 代码可能会使事情更容易在 COM 领域中集成(例如本机/Win32使用此类 ID 的 API)。

假设您正在构建一个复杂的内部应用程序,并从一开始就这样做:您将可显示的字符串内容与代码分开,然后以这种方式构建所有内容。有一天,公司收购了西班牙的一家公司,或在德国开设了办事处,突然您的应用需要翻译。

因为本地化一直是一个问题,您所要做的就是翻译资源字符串,并且噗!,应用知道在隐藏表,因此有一种新的语言可供选择,一切都“正常工作”,生活很棒。请您取消隐藏工作表并按原样发送它们并附上说明。

如果本地化是事后的想法……我诚挚的同情……这将不好玩。 #BTDT

【讨论】:

  • 谢谢马特!我已经使用带有表格的隐藏(有时是可见的)工作表来存储“后端”数据。我喜欢这个想法,我喜欢使用一个类来检索数据并将其加载到字典中的想法。我只使用 VBA,所以我没有访问过 COM-land,但很感谢你的彻底回答。似乎桌子仍然是要走的路。
  • VBA COM-land =)
  • 那我就住在COM-land的一角!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
相关资源
最近更新 更多