对格式为文本

时间:2016-07-29 20:55:14

标签: excel vba excel-vba

我有一个动态工作表,它是一种数据转储。它是用一些我不会在这里展示的代码创建的,但其中一个问题是一些货币单元被认为是文本而不是数字。

因此,即使存在大量应该计数的数字,以下行也将返回0(在此示例中,我检查列F中的文本是否为字符串arg并添加相应的如果是,则I中的值为总和:

Application.SumIf(dumpSheet.Range("F1:F10000"), arg, dumpSheet.Range("I1:I10000"))

enter image description here

我得到那个小工具提示,询问我是否要更改为数字格式,但是当我使用它来表示是时,宏录制器不记录任何内容。所以Excel确实认识到它可能是一个数字。右键单击>格式>货币或数字在这种情况下不会改变任何内容,它仍然将其视为文本,绿色角落工具提示会保留在那里。

现在我知道我可以使用loops替换SumIf去除$符号,但是这会让它非常缓慢。更快的方法是使用Find和FindNext,但我觉得没有什么能比工作表函数更快。

在使用我的工作表功能之前,如何将整列货币值转换为数字?就像现在一样,单元格的值类似于363,27 $

4 个答案:

答案 0 :(得分:0)

我建议两种方式:

  • 如果您的货币数据是例如在B2列:B100中,添加一个公式为=B2*1的新列并向下拖动以复制原始列。这将尝试将字符串转换为数字。由于您只将它乘以1,因此值本身不会改变。如果它没有立即帮助,使用像= Replace这样的文本函数来摆脱货币符号,然后再将整数乘以1将其变成一个数字。

  • 如果您添加此类数据,请尝试使用Excel 2016中菜单中的“数据 - 从中​​获取新数据”功能,或使用Power Query插件(直接来自Microsoft)进行Excel 2010-2013 。在这里,您只需将列转换为十进制/整数。 您可以选择excel文件,文本文件,数据库等等。这些工具允许您将原始数据转换为所需类型,选择要保留的列,清理空行或未使用的行,使用简单的GUI过滤内容等等。每当您在源中获得新数据时,只需单击“全部更新”,您的目标表将在几秒钟内更新。

答案 1 :(得分:0)

这个简短的例程应该使那些类似于货币的货币成为真正的数字货币。 VBA在区域设置方面非常以EN-US为中心,因此您有一个努力的基线。

crappy_currency

请注意文本值的默认左对齐,尽管有任何数字或货币格式。

运行此fix-it子过程。

Option Explicit

Sub fixitCurrency()
    Dim dumpSheet As Worksheet
    Dim r As Long, fnr As Variant

    Set dumpSheet = Worksheets("Sheet2")
    fnr = Array(Chr(44), Chr(46), _
                Chr(36), vbNullString, _
                Chr(32), vbNullString)

    With dumpSheet.Range("I1:I10000").Cells
        'loop through the find and replace array
        For r = LBound(fnr) To UBound(fnr) Step 2
            .Replace what:=fnr(r), replacement:=fnr(r + 1), _
                     lookat:=xlPart, matchbyte:=True
        Next r

        'this may not be necessary but it doesn't take long
        .NumberFormat = "General"
        .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, _
                       FieldInfo:=Array(0, 1)

        'restore the non-EN-US number format now that they are true numbers
        .NumberFormat = "# ##0.00 $"
    End With

End Sub

crappy_currency2

请注意真实数字的默认右对齐。

答案 2 :(得分:0)

Dim v, arg, dumpSheet As Worksheet

arg = "Y"

Set dumpSheet = ActiveSheet

v = dumpSheet.Evaluate("=SUM((F$1:F$10000=""" & arg & """)*IF(I1:I10000<>""""," & _
                       "SUBSTITUTE(I$1:I$10000,"" $"",""""),0))")

Debug.Print v

答案 3 :(得分:0)

如果您仅使用VBA执行此计算,并且希望仅使用本机Excel公式,则可以使用以下内容:

=Sum(If("F1:F10000"=arg,Value(Substitute("I1:I10000","$","")),0))

其中arg是您要检查的任何值。

(您需要使用Ctrl-Shift-Enter输入公式,而不是仅输入。)