我正在尝试创建一个公式或宏来根据前面的非数字字符(使用Excel 2010)对单个单元格中的一系列数字求和。
例如,我有一个单元格:
ABC1|HIJ2|ABC4|ABC3|DEF5|ABC2|DEF8|ABC5
但我需要它阅读:
ABC15|DEF13|HIJ2
所有相关数据都以(大部分)随机顺序出现在单个单元格中,因此问题是双层的 - 首先自动按字母顺序排列单元格内的所有数据,其次是对所有“ABC”,“DEF”等进行求和
我已经使用以下代码(成功)自动按字母顺序排列数据,但现在我有点不知道从哪里开始,因为我所有的谷歌搜索都表明这种任务需要多个 - 单元解决方案。
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
有没有办法在将最终结果限制在单个单元格的同时执行此操作?
提前感谢任何花时间提供帮助的人。
答案 0 :(得分: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