Unikalne wartości w wielu kolumnach

0

Mam arkusz kalkulacyjny z następującymi elementami: -

Prod No     Store 1 $    Store 1 Qty    Store 2 Sale    Store 2 Qty  etc
A               4.00         1             7.50            2
B               0            0             15.00           1
C               4.00         2              -8             -1
D               5.00         1              5.00           1

Muszę uzyskać wszystkie unikalne ceny dla każdej części, a następnie sumować ilość dla każdej ceny na przykład.,

Prod No A has 4.00 1 unit and 7.50 2 units
Prod No B has 0.00 0 units and 15.00 1 unit
Prod No C has 4.00 2 units and -8 -1 unit
Prod No D has 5.00 2 units

Potrzebuję również listy tylko unikalnych cen i sumy ilości dla każdej ceny

na przykład.,

4.00 3 units
7.50 2 units
0.00 0 units
-8 -1 unit
15.00 1 unit
5.00 2 units
user277541
źródło
Bardzo trudno jest zrozumieć układ arkusza z powyższego wpisu; czy możesz ponownie sformatować (lub opublikować zrzut ekranu), abyśmy mogli lepiej zrozumieć układ?
jimbobmcgee
OK, patrząc na Markdown, teraz widzę, jak wygląda twój arkusz. Kilka pytań: 1 Czy istnieje stała liczba par Cena / Ilość (lub co najmniej rozsądne maksimum)? 2 Ile masz zakresu przestawienia arkusza na coś mniej denormalizowanego? 3 Jakieś ograniczenia dotyczące makr / VBA?
jimbobmcgee

Odpowiedzi:

0

Po pierwsze, myślę, że na dłuższą metę miałbyś więcej szczęścia, gdybyś przechowywał dane w bardziej poziomej formie, np.

Store      Product     Qty    Sales
Store 1    A           1      4.00
Store 1    B           0      0.00
Store 1    C           2      4.00
Store 1    D           0      0.00

Znacznie łatwiej jest wyszukiwać pojedynczą kolumnę niż pary kolumn.

(W zależności od rozmiaru i skali baza danych Access z oddzielnymi tabelami Sklepu, Produktu i Sprzedaży może nawet być lepsza)

Jeśli jednak utkniesz z tym, co masz i możesz znieść makro VBA w swoim arkuszu, możesz spróbować:

  1. Dodaj moduł klasy do projektu VBA, zwany Tuple, zawierający:

    Private szKey As String
    Private nValue As Double
    
    Public Property Get Key() As String
        Key = szKey
    End Property
    Public Property Let Key(newKey As String)
        szKey = newKey
    End Property
    
    Public Property Get Value() As Double
        Value = nValue
    End Property
    Public Property Let Value(newValue As Double)
        nValue = newValue
    End Property
    
  2. Dodaj normalny moduł, np. Module 1 do twojego projektu, zawierający:

    Public Function Summarize(ByRef rng As Range) As String
        If rng.Cells.Count Mod 2 = 1 Then Err.Raise 100, "", "Expected range of even cells"
    
        Dim coll As New Collection
    
        On Error Resume Next
        Dim flag As Boolean: flag = False
        Dim prevCel As Range, cel As Range: For Each cel In rng.Cells
            If flag Then
                Dim Key As String: Key = "" & prevCel.Value2
                coll(Key).Value = coll(Key).Value + cel.Value2
    
                If Err.Number <> 0 Then
                    Err.Clear
                    Dim t1 As New Tuple
                        t1.Key = "" & prevCel.Value2
                        t1.Value = cel.Value2
                        coll.Add t1, Key
                    Set t1 = Nothing
                End If
            End If
            Set prevCel = cel
            flag = Not flag
        Next cel
        On Error GoTo 0
    
        Dim t2 As Variant: For Each t2 In coll
            If Len(Summarize) Then Summarize = Summarize & ", "
            Summarize = Summarize & Format(t2.Key, "#0.00") & " @ " & t2.Value
        Next t2
    End Function
    
  3. Następnie w arkuszu możesz wprowadzić formułę, taką jak:

    ="Product " & $A2 & " has " & Summarize($B2:$I2)
    

    Upewnij się, że zastępujesz zakres $ B2: $ I2 na taki, który jest wystarczająco szeroki, aby objąć wszystkie możliwe liczby sklepów. Upewnij się również, że używasz zakresu o równej wielkości (ponieważ wartości Sprzedaż / Ilość są w parach), w przeciwnym razie otrzymasz #VALUE błąd.

jimbobmcgee
źródło