宏以根据同一单元格内的数据对数值求和?

时间:2017-02-28 20:32:54

标签: excel vba excel-vba excel-formula

我正在尝试创建一个公式或宏来根据前面的非数字字符(使用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

有没有办法在将最终结果限制在单个单元格的同时执行此操作?

提前感谢任何花时间提供帮助的人。

1 个答案:

答案 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