将VBA字符串转换为双精度浮点数

11

我正在使用VBA的基本编码来创建一个从Windows中的其他屏幕中提取数据的模板。当它提取数字时,它们以字符串格式进行格式化。现在我需要将这些字符串转换为倍精度浮点数,以便进行加/减运算。我已经尝试了所有方法,但似乎无法解决这个问题。

Me.salesprice = Trim(scrn.GetString(11, 65, 10))
'This would be formatted as 25,000.00
Me.salestax = Trim(scrn.GetString(12, 66, 10))
Me.pastdue = Trim(scrn.GetString(14, 65, 10))
Me.assessedppt = Trim(scrn.GetString(18, 66, 10))
Me.secdep = Trim(scrn.GetString(17, 65, 10))

assessedppt = Convert.ToDouble(Me.assessedppt)
uappt = Convert.ToDouble(Me.uappt)
salesprice = Convert.ToDouble(Me.salesprice)
salestax = Convert.ToDouble(Me.salestax)
pastdue = Convert.ToDouble(Me.pastdue)
lc = Convert.ToDouble(frmDetails.lc)

totalfinance = salesprice + salestax + pastdue - secdep + assessedppt + uappt + lc
totalsalesprice = salesprice + pastdue
ppt = assessedppt + uappt

当我执行此操作时,会出现以下错误:

编译错误:变量未定义,并且第一个 Convert 函数被突出显示。


3
在VBA中,CDbl函数是用于转换数据类型的,而Convert.ToDouble则是VB.NET中完全不同的语言所使用的函数。 - Comintern
3个回答

25

你正在使用错误的函数进行转换。您需要使用CDbl,在VBA中我们有以下转换函数:

numberDouble = CDbl("10") 'For convert to double
numberInteger = CInt("12") 'For convert to Integer
varString = CStr("11") 'For convert to String
bool = CBool("true") 'For convert to Boolean

因此,如果更改Convert.toDouble,您的代码将如下所示:

Me.salesprice = Trim(scrn.GetString(11, 65, 10))
'This would be formatted as 25,000.00
Me.salestax = Trim(scrn.GetString(12, 66, 10))
Me.pastdue = Trim(scrn.GetString(14, 65, 10))
Me.assessedppt = Trim(scrn.GetString(18, 66, 10))
Me.secdep = Trim(scrn.GetString(17, 65, 10))

assessedppt = CDbl(Me.assessedppt.value)
uappt = CDbl(Me.uappt.value)
salesprice = CDbl(Me.salesprice.value)
salestax = CDbl(Me.salestax.value)
pastdue = CDbl(Me.pastdue.value)
lc = CDbl(frmDetails.lc.value)

totalfinance = salesprice + salestax + pastdue - secdep + assessedppt + uappt + lc
totalsalesprice = salesprice + pastdue
ppt = assessedppt + uappt

有比提到的4个更多的转换函数,但我想它们是主要的。 - YowE3K

2
这是基于我的另一个回答

如果用户可以使用其他字符(例如$符号),那么下面的函数可能会很有用(基本上是Guilherme's answer的故障安全版本):

最初的回答:

'
' Skips all characters in the input string, except,
' the first negative-sign, digits, and the first dot.
'
Function ParseNumber(ByVal s As String) As Double
    ParseNumber = 0#
    Dim char As String
    Dim i As Integer
    Dim digits$
    Dim isNegative As Boolean
    Dim isPastDot As Boolean
    For i = 1 To Len(s)
        char = Mid(s, i, 1)
        If char >= "0" And char <= "9" Then
            digits = digits & char
        ElseIf char = "-" Then
            If Len(digits) <= 0 Then
                isNegative = True
            End If
        ElseIf char = "." Then
            If Not isPastDot Then
                isPastDot = True
                digits = digits & "."
            End If
        End If
    Next i
    ParseNumber = CDbl(digits)
    If isNegative Then
        ParseNumber = 0 - ParseNumber
    End If
End Function

如果对于将数字转换为字符串感兴趣,请查看FormatNumber(...) - Top-Master

-1

看到这些冗长的解决方案真是让人心痛!希望这能帮助到某些人...

Dim str_Impl_Vol As String ' let's say 37.9% is the string

Dim str_Impl_Vol = Left(ActiveSheet.Cells(intCurrentRow, intCol_Impl_Vol), 
                   Len(ActiveSheet.Cells(intCurrentRow, intCol_Impl_Vol)) - 1)
                   ' Remove the %

Dim dbl_Impl_Vol As Double ' let's say we need 37.9% as 0.379

dbl_Impl_Vol = CDbl(str_Impl_Vol / 100) ' just do it!

有任何问题吗?


这是对一个非常古老问题的新回答,实际上并没有添加任何新内容,也不是自成体系的。我不认为这在这里增加了任何价值,最高票答案已经充分回答了主要问题。 - Paritosh Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接