1

我有一个电子表格,其中的单元格的内容是文本和美元值的混合。整个单元格是一串文本。例如,一个单元格可能包含“Tom owes $65.5”

现在,不幸的是,我得到的电子表格中的美元值没有最后一个“0”,而且由于它们只是文本字符串,我无法轻松地格式化单元格。我尝试使用 find 和 replace 将值更改为正确的格式,但我有数千条记录,尝试并考虑所有情况需要很长时间。

有没有办法检查字符串的一部分是否是美元金额,然后在需要时附加尾随 0?就像是

如果 $* 为 = 4 个字符,则在末尾追加 0
如果 $* < 3 个字符,则将 .00 追加到末尾

我还应该说,货币值并不总是在文本字符串的末尾,它们也不总是以小数点后一位结尾。可以在句子中间找到“$6.75”。此外,只是为了在齿轮上再扔一个扳手,字符串中可能还有其他数字,所以我需要能够仅定位美元符号后面的数字。

4

2 回答 2

2

我认为这个 VBA 用户定义函数 (UDF) 可以满足您的需求。它基于我在http://yoursumbuddy.com/regex-function-sum-numbers-string/中的开创性工作:

Function FixDollarsInStrings(Instring As String) As String

Dim regex As VBScript_RegExp_55.RegExp
Dim rgxMatch As VBScript_RegExp_55.Match
Dim rgxMatches As VBScript_RegExp_55.MatchCollection
Dim Outstring As String
Set regex = New VBScript_RegExp_55.RegExp
With regex
    .Global = True
    .Pattern = "(^| )\$(\d+|\.|,)+((?= )|$)"
    Outstring = Instring
    If .test(Instring) Then
        Set rgxMatches = .Execute(Instring)
        For Each rgxMatch In rgxMatches
            If IsNumeric(Trim(Replace(rgxMatch, ",", ""))) Then
                Outstring = Replace(Outstring, Trim(rgxMatch), Format(rgxMatch, "$#,##0.00"))
            End If
        Next rgxMatch
    End If
End With
FixDollarsInStrings = Outstring
End Function

为了让它工作,你首先需要Microsoft VbScript Regular Expressions 5.5在 VBE 的 Tools>References 中设置一个引用。然后将此代码复制到常规模块。

然后你这样称呼它:

=fixDollarsInStrings(A2)

在此处输入图像描述

于 2013-07-19T22:12:27.793 回答
2

在 Excel 中执行此操作的步骤。. .

我相信这可以在不使用 VBA 的情况下完全在 Excel 中完成(尽管如果你给我看你的工作表的屏幕截图,我可以给你写一个小宏来做到这一点)。以下是我们将要做的基本概述:

  1. 在包含混合数据的单元格右侧插入一列(如果为空白,则使用该列)。
  2. 在每个单元格中插入一个公式,以 (a) 检查数据是否有美元符号,(b) 提取从美元符号右侧开始的值,(c) 将该文本转换为值,以及 (d)将该值插入到单元格中。
  3. 在我们刚刚创建的列的右侧插入另一列。
  4. 在该新列中,插入一个公式以连接第一列和第二列中的值。连接时确保使用文本函数格式化美元金额(我将其包含在下面显示的连接公式中)。

说明步骤。. .

当前工作表

根据我的想象,这是您的工作表现在外观的基本演示:

在此处输入图像描述

如您所见,第一列(或原始列)包含混合文本和美元金额。

将公式插入第二列

接下来,我们将以下公式插入第二列:

=IF(IFERROR(SEARCH("$",A4)>0,0)>0,VALUE(RIGHT(A4,LEN(A4)-SEARCH("$",A4))),"False")

第二列输入公式的图片

将公式插入第三列

现在我们插入公式以连接第一列中值的左侧和第二列中值的右侧(再次将其格式化为文本之后)。这是公式:

=IF(B7<>"False",CONCATENATE(LEFT(A7,FIND("$",A7)-1),TEXT(B7,"$#,##0.00")),"")

第三列输入公式的图片

现在您只需将值复制/粘贴回第一列即可。


编辑

我忘了提到,如果要复制/粘贴它们,您可能应该更改该连接公式以将值恢复为原始值。这是编辑后的公式:

=IF(B7<>"False",CONCATENATE(LEFT(A7,FIND("$",A7)-1),TEXT(B7,"$#,##0.00")),A7)
于 2013-07-19T22:38:23.747 回答