指向VBA中拥有数据类型的指针

时间:2016-01-11 12:41:55

标签: excel-vba pointers types vba excel

我想在VBA中创建一个指向我自己的数据类型的指针,然后使用像myDataType.vbString这样的东西,但我是以错误的方式做的。我找不到解决办法,有谁知道我做错了什么?

Type myDataType
    exampleString As String
    exampleInteger As Integer
End Type

Dim exampleType As myDataType
exampleType.exampleString = "Example"
exampleType.exampleInteger = 0

Dim examplePointer As LongPtr
examplePointer = VarPtr(exampleType)

' This is what I want to (or something like it)
' But it gives an error on the dot exampleString
If examplePointer.exampleString = "Example" Then
' Do something
Else: 'Do something else
End If

1 个答案:

答案 0 :(得分:0)

在VBA中,LongPtr数据类型实际上不是指针,而是表示变量的内存地址的实用程序,以便调用需要此类指针的外部 API(DLL)。

因此,在VBA中,您无法显式取消引用指针 a la C或C ++。但是,指针存在隐式,类似于Java:当您声明对象变量时,您正在明确地声明指针。例如:

Dim sh as Excel.Worksheet '<~~ sh is a pointer, so far null because the object is not created yet.
Set sh = Application.Worksheets.Add '<~~ sh now points to the newly created worksheet object.

您也可以创建自己的 Class ,但它必须位于自己的具有名称的类模块中。例如,您可以创建一个名为MyDataType

的类模块
' Class module MydataType
   Public exampleString As String
   Public exampleInteger As Integer

你可以在另一个模块中实现它

Dim exampleType As myDataType '<~~ null pointer declared
Set exampleType = new myDataType '<~~ now pointer is valid
exampleType.exampleString = "Example"
exampleType.exampleInteger = 0

同样,LongPtr数据类型只是调用外部API的实用程序,而不是真正的VBA数据类型。我希望这有助于澄清这一概念。