7

基本参考:VBA、Visual Basic .NET 和 C# 的十种代码转换

注意:我已经创建并导入了 a *.dll,这个问题是关于 aliases的。

假设一个Test类的程序名称是TestNameSpace.Test

[ProgId("TestNamespace.Test")]
public class Test ...

现在,假设一个 C# 解决方案已被密封并编译为 a *.dll,我在 Excel 的 VBE 中引用它。注意:此时我无法修改程序名称,就好像*.dll不是我写的一样。

这是在VBA:而不是像这样声明一个变量:

Dim myTest As TestNameSpace.Test
Set myTest = new TestNameSpace.Test

我更愿意称它为(仍在 VBE 中)

Dim myTest As Test
Set myText = new Test

在 C# 中,你通常会说

using newNameForTest = TestNamespace.Test;
newNameForTest myTest = new NewNameForTest;

注意:假设项目中没有命名空间冲突VBA

问题:是否有等效的调用VBAC# using别名VB.NET imports

4

2 回答 2

3

答案是否定的:如果没有名称冲突,有一个内置的 VBE 功能可以识别添加到项目中的引用并在运行时(VBE 的运行时)创建别名

如果您的注册表中出现名称冲突,所有.点都将替换为_下划线。

» ProgId's   (程序标识符)

在 COM 中,它只用于后期绑定。这是您调用创建新对象的方式

Dim myObj = CreateObject("TestNamespace.Test")


»EarlyBindingLateBinding

在早期绑定中,您使用new关键字指定要创建的对象的类型。您的对象名称应与 VBA 的智能感知一起弹出。它与 . 无关ProgId。要检索用于您的对象类型的实际命名空间 - 打开Object Explorer F2并在那里找到它

本文解释了早期绑定部分
中名称的来源 使用相同的链接何时使用后期绑定

对于 MSDN Programmatic Identifiers 部分,请参阅

于 2013-07-22T11:41:49.120 回答
3

有趣的问题(不断使用它们,但从未考虑过它们的确切含义)。该语句的定义Imports(对于 相同using)非常清楚:它的唯一功能是通过删除相应的命名空间来缩短引用。因此,要问的第一个问题是:VBA 有这样的东西(命名空间)吗?答案是否定的,因为您可以从多个来源阅读;示例:链接 1 链接 2

总而言之,在没有找到对任何 VBA 语句的单一引用做类似Imports/using并确认 VBA 不考虑证明其使用(命名空间)的“结构”之后,我认为我可以说:不,在VBA中没有这样的东西。

此外,您应该记住,它没有任何真正的适用性。例如:在转换Imports可能使用的 VB.NET 代码时,例如:

Imports Microsoft.Office.Interop.Word
...
Dim wdApp As Application

代码将被完全更改,因此生成的字符串不会那么长:

Dim wdApp As Word.Application ' Prefacing the library's display name.

我认为这是解释为什么 VBA 不需要这种东西的一个很好的图形原因:VB.NET 考虑了必须正确分类的各种现实(命名空间);VBA 占的情况要少得多,因此可以不执行如此系统的、长名称的分类。

-------------------------- 澄清

Imports/using只是名称的缩写,也就是说,每次在 / 中使用给定命名空间的对象时,不要编写whatever.whatever2.whatever3,而是Module在开头Class添加一个Imports/using语句,基本上意味着:“对于所有命名空间 X 的成员,忘记所有标题 bla, bla"。

我并不是说你不能模仿这种行为。只是强调在 VB.NET 中具有短名称的内置功能是有意义的,其中名称可以变得非常长,但在 VBA 中却没有那么多。

于 2013-07-10T11:53:23.117 回答