Excel VBA - 在字符串中提取数值

时间:2016-11-01 17:41:09

标签: excel vba extract

我有多个数据表,在一列中,我有关于各种合同价值的信息。对于每个合同,该列的每个单元格中包含的信息如下所示:

“合同的价值是$ XX,XXX.XX。”

有时,美元价值后会有其他文字,如下所示:

“合同的价值是$ XX,XXX.XX。可以选择修改合同的期限”

我需要编写一个子程序,允许我在该文本字符串中提取美元值,并且只保留该信息(并且之前和之后都没有文本)。

我面临的困难是一切都可能发生变化。美元价值永远不会相同,之前或之后的文本也会发生变化。

到目前为止,我已经能够使用SPLIT函数和$ as分隔符成功地保留$符号后的所有内容。但是,我一直在删除可能跟随美元价值的任何文本时遇到问题。

关于我如何进行的任何想法?

感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

VBA函数val()具有很好的属性,它不会受到数字之后的文本的困扰。所以类似以下内容是可能的:

Function ExtractAmount(data As String) As Variant
    Dim s As String
    s = Split(data, "$")(1) 'part after first dollar sign
    s = Replace(s, ",", "") 'throw away any commas
    ExtractAmount = CCur(Val(s))
End Function

例如,

enter image description here

答案 1 :(得分:3)

最简单的方法是使用正则表达式:

'Requires a reference to Microsoft VBScript Regular Expressions X.X
Public Function ExtractNumber(inValue As String) As Double
    With New RegExp
        .Pattern = "(\d{1,3},?)+(\.\d{2})?"
        .Global = True
        If .Test(inValue) Then
            ExtractNumber = CDbl(.Execute(inValue)(0))
        End If
    End With
End Function

样本用法:

Sub Example()
    Debug.Print ExtractNumber("The value of the contract is $12,345.67. More text.")
End Sub

答案 2 :(得分:3)

以防万一更容易 - 你可能实际上不需要子。像这样的公式:

=VALUE(LEFT(MID(B3,FIND("$",B3)+1,LEN(B3)),FIND(".",B3)-FIND("$",B3)+2))

适用于此示例:

enter image description here

答案 3 :(得分:1)

如果字符串中没有数字而不是美元值,则可以使用:

代码

Sub testingsub()

Dim str As String
Dim x, p1, p2 As Integer

str = "The value of the contract is $00,000.00. There is an option to modify the duration of the contract"
p1 = InStr(str, "$")

For x = Len(str) To 1 Step -1
    If IsNumeric(Mid(str, x, 1)) Then
        p2 = x + 1
        Exit For
    End If
Next x

Debug.Print Mid(str, p1, p2 - p1)

End Sub

结果

  

$ 00,000.00

答案 4 :(得分:0)

如果你不打扰上一段时间

Function GetMoney(txt As String) As String
    GetMoney = "$" & Split(Split(txt, "$")(1), " ")(0)
End Function

否则

Function GetMoney(txt As String) As String
    GetMoney = "$" & Split(Split(txt, "$")(1), " ")(0)
    GetMoney = Left(GetMoney, Len(GetMoney) - 1)
End Function