在VBA中处理有效小数字(10E-9)和大数字(10E+;8)以执行代数方程时,要使用哪些数据类型?

在VBA中处理有效小数字(10E-9)和大数字(10E+;8)以执行代数方程时,要使用哪些数据类型?,vba,excel,Vba,Excel,下面是我的代码的简化版本。我已经为用于执行代数方程(“hexsimvalue”)的变量定义了以下数据类型。目前,我收到一个错误,说“无效数据类型” 提前谢谢你 这些是您获得精确性的最佳选择 十进制16字节 0至+/-79228162514264337593543950335(+/-7.9…E+28)†无小数点;0至+/-7.9228162514264337593543950335,小数点右侧28位; 最小非零数字为+/-0.0000000000000000000001(+/-1E-28) 双精

下面是我的代码的简化版本。我已经为用于执行代数方程(“hexsimvalue”)的变量定义了以下数据类型。目前,我收到一个错误,说“无效数据类型”


提前谢谢你

这些是您获得精确性的最佳选择

十进制16字节
0至+/-79228162514264337593543950335(+/-7.9…E+28)†无小数点;0至+/-7.9228162514264337593543950335,小数点右侧28位; 最小非零数字为+/-0.0000000000000000000001(+/-1E-28)

双精度(双精度浮点)8字节
-1.79769313486231570E+308至-4.94065645841246544E-324†为负值;
4.94065645841246544E-324到1.79769313486231570E+308†对于正值

这些是您获得精度的最佳选择

十进制16字节
0至+/-79228162514264337593543950335(+/-7.9…E+28)†无小数点;0至+/-7.9228162514264337593543950335,小数点右侧28位; 最小非零数字为+/-0.0000000000000000000001(+/-1E-28)

双精度(双精度浮点)8字节
-1.79769313486231570E+308至-4.94065645841246544E-324†为负值; 4.94065645841246544E-324到1.79769313486231570E+308†对于正值

试试这个

Sub test()

    Dim simvalue As Long, hexsimvalue As String, resolution As Single, vDB

    With Sheet1
        vDB = .Range("a1").CurrentRegion 'Get data to array from excel data range
        n = UBound(vDB, 1) 'Size of array (row of 2 dimension array)
    End With

    For i = 2 To n
    resolution = vDB(i, 5)
    simvalue = vDB(i, 13)

    'Algebraic equation:
    hexsimvalue = MyHex(Round((simvalue) / resolution, 0))

    Next i

End Sub
出现此错误的原因似乎是您试图在单个变量中存储一个十六进制值,如186A00,因此如果将其类型更改为string,它应该可以工作

编辑 由于“十六进制”函数,您出现溢出错误,因此您需要创建一个从十进制转换为十六进制的函数。我将发布我找到的函数

Private Function MyHex(ByVal TempDec As Double) As String
    Dim TNo As Integer
    MyHex = ""
    Do
        TNo = TempDec - (Fix(TempDec / 16) * 16)
        If TNo > 9 Then
            MyHex = Chr(55 + TNo) & MyHex
        Else
            MyHex = TNo & MyHex
        End If
        TempDec = Fix(TempDec / 16)
    Loop Until (TempDec = 0)
End Function
试试这个

Sub test()

    Dim simvalue As Long, hexsimvalue As String, resolution As Single, vDB

    With Sheet1
        vDB = .Range("a1").CurrentRegion 'Get data to array from excel data range
        n = UBound(vDB, 1) 'Size of array (row of 2 dimension array)
    End With

    For i = 2 To n
    resolution = vDB(i, 5)
    simvalue = vDB(i, 13)

    'Algebraic equation:
    hexsimvalue = MyHex(Round((simvalue) / resolution, 0))

    Next i

End Sub
出现此错误的原因似乎是您试图在单个变量中存储一个十六进制值,如186A00,因此如果将其类型更改为string,它应该可以工作

编辑 由于“十六进制”函数,您出现溢出错误,因此您需要创建一个从十进制转换为十六进制的函数。我将发布我找到的函数

Private Function MyHex(ByVal TempDec As Double) As String
    Dim TNo As Integer
    MyHex = ""
    Do
        TNo = TempDec - (Fix(TempDec / 16) * 16)
        If TNo > 9 Then
            MyHex = Chr(55 + TNo) & MyHex
        Else
            MyHex = TNo & MyHex
        End If
        TempDec = Fix(TempDec / 16)
    Loop Until (TempDec = 0)
End Function

手绘列标识符的奖励,但如果可以的话,我会收回½,因为我提供了一个图像,而不是复制和粘贴数据。(是的,任何小于15位的有效数字可能最好用双精度)不需要六位小数;它接受包含长整数和短整数的整数。为什么在计算结果之前要尝试将值转换为十六进制?我认为十六进制()返回字符串,而舍入不能对字符串进行舍入。为什么要尝试将舍入()应用于字符串?在分配
vDB
后输入断点,并在监视窗口中检查
vDB
。。。。。注意:为了使您的代码更干净,请使用命令删除
,并对手绘列标识符使用
vDB=Sheet1.Range(“a1”).CurrentRegion
加值,但如果可以的话,我会收回½以提供图像,而不是复制和粘贴数据。(是的,任何小于15位的有效数字可能最好用双精度)不需要六位小数;它接受包含长整数和短整数的整数。为什么在计算结果之前要尝试将值转换为十六进制?我认为十六进制()返回字符串,而舍入不能对字符串进行舍入。为什么要尝试将舍入()应用于字符串?在分配
vDB
后输入断点,并在监视窗口中检查
vDB
。。。。。注意:要使代码更干净,请使用
命令删除
,然后使用
vDB=Sheet1.Range(“a1”)。CurrentRegion
感谢您提供的信息。对于上面的示例,您对我为什么会出现“类型不匹配”错误有什么建议吗?我确信我使用的数据类型是错误的,但我也尝试了double,但不起作用……正如其他人告诉您的,使用HEX函数返回一个字符串,您试图对该值进行舍入,因此这就是类型不匹配的原因。我试过这样做:
hexsimvalue=HEX(舍入((simvalue/resolution),0))
,在该行中显示“溢出”时出错。我看到的问题是,如果在excel电子表格中输入simvalue=1000和resolution=8.3918E-08,则会显示“溢出”错误。感谢您提供的信息。对于上面的示例,您对我为什么会出现“类型不匹配”错误有什么建议吗?我确信我使用的数据类型是错误的,但我也尝试了double,但不起作用……正如其他人告诉您的,使用HEX函数返回一个字符串,您试图对该值进行舍入,因此这就是类型不匹配的原因。我试过这样做:
hexsimvalue=HEX(舍入((simvalue/resolution),0))
,这给了我一个错误,在那一行说“溢出”。我看到的问题是,如果我在excel电子表格中输入simvalue=1000和resolution=8.3918E-08,它会给我“溢出”错误。谢谢,我实际上已经尝试过了。现在的问题是,如果我输入simvalue=1000,分辨率=8.3918E-08,就会出现“溢出”错误……谢谢,我实际上已经试过了。现在的问题是,如果我输入simvalue=1000,分辨率=8.3918E-08,就会出现“溢出”错误。。。。