• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

VBA - Sumowanie danych w tabeli mających tą samą nazwę

Object Storage Arubacloud
+1 głos
535 wizyt
pytanie zadane 6 listopada 2021 w Visual Basic przez Kinga Nowicjusz (210 p.)

Witam,

od pewnego czasu pracuję nad zestawieniem w programie Excel, w którym zawarte mam dane kontrahentów (nazwę kontrahenta, wartość sprzedaży). Chciałabym przy wykorzystaniu języka Visual Basic móc zsumować wszystkie dane dla kontrahenta, np. "Kowalski" i aby wynik w/w sumowania ukazał się w komórce obok. Próbowałam wykorzystać do tego funkcję SumIf, z tym że uruchomiony program nie robi kompletnie nic. Bardzo proszę o informację co robię źle, że program nie chce zadziałać. Z góry bardzo dziękuję za pomoc.

         A                  B

KOWALSKI 2264
KOWALSKI 344
KOWALSKI 4585
KOWALSKI 1232
NOWAK 23455
STRZELCZYK 4844
Sub zsumujDane()

Dim wynikSumy As Long

wynikSumy = Range("E1").Value

wynikSumy = Application.WorksheetFunction.SumIf(Range("A1:A6"), "KOWALSKI", Range("B1:B6"))

End Sub

 

2 odpowiedzi

+1 głos
odpowiedź 8 listopada 2021 przez VBService Ekspert (253,340 p.)
edycja 9 listopada 2021 przez VBService

Najpierw oblicz sumę za pomocą funkcji SumIf, czyli

Sub zsumujDane() 
    Dim wynikSumy As Long

    wynikSumy = Application.WorksheetFunction.SumIf(Range("A1:A6"), "KOWALSKI", Range("B1:B6"))
    wynikSumy = Range("E1").Value 
End Sub

teraz przypisz wartość obliczoną, którą "przechowuje" zmienna wynikSumy do komórki E1, czyli

Sub zsumujDane() 
    Dim wynikSumy As Long

    wynikSumy = Application.WorksheetFunction.SumIf(Range("A1:A6"), "KOWALSKI", Range("B1:B6"))
    Range("E1").Value = wynikSumy
End Sub

 

 

 

P.S. "Podkręciłem" trochę Twój kod VBA,

  • teraz możesz dopisywać więcej linii (wierszy) bez potrzeby zmiany kodu
  • podwójne kliknięcie lewym przyciskiem myszki w nazwisko wywołuje SumIf z nazwiskiem, które znajduje się w komórce
     

 

zapisz ten kod w (edytora VBA - Alt + F11 )
 

 


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not IsEmpty(Target.Value) And Target.Column = 1 Then
        zsumujDane (Target.Value)
        Cancel = True
    End If
End Sub

Sub zsumujDane(ByVal name As String)
    Dim wynikSumy As Long
    Dim wynik, ostatni_wiersz As String
 
    ostatni_wiersz = CStr(Cells(Rows.Count, 1).End(xlUp).Row)
 
    wynikSumy = WorksheetFunction.SumIf(Range("A1:A" + ostatni_wiersz), name, Range("B1:B" + ostatni_wiersz))
    wynik = " " + name + ": " + CStr(wynikSumy)
    
    Range("E1").Value = wynik
    Range("E1").ColumnWidth = Len(wynik) + 2
End Sub

 

komentarz 10 stycznia 2022 przez Kinga Nowicjusz (210 p.)

Bardzo dziękuję za pomoc :)

Przez ten czas udało mi się trochę rozwinąć mój kod, z tym że napotkałam nowy problem, a mianowicie w pliku Excel mam dwa arkusze: z zestawieniem, z bazą. Zrobiłam pętlę for, która przeszukuje mi oba arkusze w poszukiwaniu danych o takiej samej nazwie i następnie sumuje ich wartości za pomocą funkcji sumif. Aktualnie próbuję wprowadzić instrukcję warunkową, z tym że najwidoczniej coś robię źle, ponieważ wyskakuje mi okienko z błędem "Run-time error '13': Type mismatch" i kod niestety nie wykonuje się, a ja stoję przez to w miejscu, ponieważ nie jestem w stanie tego rozwiązać. Będę bardzo wdzięczna za pomoc i z góry ogromnie za nią dziękuję:)

Dim sheetBaza As Worksheet
Dim lastRow As Long
Dim i As Long

Set sheetBaza = Worksheets("BAZA")
lastRow = Cells(Rows.Count, "D").End(xlUp).Row

For i = 3 To lastRow
If sheetBaza.Range("L:L") = "WEDLINA" Then
Cells(i, 6) = WorksheetFunction.SumIf(sheetBaza.Range("D:D"), Cells(i, 4), sheetBaza.Range("O:O"))
Else: Cells(i, 6) = ""
End If
Next i

 

komentarz 10 stycznia 2022 przez VBService Ekspert (253,340 p.)

Tutaj powinien być typ String

Cells(i, 6) = ...

ponieważ ten zapis jest domyślny i mógłby wyglądać tak

Cells(i, 6).Value = ...

SumIf zwraca Long-a

myślę, że taki zapis powinien "załatwić" sprawę  ( CStr() )

Cells(i, 6) = CStr(WorksheetFunction.SumIf(sheetBaza.Range("D:D"), Cells(i, 4), sheetBaza.Range("O:O")))

 

komentarz 18 stycznia 2022 przez Kinga Nowicjusz (210 p.)
Wprowadziłam zaproponowaną przez Pana zmianę, jednak w dalszym ciągu w momencie pojawienia się błędu "Run-time error '13': Type mismatch" podświetla mi na żółto wiersz z użytą przeze mnie instrukcją warunkową :( Jeszcze raz spróbuję wyjaśnić co chciałabym uzyskać w zestawieniu.

W pliku posiadam dwa arkusze: I - ogólne zestawienie, II - baza danych. W zestawieniu arkusza I w kolumnie "D" widnieją nazwy kontrahentów. Pętla przeszukuje mi arkusz II (baza) i znajduje wszystkich kontrahentów o takiej samej nazwie, jak w arkuszu I. Po odszukaniu ich używam instrukcji warunkowej, która mówi, że jeśli w kolumnie "L" arkusza II są wiersze z nazwą "WEDLINA" to należy wziąć wszystkie wiersze z w/w nazwą, zsumować ich wartość netto znajdującą się w kolumnie "O" (arkusz II) za pomocą funkcji SumIf i wprowadzić uzyskane wyniki sumowania pod odpowiednich kontrahentów w arkuszu I.

Z góry bardzo dziękuję za pomoc i przepraszam, że tyle czasu nie mogę uporać się z tym problemem ;)
0 głosów
odpowiedź 7 listopada 2021 przez overcq Pasjonat (21,710 p.)

Program oblicza wynikSumy, tylko nie przypisujesz tego wyniku do komórki E1, a zamiast tego, wcześniej, przypisujesz wartość tej komórki.

Podobne pytania

0 głosów
1 odpowiedź 413 wizyt
0 głosów
2 odpowiedzi 535 wizyt
pytanie zadane 3 lipca 2016 w Visual Basic przez bober4 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 28 czerwca 2018 w Systemy operacyjne, programy przez Radek Begej Użytkownik (580 p.)

92,568 zapytań

141,422 odpowiedzi

319,642 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...