Jak scalić zduplikowane komórki Col A, jednocześnie sumując ich wartości w Col C, jednocześnie wyciągając ich identyfikatory w Col B Excel 2013 przy użyciu VBA [zamknięte]

1

To jest to czego chcę.

To jest to czego chcę

Scal duplikaty z kolumny A
Przeciągnij identyfikatory z kolumny B
Sumuj wartości z kolumny C

Sub SkuSorter()

Dim x As Long, y As Long
Dim rng As Range
Dim wSrc As Worksheet: Set wSrc = Sheets("AR Received SKU's List 1")

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With

With wSrc
    x = .Range("A" & .Rows.Count).End(xlUp).Row
    Set rng = .Range("A1:A" & x)
    y = .Cells(1, .Columns.Count).End(xlToLeft).Column + 2
    rng.AdvancedFilter Action:=xlFilterCopy, copytoRange:=.Cells(1, y), unique:=True
    Z = .Cells(.Rows.Count, y).End(xlUp).Row
    y = y + 1
    .Cells(1, y).Value = "Total"
    .Range(.Cells(2, y), .Cells(Z, y)).Formula = _
        "=SUMIF(" & rng.Address & "," & .Cells(2, y - 1).Address(False, False) & "," & rng.Offset(, 1).Address & ")"
End With

With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With

End Sub
użytkownik517378
źródło
1
Witamy w Super User. Aby lepiej Ci pomóc, potrzebujemy więcej informacji. Przeczytaj Jak zapytać , a następnie edytuj swój post, aby zawierał szczegółowe informacje o przeprowadzonych badaniach i próbach rozwiązania tego samodzielnie. Stamtąd możemy Ci pomóc. Jak powiedział Teylyn, nie jest to bezpłatna usługa kodowania.
CharlieRB,
Udało mi się uruchomić kod VBA, ale udało mi się tylko scalić duplikaty z kolumny A i sumować wartości z kolumny C, mam problem z tym, jak wyciągnąć identyfikatory z kolumny B.
user517378,
Sub SkuSorter () Dim x As Long, y As Long Dim rng jako zakres As Worksheet Dim wSrc: Ustaw wSrc = Sheets ( "AR odebrane SKU") z zastosowaniem .ScreenUpdating = False .Calculation = xlCalculationManual kończyć
user517378
Z wSrc x = .Range („A” i .Rows.Count) .End (xlUp) .Row Ustaw rng = .Range („A1: A” i x) y =. Komórki (1, .Columns.Count). Koniec (xlToLeft) .Kolumna + 2 rng. Zaawansowane filtrowanie Działanie: = xlFilterCopy, copytoRange: =. Komórki (1, y), unikalne: = True Z =. Komórki (.Rows.Count, y). End (xlUp) .Row y = y + 1. Komórki (1, y). Wartość = „Razem”. Zakres (. Komórki (2, y),. Komórki (Z, y)). Formuła = _ ”= SUMIF („ & rng.Adres & "," & .Cells (2, y - 1) .Adres (False, False) & "," & rng.Offset (, 1) .Address & ")" Zakończ z aplikacją .ScreenUpdating = Truek .Calculation = xlCalculationAutomatic End With
user517378
Proszę edytować kwestię włączenia kodu. Nie umieszczaj tego w komentarzach, jest to nieczytelne.
DavidPostill

Odpowiedzi:

1

Mam nadzieję, że jeszcze raz tu zajrzysz.
Dam odpowiedź, gdzie nie jest potrzebny VBA i postaram się wyjaśnić wszystko.

Korzystając z udostępnionego zdjęcia, utworzyłem własny arkusz: zaczynamy od tego, który element jest najwyższy. Po prostu to zrobi. Nie ma tu wiele do wyjaśnienia.
wprowadź opis zdjęcia tutaj
F2=A2

Co G2przychodzi =IF(LEN(F2),INDEX(B:B,MATCH(F2,A:A,0)),""). Wiedząc, że druga kolumna będzie zawsze taka sama jak w pierwszej kolumnie, po prostu wyszukuje dokładne dopasowanie F2w zakresie A:A( MATCH) i wypisuje wszystko, co jest w B:Btym samym wierszu. (Zatrzymuje się przy pierwszym znalezionym elemencie, chociaż nie ma to znaczenia, ponieważ jest tak samo). LENzapobiega tylko wyświetlaniu go, #NAjeśli łańcuch wyszukiwania jest pusty, a także pomija obliczenia całej tablicy.

Co H2przychodzi co sugested =IF(LEN(F2),SUMIF(A:A,F2,C:C),""). Po prostu sumuje wszystkie wartości w kolumnie, Cktóre mają podaną wyszukiwarkę w kolumnie A. LEN-Part jest taki sam jak ten na G2natomiast nie pokazuje się błąd, to pop 0. Jednak nadal otrzymasz zero, jeśli istnieje termin serch, a suma jest 0.

Chociaż możesz po prostu automatycznie wypełniać G2i H2zmniejszać tyle, ile potrzebujesz, nie zadziała F2. Ale możesz to zrobić za pomocą następującej formuły w F3:

=IF(LEN(F2),IFERROR(INDEX(A:A,MATCH(1,(COUNTIF(F$2:F2,A$2:A$1000)=0)*(A$2:A$1000<>""),0)+1),""),"")

Jest to formuła tablicowa, którą należy potwierdzić za pomocą Ctrl+ Shift+ Enter.

Zaczyna się od COUNTIFtego, że po prostu zwraca tablicę binarną, podczas gdy każdy element otrzymuje a, 1jeśli pasuje do dowolnego ciągu wyszukiwania, wszystkie inne otrzymują 0(wyszukiwanie wszystkich ciągów powyżej siebie F$2:F2). Ponieważ nie chcemy dostać już używanego przedmiotu, obracamy wszystko 0 TRUE( =0). Nie chcemy też emptyprzedmiotu, więc też go sprawdzamy ( A$2:A$1000<>""). Mnożenie 2 tablic boolowskich jest tym samym, co posiadanie ANDdla każdej pary elementów, podczas gdy użycie wartości rzeczywistej ANDsprawdzi, czy wszystkie elementy w tablicach boura mają być TRUE. Jednak ponowne pomnożenie daje nam tablicę binarną zawierającą 1w każdym elemencie, który nie jest pusty i nie jest używany. MATCHteraz sprawdza pierwszy1i zwraca swój numer pozycji (wiersz). Ale począwszy od drugiego rzędu daje nam przesunięcie, które jest zerowane +1. Posiadanie pozycji INDEXdaje nam ciąg, którego potrzebujemy. IFERRORdotyczy tylko pierwszego emptyrozwiązania, które powróci #NA. I po LENprostu pomija obliczenia dla wszystkich komórek po pierwszym pustym.
Korzystanie z kreatora formuł, aby zobaczyć, co tak naprawdę oblicza, pomaga również zrozumieć. Ale zawsze dwukrotnie sprawdź wszystkie $lub automatyczne wypełnianie może się nie powieść.

Jeśli nadal musisz o coś zapytać, po prostu napisz komentarz. :)

Dirk Reichel
źródło