我有多个数据表,在一列中,我有关于各种合同价值的信息。对于每个合同,该列的每个单元格中包含的信息如下所示:
“合同的价值是$ XX,XXX.XX。”
有时,美元价值后会有其他文字,如下所示:
“合同的价值是$ XX,XXX.XX。可以选择修改合同的期限”
我需要编写一个子程序,允许我在该文本字符串中提取美元值,并且只保留该信息(并且之前和之后都没有文本)。
我面临的困难是一切都可能发生变化。美元价值永远不会相同,之前或之后的文本也会发生变化。
到目前为止,我已经能够使用SPLIT函数和$ as分隔符成功地保留$符号后的所有内容。但是,我一直在删除可能跟随美元价值的任何文本时遇到问题。
关于我如何进行的任何想法?
感谢您的帮助!
答案 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
例如,
答案 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))
适用于此示例:
答案 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