2016-01-11 27 views
1

我想在VBA中創建一個指向我自己的數據類型的指針,然後使用類似myDataType.vbString的東西,但是我以錯誤的方式執行。我找不到解決方案,有誰知道我做錯了什麼?在VBA中指向自己的數據類型

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

你爲什麼要這樣做? (根據我的理解,在VBA中是不可能的) – Rory

+0

我正在製作一款遊戲(有2名玩家)。有時我想引用優勝者,有時候還會提到玩家1.我認爲如果我可以說examplePointer = VarPtr(Player1),或者examplePointer = VarPtr(Player2),我會覺得這很容易,所以examplePointer可以將引用引用給獲勝者。所以當我必須對Player1做些什麼時,我可以說例如Player1.Name,或者當我必須對勝利者做些什麼時,我可以說Winner.Name。 – BartD95

+0

那麼,爲什麼你不能只使用'myDataType'的另一個變量,並分配你想要的任何現有的變量呢? – Rory

回答

0

在VBA中,LongPtr數據類型是不是一個真正的指針,但它表示一個variabe的存儲器地址中,爲了調用一個實用程序,需要這樣的指針外部 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. 

你也可以創建你自己的類,但它需要有它的名字它自己的類模塊中。例如,您可以創建一個名爲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數據類型。我希望這有助於澄清這個概念。