Возьмите значение метки из словаря и разделите его на разные переменные - PullRequest
0 голосов
/ 09 марта 2020

Я работаю с Excel VBA, и у меня есть словарь под названием "dico", который содержит 3 ключа с различными значениями, как в этом примере:

Dico 2

Сумма для 'Fonctionnel' is a1 b2 c3 a4 b5 c6 a7 b8 c9 a10 b11 c12 a19 b20 c21 a22 b23 c24

Сумма для 'Securite' равна a13 b14 c15 a16 b17 c18 a31 b32 c33 a34 b35 c36

Сумма для 'Technique' равна a25 b26 c27 a28 b29 c30

Я хочу, чтобы для каждой клавиши было 3 переменные перегруппировка значений с одним и тем же типом, например: я хочу иметь для Fonctionnel:

allA = a1 a4 a7 a10 a19 a22
allB = b2 b5 b8 b11 b20 b23
allC = c3 c6 c9 c12 c21 c24

На данный момент у меня есть этот код:

Sub groupByTypo()
    Dim rng As Range, c As Range, dict, v, k

    Set dict = CreateObject("scripting.dictionary")
    Set dict2 = CreateObject("scripting.dictionary")

    'get the input range for the labels
    With ActiveSheet
        Set rng = .Range(.Range("C1"), .Cells(.Rows.Count, 3).End(xlUp))
    End With

    For Each c In rng.Cells
        v = Trim(c.Value)
        'if there's a label, add to the count
        If Len(v) > 0 Then dict(v) = dict(v) + c.Offset(0, -1).Value
        If Len(v) > 0 Then dict2(v) = dict2(v) + c.Offset(0, -2).Value
    Next c

    'output the counts
    Debug.Print "Dico 1"
    For Each k In dict
        Debug.Print "Sum for '" & k & "' is " & dict(k)
    Next k

    Debug.Print "Dico 2"
    For Each k In dict2
        Debug.Print "Sum for '" & k & "' is " & dict2(k)
    Next k

End Sub

И у меня есть этот Excel файл:

excel file

Спасибо за помощь!

1 Ответ

2 голосов
/ 09 марта 2020

Учитывая сложность того, что вы делаете, я подхожу к вещам немного по-другому.

  • Я буду использовать массив 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...