2016-07-29 374 views
0

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

因此,下面一行将返回0,即使有大量的应计数(在本例的数字我检查是否在F列中的文本是字符串argI添加相应的值的总和,如果YES:

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

enter image description here

我得到一点提示,询问我是否要更改为数字格式,但是当我用它说的是这样做的Excel宏录制不记录任何东西。认识到它可能是一个数字单击>格式>货币或数字在这种情况下不会更改任何内容,但它仍将其视为文本,并且绿​​色的角落工具提示将保留在此处。

现在我知道我可以通过使用loops来取代SumIf去除$符号,但这会让它变得非常缓慢。更快的方法是使用Find和FindNext,但仍然觉得没有比工作表更快的功能。

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

+0

文本空间 – Andreas

+0

你有多少时间去使用一个循环失去列和分裂? – peege

回答

0

我建议两种方式:

  • ,如果你的货币数据例如在列B2:B100中,添加一个公式为=B2*1的新列,然后将其向下拖动以复制原始列。这会尝试将字符串转换为数字。既然你只乘以一,价值本身不会改变。如果它不能立即帮助您,请使用文本函数(如= Replace)来摆脱货币符号,然后再将整个事物与1相乘以将其转化为数字。

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

0

这个简短的例程应该将那些看起来像文本的文本转换成真正的数字货币。 VBA在地区环境方面非常以美国为中心,因此您需要有一个基线去努力。

crappy_currency

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

运行此修复程序子程序。

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

注真实号码的默认右对齐。

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 
0

如果你只使用VBA来执行这一计算,宁愿只使用一个本地Excel公式,你可以使用以下命令:

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

其中arg是什么价值,你正在努力检查。

(您将需要用Ctrl-Shift键输入,而不仅仅是输入到输入公式。)

相关问题