Учитывая сложность того, что вы делаете, я подхожу к вещам немного по-другому.
- Я буду использовать массив VBA, который может считывать диапазон за одну операцию. Это значительно увеличит скорость вычислений по сравнению с чтением / записью в / из рабочего листа.
- Я создам объект класса, который будет содержать словарь, который собирает различные теги, упорядоченные по их начальному нечисловому значению. c values
- Я также использовал раннее связывание для словаря, чтобы использовать Intellisense.
- Тогда это просто вопрос сортировки в конце, чтобы получить какой-то вид полезного отображения.
Если все еще доступно, поздний чип Чипа Пирсона Введение в классы является полезным справочником.
Модуль класса
Переименование Модуль varTypes
Option Explicit
Private pSUM As Long
Private pdTags As Dictionary
Private Col As Collection
Public Property Get SUM() As Long
SUM = pSUM
End Property
Public Property Let SUM(value As Long)
pSUM = value
End Property
Public Property Get dTags() As Dictionary
Set dTags = pdTags
End Property
Public Function adddTagsItem(value As String)
Dim sKey As String
Dim I As Long
For I = 1 To Len(value)
If IsNumeric(Mid(value, I, 1)) Then
sKey = Left(value, I - 1)
Exit For
End If
Next I
If dTags.Exists(sKey) Then
dTags(sKey).Add value
Else
Set Col = New Collection
Col.Add value
dTags.Add key:=sKey, Item:=Col
End If
End Function
Private Sub Class_Initialize()
Set pdTags = New Dictionary
pdTags.CompareMode = TextCompare
Set Col = New Collection
End Sub
Обычный модуль
Option Explicit
Sub groupByTypo()
Dim rng As Range, c As Range
Dim dict As Dictionary
Dim clVT As varTypes
Dim sKey As String
Dim I As Long, J As Long
Dim vSrc As Variant
Dim v, w, x
Dim S As String
Set dict = New Dictionary
dict.CompareMode = TextCompare
'get the input range for the data
'Read into array for fastest processing
With ThisWorkbook.Worksheets("Sheet6")
vSrc = Range(.Cells(1, 1), .Cells(.Rows.Count, 3).End(xlUp))
End With
'Organize in dictionary
For I = 1 To UBound(vSrc, 1)
Set clVT = New varTypes
With clVT
sKey = vSrc(I, 3)
v = Split(vSrc(I, 1))
For Each w In v
If Not dict.Exists(sKey) Then
.adddTagsItem CStr(w)
dict.Add key:=sKey, Item:=clVT
Else
dict(sKey).adddTagsItem CStr(w)
End If
Next w
End With
dict(sKey).SUM = dict(sKey).SUM + vSrc(I, 2)
Next I
'extract the results
For Each v In dict.Keys
For Each w In dict(v).dTags
S = ""
For Each x In dict(v).dTags(w)
S = S & " " & x
Next x
Debug.Print v, dict(v).SUM, S
Next w
Next v
End Sub
Выход
Fonctionnel 10 a1 a4 a7 a10 a19 a22
Fonctionnel 10 b2 b5 b8 b11 b20 b23
Fonctionnel 10 c3 c6 c9 c12 c21 c24
Securite 5 a13 a16 a31 a34
Securite 5 b14 b17 b32 b35
Securite 5 c15 c18 c33 c36
Technique 18 a25 a28
Technique 18 b26 b29
Technique 18 c27 c30