Excel 这个计算中的小数点是从哪里来的?

Excel 这个计算中的小数点是从哪里来的?,excel,vba,Excel,Vba,我有一个计算BOL数的函数,只取前10位数字 这是密码 Public Function GENERATEBOLNUMBER(iYearSuffix As Integer, _ sFromZipcode As String, _ sToZipCode As String, _ iWeight As Integer, _

我有一个计算BOL数的函数,只取前10位数字

这是密码

Public Function GENERATEBOLNUMBER(iYearSuffix As Integer, _
                              sFromZipcode As String, _
                              sToZipCode As String, _
                              iWeight As Integer, _
                              iShowID As Integer) As String

    Application.ScreenUpdating = False

    GENERATEBOLNUMBER = VBA.Left(7 & _
    WorksheetFunction.RoundUp(VBA.Right(sFromZipcode, 5) _
    * VBA.Right(sToZipCode, 5) * iWeight * (iShowID + 1234), 0), 10)

    Application.ScreenUpdating = True
End Function
下面是我传递的值。7表示iYearSuffix,78224表示sFromZipcode,78224表示sToZipCode,410表示iWeight,1表示iShowID。所有这些都计算为3098352701017600,因此最终字符串应为7309835270,这是包含在第一个数字中的7和后面的9个数字


小数从哪里来?我得到的答案是:73.0983527。

您混合了字符串处理、数字操作、字符串和数字之间的隐式转换、VBA、工作表函数和巨型数字。可能会出什么问题

如果要在VBA中编写自定义项,请在VBA中编写。唯一大到足以存储结果的数据类型是
十进制
,因此您必须将其声明为
变量
,并显式强制转换计算以强制:

Public Function GENERATEBOLNUMBER(yearSuffix As Integer, fromZip As String, _
                                  toZip As String, weight As Integer, _
                                  showId As Integer) As String
    Dim result As Variant
    'Calculate intermediary result.
    result = CDec(Right$(fromZip, 5)) * CDec(Right$(toZip, 5)) * weight * (showId + 1234)
    'Shift the decimal place 7 places to the left:
    result = result / 10 ^ 7
    'Skip the RoundUp call - it wasn't doing anything because your result was an integer.
    'Strip the non-integer portion:
    result = Fix(result)
    'Cast to a string an concatenate the "7" onto the start:
    GENERATEBOLNUMBER = "7" & CStr(result)
End Function

您混合了字符串处理、数字操作、字符串和数字之间的隐式转换、VBA、工作表函数和巨型数字。可能会出什么问题

如果要在VBA中编写自定义项,请在VBA中编写。唯一大到足以存储结果的数据类型是
十进制
,因此您必须将其声明为
变量
,并显式强制转换计算以强制:

Public Function GENERATEBOLNUMBER(yearSuffix As Integer, fromZip As String, _
                                  toZip As String, weight As Integer, _
                                  showId As Integer) As String
    Dim result As Variant
    'Calculate intermediary result.
    result = CDec(Right$(fromZip, 5)) * CDec(Right$(toZip, 5)) * weight * (showId + 1234)
    'Shift the decimal place 7 places to the left:
    result = result / 10 ^ 7
    'Skip the RoundUp call - it wasn't doing anything because your result was an integer.
    'Strip the non-integer portion:
    result = Fix(result)
    'Cast to a string an concatenate the "7" onto the start:
    GENERATEBOLNUMBER = "7" & CStr(result)
End Function

是否验证了将每个单元格拉入此代码的格式?我所能想到的是,你把被认为小于1的值拉进来,比预期的少7个数量级。当Excel中的数字太大时,它会转换为科学符号,所以它可能是3.0983527E+10或类似的东西,从科学符号转换过来?如果我使用与Excel公式相同的公式,它会计算正确,直到我使用自定义函数,它才会出错。嗨,@JoelSpolsky,我是JoS的好读者,我在那里发现了一个断开的链接。在您的阅读列表中,选择“Fog Creek软件”,在详细信息的第一段中,有一个链接已断开。我找不到一个方法来告诉你这一点,所以在这里评论。明天我将删除此注释。是否验证了将每个单元格的格式是否写入此代码?我所能想到的是,你把被认为小于1的值拉进来,比预期的少7个数量级。当Excel中的数字太大时,它会转换为科学符号,所以它可能是3.0983527E+10或类似的东西,从科学符号转换过来?如果我使用与Excel公式相同的公式,它会计算正确,直到我使用自定义函数,它才会出错。嗨,@JoelSpolsky,我是JoS的好读者,我在那里发现了一个断开的链接。在您的阅读列表中,选择“Fog Creek软件”,在详细信息的第一段中,有一个链接已断开。我找不到一个方法来告诉你这一点,所以在这里评论。明天我将删除此评论。谢谢!另外,美元符号在函数调用中是什么意思<代码>右侧$?我试过用谷歌搜索它,但只有关于在单元格引用中使用美元登录公式的结果显示出来。@JozemiteApps-这是函数的类型提示。一组字符串处理函数有一个返回
string
的版本和一个返回
变量的版本。
$
指定返回的
字符串。有一些,谢谢你!另外,美元符号在函数调用中是什么意思<代码>右侧$
?我试过用谷歌搜索它,但只有关于在单元格引用中使用美元登录公式的结果显示出来。@JozemiteApps-这是函数的类型提示。一组字符串处理函数有一个返回
string
的版本和一个返回
变量的版本。
$
指定返回的
字符串。有一些。