2017-02-28 50 views
-1

我試圖創建公式或宏來基於前面的非數字字符(使用Excel 2010)在單個單元格中對一系列數字進行求和。宏以根據同一單元格內的數據對數值進行求和?

例如,我有讀取單元:

ABC1|HIJ2|ABC4|ABC3|DEF5|ABC2|DEF8|ABC5

但我需要它來閱讀:

ABC15|DEF13|HIJ2

所有相關的數據是在一個單細胞的(主要是)隨機順序,所以問題是兩層 - 首先自動字母化所有數據在單元格內,其次是總和所有「ABCs」,「DEFs」等。

我已經使用下面的代碼(成功)自動字母化數據,但現在我有點不知所措,因爲我的所有使用Google提示這種任務需要一個多任務處理,細胞溶液。

Sub Macro() 

Dim Rng As Range 
Dim WorkRng As Range 
Dim Arr As Variant 
On Error Resume Next 
Set WorkRng = Application.Selection 
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8) 
Set objArrayList = CreateObject("System.Collections.ArrayList") 
For Each Rng In WorkRng 
Arr = VBA.Split(Rng.Value, "|") 
For i = 0 To UBound(Arr) 
    xMin = i 
    For j = i + 1 To UBound(Arr) 
     If Arr(xMin) > Arr(j) Then 
      xMin = j 
     End If 
    Next j 
    If xMin <> i Then 
     temp = Arr(i) 
     Arr(i) = Arr(xMin) 
     Arr(xMin) = temp 
    End If 
Next i 
Rng.Value = VBA.Join(Arr, "|") 
Next 
End Sub 

有沒有辦法做到這一點,同時保持最終結果侷限於一個單元格?

預先感謝任何花時間幫助的人。

+1

歡迎來到StackOverflow。請注意,這不是免費的代碼寫入服務。然而,我們渴望幫助其他程序員(和有志之士)編寫他們自己的代碼。請閱讀[我如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)上的幫助主題。您可能還想[參觀](http://stackoverflow.com/tour)並在此過程中獲得徽章。之後,請用您迄今編寫的VBA代碼更新您的問題,以完成您希望實現的任務(因爲上述內容不能用公式解決)。 – Ralph

+0

它總是三個字母,然後是一個數字? – SJR

+0

是的,它總是遵循與XYZ1相同的格式(alph-alpha-alpha-numeric) – Janim

回答

0

這是一種不同的方法(它假定三個字母加上數字)。它在A1中輸入並將結果放入G1中。

Sub x() 

Dim v, vOut(), i As Long, n As Long, s As String, s1 As String, oSL As Object 

v = Split(Range("A1"), "|") 
ReDim vOut(1 To UBound(v), 1 To 2) 

Set oSL = CreateObject("System.Collections.Sortedlist") 
For i = LBound(v) To UBound(v) 
    oSL.Add CStr(v(i)), Nothing 
Next i 

With CreateObject("Scripting.Dictionary") 
    For i = 0 To oSL.Count - 1 
     s1 = Left(oSL.GetKey(i), 3) 
     If Not .Exists(s1) Then 
      n = n + 1 
      vOut(n, 1) = s1 
      vOut(n, 2) = Val(Right(oSL.GetKey(i), Len(oSL.GetKey(i)) - 3)) 
      .Add s1, n 
     Else 
      vOut(.Item(s1), 2) = vOut(.Item(s1), 2) + Val(Right(oSL.GetKey(i), Len(oSL.GetKey(i)) - 3)) 
     End If 
    Next i 
End With 

For i = 1 To n 
    s = s & "|" & vOut(i, 1) & vOut(i, 2) 
Next i 

Range("G1") = Mid(s, 2) 

End Sub 
+0

這是......完美的,實際上。謝謝。 – Janim

+0

很高興工作。 – SJR

相關問題