Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/31.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
Excel 2007 PC VBA--错误6溢出_Excel_Vba - Fatal编程技术网

Excel 2007 PC VBA--错误6溢出

Excel 2007 PC VBA--错误6溢出,excel,vba,Excel,Vba,获取错误6-Excel VBA溢出。通常情况下,这是由于一个应该是长整数的整数。但是这个。。。我只是想把三个数字相乘,然后把结果放在一个单元格里。没有涉及任何变量 这是它出错的行:wsResults.Cells(4,3).Value=(60*60*24) 我曾尝试关闭Excel并重新打开工作簿,并尝试将公式直接放入公式栏(它显示正确),但VBA代码仍然无法工作 有人有什么想法吗?谢谢 Option Explicit 'Worsheets: Dim wbThis As ThisWorkbook

获取错误6-Excel VBA溢出。通常情况下,这是由于一个应该是长整数的整数。但是这个。。。我只是想把三个数字相乘,然后把结果放在一个单元格里。没有涉及任何变量

这是它出错的行:wsResults.Cells(4,3).Value=(60*60*24)

我曾尝试关闭Excel并重新打开工作簿,并尝试将公式直接放入公式栏(它显示正确),但VBA代码仍然无法工作

有人有什么想法吗?谢谢

Option Explicit

'Worsheets:
Dim wbThis As ThisWorkbook
Dim wsResults As Worksheet

'Set Timekeeping Values:
Public Const GameTick As Single = (60 / 12) / 4
Public Const GameRound As Single = GameTick * 12
Public Const GameHour As Single = GameRound * 60
Public Const GameDay As Single = GameHour * 24
Public Const GameWeek As Single = GameDay * 7
Public Const GameMonth As Single = GameDay * 30
Public Const GameYear As Single = GameDay * 365

Public Sub TimeControl()

'Initialize Timer:
Randomize Timer

'Set Worksheets:
Set wbThis = ThisWorkbook
Set wsResults = wbThis.Sheets("Results")

'Clear wsResults:
wsResults.Range("A1:M1000").ClearContents

'Display Unit Names:
wsResults.Cells(1, 1).Value = "Tick"
wsResults.Cells(2, 1).Value = "Round"
wsResults.Cells(3, 1).Value = "Hour"
wsResults.Cells(4, 1).Value = "Day"
wsResults.Cells(5, 1).Value = "Week"
wsResults.Cells(6, 1).Value = "Month"
wsResults.Cells(7, 1).Value = "Year"

'Display Game Units:
wsResults.Cells(1, 2).Value = GameTick
wsResults.Cells(2, 2).Value = GameRound
wsResults.Cells(3, 2).Value = GameHour
wsResults.Cells(4, 2).Value = GameDay
wsResults.Cells(5, 2).Value = GameWeek
wsResults.Cells(6, 2).Value = GameMonth
wsResults.Cells(7, 2).Value = GameYear

'Display Real-World Units:
wsResults.Cells(1, 3).Value = ""
wsResults.Cells(2, 3).Value = 60
wsResults.Cells(3, 3).Value = (60 * 60)
wsResults.Cells(4, 3).Value = (60 * 60 * 24)
wsResults.Cells(5, 3).Value = (60 * 60 * 24 * 7)
wsResults.Cells(6, 3).Value = (60 * 60 * 24 * 30)
wsResults.Cells(7, 3).Value = (60 * 60 * 24 * 365)

End Sub

细节

当您尝试进行超出分配目标限制的分配时,会导致溢出。此错误有以下原因和解决方案:

  • 赋值、计算或数据类型转换的结果太大,无法在该类型变量允许的值范围内表示

  • 将该值指定给一个类型的变量,该变量可以容纳更大范围的值

  • 对属性的赋值超过了该属性可以接受的最大值


    确保您的指定符合所指定属性的范围。 您试图在计算中使用一个数字,该数字被强制为整数,但结果大于整数

    例如:

    Dim x As Long
    x = 2000 * 365   ' Error: Overflow
    
    要解决此问题,请键入数字,如下所示:

    Dim x As Long
    x = CLng(2000) * 365
    
    在你的情况下,试着用这个

    wsResults.Cells(4, 3).Value = CLng(60 * 60) * 24
    wsResults.Cells(5, 3).Value = CLng(60 * 60) * 24 * 7
    wsResults.Cells(6, 3).Value = CLng(60 * 60) * 24 * 30
    ...
    
    编辑 为什么需要进行此转换?

    60、60和24都是整数值。在
    VBA
    中,整数是16位有符号类型,当您对2个整数执行算术时,算术将在16位中执行。因为这两个数字相乘的结果超过了可以用16位表示的值,所以会出现异常

    第二个示例(使用CLng的转换)之所以有效,是因为第一个数字首先转换为32位类型,然后使用32位数字执行算术


    在您的示例中,使用16位整数执行算术,然后将结果转换为long,但此时为时已晚,溢出已经发生。解决方案是将乘法中的一个操作数转换为长优先。

    详细信息

    当您尝试进行超出分配目标限制的分配时,会导致溢出。此错误有以下原因和解决方案:

  • 赋值、计算或数据类型转换的结果太大,无法在该类型变量允许的值范围内表示

  • 将该值指定给一个类型的变量,该变量可以容纳更大范围的值

  • 对属性的赋值超过了该属性可以接受的最大值


    确保您的指定符合所指定属性的范围。 您试图在计算中使用一个数字,该数字被强制为整数,但结果大于整数

    例如:

    Dim x As Long
    x = 2000 * 365   ' Error: Overflow
    
    要解决此问题,请键入数字,如下所示:

    Dim x As Long
    x = CLng(2000) * 365
    
    在你的情况下,试着用这个

    wsResults.Cells(4, 3).Value = CLng(60 * 60) * 24
    wsResults.Cells(5, 3).Value = CLng(60 * 60) * 24 * 7
    wsResults.Cells(6, 3).Value = CLng(60 * 60) * 24 * 30
    ...
    
    编辑 为什么需要进行此转换?

    60、60和24都是整数值。在
    VBA
    中,整数是16位有符号类型,当您对2个整数执行算术时,算术将在16位中执行。因为这两个数字相乘的结果超过了可以用16位表示的值,所以会出现异常

    第二个示例(使用CLng的转换)之所以有效,是因为第一个数字首先转换为32位类型,然后使用32位数字执行算术


    在您的示例中,使用16位整数执行算术,然后将结果转换为long,但此时为时已晚,溢出已经发生。解决方法是将乘法中的一个操作数转换为长优先。

    基本上,这里是类型转换函数的列表,可以在宏中使用这些函数来避免此类溢出错误。由于您一直在excel公式中执行此操作,因此这不是必需的,但excel单元格公式本身足以为您执行正确类型的转换。如果上述答案解决了您的问题,您可以始终将其标记为已接受,以便其他人可以将其视为已接受并已解决。谢谢好吧,那很有效。谢谢我以前从未遇到过这种情况。回顾我的旧代码,我总是有一些计数器或其他变量在处理大值时被声明为long。很高兴知道直接乘法可以搞糟整个事情。基本上这里是类型转换函数的列表,可以在宏中使用这些函数来避免这种溢出错误。由于您一直在excel公式中执行此操作,因此这不是必需的,但excel单元格公式本身足以为您执行正确类型的转换。如果上述答案解决了您的问题,您可以始终将其标记为已接受,以便其他人可以将其视为已接受并已解决。谢谢好吧,那很有效。谢谢我以前从未遇到过这种情况。回顾我的旧代码,我总是有一些计数器或其他变量在处理大值时被声明为long。很高兴知道直接乘法可以搞糟整件事。