VBA 等效于 C# 使用或 VB.NET 导入/创建别名

VBA equivalent to C# using or VB.NET imports / creating aliases

提问人: 提问时间:7/10/2013 更新时间:10/22/2014 访问量:7431

问:

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

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

假设一个类的编程名称是TestTestNameSpace.Test

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

现在,假设一个 C# 解决方案已被密封并编译成一个,我在 Excel 的 VBE 中引用了它。注意:在这一点上,我无法修改编程名称,就好像不是我写的一样。*.dll*.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

问:VBA 中是否存在使用 VB.NET 导入别名对 C# 的等效调用?

C# vb.net VBA 别名 using 指令

评论


答:

3赞 varocarbas 7/10/2013 #1

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

总而言之,在没有找到对任何 VBA 语句执行类似操作的单个引用之后,并确认 VBA 不考虑证明其使用(命名空间)的“结构”是合理的,我认为我可以说:不,VBA 中没有这样的东西。Importsusing

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

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,而是在开头添加一个 / 语句,基本上意思是:“对于命名空间 X 的所有成员,只需忘记所有标题 bla,bla”。ModuleClassImportsusing

我并不是说你不能效仿这种行为;只是强调在 VB.NET 中具有内置的短名称功能是有意义的,因为名称可能会变得非常长,但在 VBA 中则不那么重要。

评论

0赞 varocarbas 7/10/2013
为什么会误导?继承与命名空间有什么关系?命名空间是一种正确分类所有内容的方法;继承是一种用于加快给定对象定义速度的方法(例如,从另一个对象获取所有信息)。继承与导入无关。
0赞 varocarbas 7/10/2013
在我提供的一个链接中,这家伙提出了一种模拟命名空间的方法。我不是说你不能想出一些东西;我是说,当您拥有的最长名称仅包含两个单词时,实现内置功能以缩短名称并没有太大意义。
1赞 7/10/2013
哦,也许我的评论不清楚。请注意 VBE 中隐藏的内置功能,它允许您说而不是 .现在想想每个元素(点的右侧)必须如何继承其父类(左侧)。由于这是一个内置功能,它是密封的,因此创建自己的类和成员将不允许你以类似的方式调用它们。您始终必须指定类的完整路径 Class1.Class2.ClassNm,VBE 不会为您创建命名空间。这有助于理解我的第一条评论吗?("Sheet1")Application.ThisWorkbook.Sheets("Sheet1")
0赞 varocarbas 7/10/2013
是的。另一方面,我的假设(没有考虑太多)是,模拟继承之类的东西可能真的很困难(或不可能)。但是,模拟短路调用过程可能是可能的(例如,在引用 Excel 单元格时使用命名范围)。无论如何。。。说没有内置方法来缩短 VBA 中的调用的(逻辑)解释没有太长的路径,对我来说听起来很合理。主要是当这样的实现没有真正的不可能性时(为什么不允许使用“Word”而不是“Word.Application”?
0赞 varocarbas 7/10/2013
PS:VBA还具有您在VBE中引用的相同功能。您可以调用 range(“A1”),并且工作簿和工作表是隐式的。这基本上就是 Imports 所做的。VBA 在这些条件下实现此选项,因为路径可能会变长。它通常不会实现它,因为所有其他路径都足够短。
3赞 user2140173 7/22/2013 #2

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

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

» ProgId's(编程标识符)

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

Dim myObj = CreateObject("TestNamespace.Test")


» EarlyBindingLateBinding

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

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

有关 MSDN 编程标识符部分,请参阅内容