我有一个动态工作表,它是一种数据转储。它是用一些我不会在这里展示的代码创建的,但其中一个问题是一些货币单元被认为是文本而不是数字。
因此,即使存在大量应该计数的数字,以下行也将返回0(在此示例中,我检查列F
中的文本是否为字符串arg
并添加相应的如果是,则I
中的值为总和:
Application.SumIf(dumpSheet.Range("F1:F10000"), arg, dumpSheet.Range("I1:I10000"))
我得到那个小工具提示,询问我是否要更改为数字格式,但是当我使用它来表示是时,宏录制器不记录任何内容。所以Excel确实认识到它可能是一个数字。右键单击>格式>货币或数字在这种情况下不会改变任何内容,它仍然将其视为文本,绿色角落工具提示会保留在那里。
现在我知道我可以使用loops
替换SumIf去除$符号,但是这会让它非常缓慢。更快的方法是使用Find和FindNext,但我觉得没有什么能比工作表函数更快。
在使用我的工作表功能之前,如何将整列货币值转换为数字?就像现在一样,单元格的值类似于363,27 $
。
答案 0 :(得分:0)
我建议两种方式:
如果您的货币数据是例如在B2列:B100中,添加一个公式为=B2*1
的新列并向下拖动以复制原始列。这将尝试将字符串转换为数字。由于您只将它乘以1,因此值本身不会改变。如果它没有立即帮助,使用像= Replace这样的文本函数来摆脱货币符号,然后再将整数乘以1将其变成一个数字。
如果您添加此类数据,请尝试使用Excel 2016中菜单中的“数据 - 从中获取新数据”功能,或使用Power Query插件(直接来自Microsoft)进行Excel 2010-2013 。在这里,您只需将列转换为十进制/整数。 您可以选择excel文件,文本文件,数据库等等。这些工具允许您将原始数据转换为所需类型,选择要保留的列,清理空行或未使用的行,使用简单的GUI过滤内容等等。每当您在源中获得新数据时,只需单击“全部更新”,您的目标表将在几秒钟内更新。
答案 1 :(得分:0)
这个简短的例程应该使那些类似于货币的货币成为真正的数字货币。 VBA在区域设置方面非常以EN-US为中心,因此您有一个努力的基线。
请注意文本值的默认左对齐,尽管有任何数字或货币格式。
运行此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
请注意真实数字的默认右对齐。
答案 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输入公式,而不是仅输入。)