2014-01-13 26 views
0

我一直在研究一个小型项目,我试图通过VBA使用类模块来获得结果。VBA:类模块和阵列问题

第一个问题:

下面的语句是从类模块:

Private xRef As Integer 
Private yRef As Integer 
Private bValue As Boolean 
Private NextTiles(1 To 4, 1 To 4) As Boolean 

Public Property Get PreviewTiles(ByVal xRef As Integer, ByVal yRef As Integer) As Boolean 
    PreviewTiles(xRef, yRef) = NextTiles(xRef, yRef) 
End Property 

Public Property Let PreviewTiles(ByVal xRef As Integer, ByVal yRef As Integer, ByVal bValue As Boolean) 
    NextTiles(xRef, yRef) = bValue 
End Property 

在主要子模块体,下面的语句存在:

Public P1, P2 As TetrisPlayer 

Set P1 = New TetrisPlayer 
Set P2 = New TetrisPlayer 

... 

P1.PreviewTiles(1, 1) = True 
MsgBox P1.PreviewTiles(1, 1) 

问题1- 这返回说P1.PreviewTiles(1,1)的值应该是真的。

另外第二个问题:

下面下面的代码是基于一个单独的子模块,与所述收集的玩家包括P1和P2(从单独的子模块)。

Sub TETRIS_Start(FormName As String) 

Dim Player As TetrisPlayer 

For Each Player In Players 
    Call TETRIS_GenerateShape(FormName, Player, True) 
Next Player 

End Sub 

Sub TETRIS_GenerateShape(FormName As String, Player As TetrisPlayer, Start As Boolean) 
... 

这样做或多或少好(虽然它遇到问题1)。所以,我想用下面的语句代替调试:

Sub TETRIS_Start(FormName As String) 

    Call TETRIS_GenerateShape(FormName, P1, True) 

End Sub 

问题2 - 这将导致对象P1(公开宣布,我甚至想声明它在本地)不能够通过传递到子模块TETRIS_GenerateShape 。

出现的错误消息是: 编译错误:ByRef参数类型不匹配。

有什么建议吗?

回答

3

此:

Public P1, P2 As TetrisPlayer 

是不是做你认为它是。 P1现在是一个变种,P2是TetrisPlayer。相反,使用:

Public P1 as TetrisPlayer, P2 as TetrisPlayer 

使用这TetrisPlayer代替或当前代码:

Public Property Get PreviewTiles(ByVal xRef As Integer, ByVal yRef As Integer) As Boolean 
    PreviewTiles = NextTiles(xRef, yRef) 
End Property 

Public Property Let PreviewTiles(ByVal xRef As Integer, ByVal yRef As Integer, ByVal bValue As Boolean) 
    NextTiles(xRef, yRef) = bValue 
End Property 

首先,设置一个断点上MSGBOX P1.PreviewTiles(1,1),然后运行该代码看什么发生。

+0

感谢您的编辑,KazJaw。 –