VBA-仅当使用自定义对象的属性时发生溢出错误

时间:2018-07-12 23:12:46

标签: excel vba excel-vba

我正在尝试创建一个Player对象,该对象包含一个Long属性Wealth,必须将其分配给Excel中的单元格,但是仅当最后一行引用{ {1}},而不是将值设置为大于最大整数的固定数字时。这是代码:

newPlayer.Wealth

这有效,但是:

For i = 68 To (67 + numPlayers)
    Dim newPlayer As New Player
    newPlayer.Wealth = CLng(40000)
    newPlayer.Number = i - 67
    Range(Chr(i) & "2").Value = "Player " & CStr(newPlayer.Number)
    Range(Chr(i) & "3").Value = newPlayer.Wealth
Next

我试图清除所指定单元格的格式,但仍然有问题。这是什么原因呢?这也是我的课程属性:

Range(Chr(i) & "3").Value = CLng(40000)

2 个答案:

答案 0 :(得分:2)

修改您的类定义。

这似乎是错误的。除了由于Get Number()错误而导致的复制/粘贴外,将40K长推入有符号整数将会溢出。

Private pNumber As Integer
Private pWealth As Long
...

Property Get Wealth() As Long
    Number = pWealth
End Property

更改为类似的内容

...
Private pWealth As Long

Property Get Wealth() As Long
    Wealth= pWealth
End Property

Property Let Wealth(Value As Long)
    pWealth = Value 
End Property

答案 1 :(得分:0)

正如吉普(Jeeped)指出的那样,Property Get Wealth()需要这样修改:

Property Get Wealth() As Long
    Wealth = pWealth
End Property

其他几点。

没有理由将数字转换为字符串以用于地址串联。 VBA将自动执行此操作。 Range(Chr(i) & "2").ValueRange(Chr(i) & 2).Value实际上是相同的。

没有理由将数字强制转换为长整数。 CLng(40000)或40000都可以。

循环内的

Dim newPlayer As New Player将仅创建Player类的单个实例。在循环外部声明newPlayer,并在循环内部使用Set newPlayer = New Player创建更多newPlayer的实例。

只要您的玩家不超过22名,

Range(Chr(i) & "2")就可以使用。我更喜欢Cells(2, i + 4).Value

Dim newPlayer As New Player
numPlayers = 10
For i = 1 To numPlayers
    Set newPlayer = New Player
    newPlayer.Wealth = CLng(40000)
    newPlayer.Number = i
    Cells(2, i + 4).Value = "Player " & CStr(newPlayer.Number)
    Cells(2, i + 5).Value = newPlayer.Wealth
Next