Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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
VBA-仅当使用自定义对象的属性时发生溢出错误_Vba_Excel - Fatal编程技术网

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

VBA-仅当使用自定义对象的属性时发生溢出错误,vba,excel,Vba,Excel,我试图创建一个Player对象,该对象包含必须分配给Excel中某个单元格的Long属性Wealth,但只有当最后一行引用newPlayer.Wealth时,才会出现溢出运行时错误,而当该值设置为大于最大整数的固定数字时,则不会出现溢出运行时错误。代码如下: For i = 68 To (67 + numPlayers) Dim newPlayer As New Player newPlayer.Wealth = CLng(40000) newPlayer.Number

我试图创建一个
Player
对象,该对象包含必须分配给Excel中某个单元格的
Long
属性Wealth,但只有当最后一行引用
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)
我试图从指定的单元格中清除格式,但仍有问题。这是什么原因?以下是我的类属性:

Private pNumber As Integer
Private pProperties As New Collection
Private pWealth As Long

Property Get Number() As Integer
    Number = pNumber
End Property

Property Let Number(pNum As Integer)
    pNumber = pNum
End Property

Property Get Properties() As Collection
    Properties = pProperties
End Property

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

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

Public Sub addProperty(property As PropertyUnit)
    pProperties.Add (property)
End Sub

修改类定义

这似乎是错误的。除了copy/paste from 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

修改类定义

这似乎是错误的。除了copy/paste from 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

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

Property Get Wealth() As Long
    Wealth = pWealth
End Property
还有几点

没有理由为地址串联将数字强制转换为字符串。VBA将自动执行此操作<代码>范围(Chr(i)和“2”)。值和
范围(Chr(i)和2)。值
实际上是相同的

没有理由把一个数字放在长句中。CLng(40000)或40000将起作用

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

Range(Chr(i)和“2”)
只要玩家数量不超过22人就可以使用。我更喜欢
单元格(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

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

Property Get Wealth() As Long
    Wealth = pWealth
End Property
还有几点

没有理由为地址串联将数字强制转换为字符串。VBA将自动执行此操作<代码>范围(Chr(i)和“2”)。值和
范围(Chr(i)和2)。值
实际上是相同的

没有理由把一个数字放在长句中。CLng(40000)或40000将起作用

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

Range(Chr(i)和“2”)
只要玩家数量不超过22人就可以使用。我更喜欢
单元格(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

查看类定义和Let/Get非常重要。查看类定义和Let/Get非常重要。