2017-02-28 53 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

相关问题