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
microsoft-excel
vba
użytkownik517378
źródło
źródło
Odpowiedzi:
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.
F2
=A2
Co
G2
przychodzi=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 dopasowanieF2
w zakresieA:A
(MATCH
) i wypisuje wszystko, co jest wB:B
tym samym wierszu. (Zatrzymuje się przy pierwszym znalezionym elemencie, chociaż nie ma to znaczenia, ponieważ jest tak samo).LEN
zapobiega tylko wyświetlaniu go,#NA
jeśli łańcuch wyszukiwania jest pusty, a także pomija obliczenia całej tablicy.Co
H2
przychodzi co sugested=IF(LEN(F2),SUMIF(A:A,F2,C:C),"")
. Po prostu sumuje wszystkie wartości w kolumnie,C
które mają podaną wyszukiwarkę w kolumnieA
.LEN
-Part jest taki sam jak ten naG2
natomiast nie pokazuje się błąd, to pop0
. Jednak nadal otrzymasz zero, jeśli istnieje termin serch, a suma jest0
.Chociaż możesz po prostu automatycznie wypełniać
G2
iH2
zmniejszać tyle, ile potrzebujesz, nie zadziałaF2
. Ale możesz to zrobić za pomocą następującej formuły wF3
:Zaczyna się od
COUNTIF
tego, że po prostu zwraca tablicę binarną, podczas gdy każdy element otrzymuje a,1
jeśli pasuje do dowolnego ciągu wyszukiwania, wszystkie inne otrzymują0
(wyszukiwanie wszystkich ciągów powyżej siebieF$2:F2
). Ponieważ nie chcemy dostać już używanego przedmiotu, obracamy wszystko0
TRUE
(=0
). Nie chcemy teżempty
przedmiotu, więc też go sprawdzamy (A$2:A$1000<>""
). Mnożenie 2 tablic boolowskich jest tym samym, co posiadanieAND
dla każdej pary elementów, podczas gdy użycie wartości rzeczywistejAND
sprawdzi, czy wszystkie elementy w tablicach boura mają byćTRUE
. Jednak ponowne pomnożenie daje nam tablicę binarną zawierającą1
w każdym elemencie, który nie jest pusty i nie jest używany.MATCH
teraz sprawdza pierwszy1
i zwraca swój numer pozycji (wiersz). Ale począwszy od drugiego rzędu daje nam przesunięcie, które jest zerowane+1
. Posiadanie pozycjiINDEX
daje nam ciąg, którego potrzebujemy.IFERROR
dotyczy tylko pierwszegoempty
rozwiązania, które powróci#NA
. I poLEN
prostu 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. :)
źródło