2016-07-29 41 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鍵輸入,而不僅僅是輸入到輸入公式。)

相關問題