Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用ObjPtr(Me)返回自定义类实例的名称?_Excel_Vba - Fatal编程技术网

Excel 使用ObjPtr(Me)返回自定义类实例的名称?

Excel 使用ObjPtr(Me)返回自定义类实例的名称?,excel,vba,Excel,Vba,我知道它将返回内存中一个对象的地址,它指向一个名为IUNKNOWN的结构,其中有一种接口定义,用于公开对象结构,但我不知道如何确定VBA自定义类对象的接口以及如何使用该接口返回对象的Name属性 它比必要的更“好”,但我只想知道运行时对象实例的名称,以便可以将其包含在跟踪消息中 有人能解释一下怎么做吗?或者,更好的是,给我一个参考资料,这样我就可以弄明白了 编辑 要重申我的目标: 使自定义类对象能够找出其特定实例的名称 比如说 Dim oObject1 as Class1, oObject2 a

我知道它将返回内存中一个对象的地址,它指向一个名为IUNKNOWN的结构,其中有一种接口定义,用于公开对象结构,但我不知道如何确定VBA自定义类对象的接口以及如何使用该接口返回对象的Name属性

它比必要的更“好”,但我只想知道运行时对象实例的名称,以便可以将其包含在跟踪消息中

有人能解释一下怎么做吗?或者,更好的是,给我一个参考资料,这样我就可以弄明白了

编辑

要重申我的目标:

使自定义类对象能够找出其特定实例的名称

比如说

Dim oObject1 as Class1, oObject2 as Class1
Set oObject1 = New Class1
Set oObject2 = New Class1
Debug.Print oObject1.instanceName & " " & oObject2.instanceName
在即时窗口中:

oObject1 oObject2
这在VBA中可能吗

如果VBA运行时有一个-因为它是解释性的,我想它可能有-并且我有办法公开它,那么我可以创建一个属性Get过程来访问符号表并搜索地址-ObjPtr(Me)-以返回类实例的语义名称

我很确定这是一个愚蠢的问题,但希望认识到这是一个愚蠢问题的过程有助于我的理解

符号表示例

Address Type    Name
00000020    a   T_BIT
00000040    a   F_BIT
00000080    a   I_BIT
20000004    t   irqvec
20000008    t   fiqvec
2000000c    t   InitReset
20000018    T   _main
20000024    t   End

NO
作为答案。在VBA中,无法将实例名称作为字符串文字返回

我还是不明白你为什么要这么做。。。反正

了解每个实例代码名的最简单方法是为存储实际名称的类创建属性。这只会将名称作为字符串属性公开,而不是对象的实际引用—它本身已经有一个引用

因此,创建一个类模块

Class1

Option Explicit

Public MyName as String
在模块1中,需要做的就是

Option Explicit

Sub Main()

    Dim c As Class1
    Set c = New Class1

    c.MyName = "c"

    Debug.Print c.MyName

End Sub
你看:)


另一种方法是创建一个字典来存储两个键/值对

Sub Main()

    Dim c As Class1
    Set c = New Class1

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict.Add "c", c

    Debug.Print dict.Exists("c")

End Sub

现在,你可以真正做你想做的事,但那将是一种非常丑陋的方式。以下是我不打算演示的方法

您将创建自定义类的实例。使用ObjPtr可以在内存中获取它的引用。然后,您需要一种机制来逐行扫描您的模块代码,并找到您所标注的所有变量的名称。一旦检索到所有变量的列表,就需要一种机制来尝试创建相同类型(类)的实例。一旦您通过了该点,您就可以尝试以编程方式
myNewObj=c
(“c”将是obj实例)。如果成功,那么您将对这两个变量执行ObjPt,并在内存中匹配它们的地址—您将获得一个匹配项,您知道变量名。Grree请不要这样做:P

TypeName(obj)
将返回VBA中任何变量的类型:

Dim c as Class1
set c = new Class1 
Debug.print TypeName(c) '==> "Class1"
仅供参考,我也一直希望访问符号表。其思想是按名称从以前的作用域中获取局部变量。通过这种方式,可以进行字符串插值:

a = "World"
Debug.Print StringInterp("Hello ${a}")


做一个普通函数还不走运。

但是你提到的
ObjPtr
是什么?你应该提供任何代码,任何网页链接,无论什么。。。!?已经查过了吗?@BK201是的,我已经查过了谢谢。。。但它只讨论为对象返回的地址,而没有描述如何确定访问对象属性的接口或对象名称。
运行时对象实例的名称不再是名称。您已经命名了对象,以便能够使用它并在代码中引用它。当代码被编译时,名称就消失了,运行时不会通过名称引用对象。您需要使用某种类型的方法来获取实际名称,或者构建一个在运行时存储名称和引用的已调试名称。我不确定我是否理解你的问题-你能详细说明一下你看到的ObjPtr和名字之间的联系吗?@mehow啊,好的。我现在明白了。它不是与对象一起存储的。。。它将仅位于运行时符号表中。对不起,我有点生疏了。那我想这就是我想要的。我希望使用ObjPtr获取对象的地址,并使用该地址在运行时符号表中查找变量的关联名称。可以吗?是的,我还想到了“财产解决方案”这个名字。。。您所描述的过程(不,别担心,我不会去那里…)与编译器生成和管理符号表的过程完全相反。如果我能访问,那就很容易了。哦,还有+1,这是编程史上最有创意的工作……谢谢@CoolBlue。我不认为有人试过这个,但我可能有一天会尝试的哈哈