Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 73225 Skopiuj do schowka Sumowanie liczb w wybranym zakresie
Autor Wiadomość
sp3wbe 
Stały bywalec Excelforum


Wersja: Win Office 2016
Pomógł: 48 razy
Posty: 298
Wysłany: 12-08-2022, 10:23   Sumowanie liczb w wybranym zakresie

Witam
Moi drodzy. Proszę powiedzieć czy są inne metody w VBA niż ten który umieściłem w załączonym pliku na sumowanie liczb w zakresie G2 : K8 ?

Jeżeli tak to proszę o sumę w kol "A"

sumowanie.xlsm
Pobierz Plik ściągnięto 19 raz(y) 14.17 KB

_________________
Tadek
ID posta: 419622 Skopiuj do schowka
 
 
minijack 
ExcelSpec


Pomógł: 143 razy
Posty: 338
Wysłany: 12-08-2022, 10:34   

może tak
Kod:

Sub xxx()
Dim ostw&, ostk&
ostk = ActiveSheet.Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Column
ostw = Cells(Rows.Count, 7).End(xlUp).Row

Cells(4, 1).Value = Application.Sum(Range(Cells(2, "G"), Cells(ostw, ostk)))
End Sub
ID posta: 419623 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Pomógł: 969 razy
Posty: 5280

Wysłany: 12-08-2022, 10:49   

Metoda ta sama. Trochę uprościłem:
Kod:
Sub licz()
Dim ostw&, ostk&, s As Double, i&, j&

ostk = Cells(2, Columns.Count).End(xlToLeft).Column
ostw = Cells(Rows.Count, 7).End(xlUp).Row
s = 0

For i = 2 To ostw
   For j = 7 To ostk
        s = s + Cells(i, j).Value
    Next j
Next i

Cells(4, 1).Value = s
 
End Sub
_________________
.
Jak poprawnie opisać problem: http://www.excelforum.pl/...ika-vt59262.htm
Chcesz precyzyjną odpowiedź - zadaj precyzyjne pytanie.
ID posta: 419624 Skopiuj do schowka
 
 
sp3wbe 
Stały bywalec Excelforum


Wersja: Win Office 2016
Pomógł: 48 razy
Posty: 298
Wysłany: 12-08-2022, 15:07   

Witam
Bardzo dziękuję za szybką odpowiedź.
minijack - szybkość działania Twojego rozwiązania jest chyba bezkonkurencyjna. Mało tego, z chwilą pojawienia się w tym przedziale tekstu po prostu go ignoruje.

Moje rozwiązanie i umiejead`a wywala błąd.
Na punkty zarobiliście obydwoje.

Serdecznie pozdrawiam
_________________
Tadek
ID posta: 419630 Skopiuj do schowka
 
 
Tadek 
Excel Expert


Wersja: Win Office 2010
Pomógł: 2144 razy
Posty: 5964
Wysłany: 12-08-2022, 16:42   

Kod Umiejead`a działa dla liczb, żeby pomijał "nieliczby" wystarczy ten fragment kodu:
Kod:
s = s + Cells(i, j).Value
zmienić np. na taki:
Kod:
   If IsNumeric(Cells(a, b)) Then suma(a, b) = Cells(a, b).Value
ID posta: 419631 Skopiuj do schowka
 
 
Waldek 
Excel Expert


Wersja: Win Office 2019
Pomógł: 417 razy
Posty: 1766
Wysłany: 12-08-2022, 19:49   

sp3wbe, nie napisałeś o co Ci chodzi. Inny sposób to inny sposób. Innych sposobów może być setki. W przykładzie są same liczby, więc skąd ten błąd? Jak wpiszę zamiast liczby: =NAZWA to też w przypadku propozycji minijack nie obliczy sumy. Tadek miałby rację gdyby ten kod wyglądał np. tak:
Kod:
If IsNumeric(Cells(i, j).Value) Then s = s + Cells(i, j).Value

bo chodzi o kod umiejead`a.
ID posta: 419636 Skopiuj do schowka
 
 
sp3wbe 
Stały bywalec Excelforum


Wersja: Win Office 2016
Pomógł: 48 razy
Posty: 298
Wysłany: 13-08-2022, 09:27   

Witam
Być może nie do końca wyraziłem się precyzyjnie, stąd te zawirowania.
Bardzo dziękuję za ten fragment kodu:
Kod:
If IsNumeric(Cells(i, j).Value) Then s = s + Cells(i, j).Value

Teraz działa to jak należy. Zastanawia mnie jednak fakt dlaczego nie potrzeba tego fragmentu zamknąc:
Kod:
End If

Proszę mnie oświecić.
Jak zwykle diabeł tkwi w szczegółach.
Przy większych zakresach danych kod minijack`a działa bardzo szybko.
Waldek i Tadek punkty oczywiście dodaje.

Sprawdzilem Waldku. W wyznaczonym przedziale tekst zostaje pomijany w kodzie minijacka`a i sumowane są tylko liczby.
Pozdrawiam
_________________
Tadek
ID posta: 419648 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 2828 razy
Posty: 8516
Wysłany: 13-08-2022, 09:53   

Funkcja If może mieć postać jednowierszową i wtedy nie potrzeba End If, albo wielowierszową, którą zamyka się End If.
Kod:
If ... Then ... [Else ...]

If ... Then
   ...
[Else
   ...]
End If
Nawiasy kwadratowe oznaczają tu część opcjonalną i ich nie wpisujemy.
Istotne jest czy to co po Then jest w tej samej linii, czy w następnej.
Ma tu znaczenie tzw. linia logiczna, a nie fizyczna. To znaczy, że jeśli po Then damy znak kontynuacji wiersza (spacja i znak podkreślenia), to również nie potrzeba End If, bo jest to traktowane jak jedna linia logiczna.
Kod:
If ... Then _
   ...
To są najprostsze warianty. Istnieją jeszcze warianty z ElseIf, które obsługują kilka warunków.
ID posta: 419649 Skopiuj do schowka
 
 
Waldek 
Excel Expert


Wersja: Win Office 2019
Pomógł: 417 razy
Posty: 1766
Wysłany: 13-08-2022, 10:07   

sp3wbe napisał/a:

Sprawdzilem Waldku. W wyznaczonym przedziale tekst zostaje pomijany w kodzie minijacka`a i sumowane są tylko liczby.
Pozdrawiam

Niedokładnie sprawdziłeś. Tekst pomija ale nie pomija błędnej formuły lub odwołania do formuły wyświetlającej błąd. Z tego co mi wiadomo dla formuły
Kod:
=NAZWA
powinien być wyświetlany błąd #NAZWA?, bo nie ma formuły NAZWA. Podobnie jak wpiszesz
Kod:
=SUMA(0^0)
, będzie błąd #LICZBA!.
sp3wbe napisał/a:

Przy większych zakresach danych kod minijack`a działa bardzo szybko.
Waldek i Tadek punkty oczywiście dodaje.

Jest szybszy bo korzysta z funkcji arkuszowej SUMA. Funkcje arkuszowe są z reguły szybsze od VBA, a można z niektórych korzystać w VBA.
ID posta: 419650 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 2828 razy
Posty: 8516
Wysłany: 13-08-2022, 10:24   

Nie byłoby tej całej dyskusji i ocen, który kod lepszy, gdyby pytanie było postawione precyzyjnie, a przykład był adekwatny.
Wiadomo, że sumować można tylko liczby. Więc jeśli piszemy o sumowaniu, a w przykładzie są tylko liczby, to czytający może zakładać, że w danych mogą wystąpić tylko liczby.

Jeśli może być inaczej, to trzeba to wyraźnie napisać, jakie inne rodzaje danych mogą wystąpić (teksty, puste komórki, wartości logiczne, błędy) i co w takiej sytuacji należy zrobić (zignorować, zgłosić błąd czy zastosować jakąś wartość zastępczą).
Rożne mechanizmy Excela i VBA (operatory, funkcje) w różny sposób traktują dane niestandardowe i można to w jakiś sposób wykorzystać, dobierając narzędzie odpowiednie do danych albo stosując odpowiednie warunki sprawdzające, zabezpieczające itp.
Ale każdy dodatkowy warunek pogarsza efektywność kodu, więc nie należy robić zabezpieczeń na zapas, tylko takie, które faktycznie są potrzebne.
ID posta: 419651 Skopiuj do schowka
 
 
Waldek 
Excel Expert


Wersja: Win Office 2019
Pomógł: 417 razy
Posty: 1766
Wysłany: 13-08-2022, 10:45   

Jest jeszcze inna wersja funkcji arkuszowej SUMA w zastosowaniu w VBA:
Kod:
Cells(4, 1).Value = WorksheetFunction.Sum(Range(Cells(2, "G"), Cells(ostw, ostk)))

Chyba WorksheetFunction nie jest szybsza od tej podanej przez minijack Application. Dla błędnej formuły w zakresie sumowania wyświetla błąd kodu VBA a nie tak jak Application, którego wynikiem nie jest suma tylko rodzaj błędu wpisany do komórki. Podobno WorksheetFunction ma większe możliwości w przypadku sumowania tablicowego.
ID posta: 419652 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 365
Pomógł: 2828 razy
Posty: 8516
Wysłany: 13-08-2022, 11:16   

Pisaliśmy kiedyś o tym na Forum. Wersja z samym Application jest starsza, nieco wolniejsza, ale za to nieco mniej restrykcyjna względem danych niestandardowych. Szczególnie dotyczy to przypadku gdy chcemy użyć tablicy w miejscu, gdzie typowo powinna być pojedyncza wartość.
Obie wersje w różny sposób obsługują błędy. Jedna generuje błąd VBA, a druga zwraca arkuszową wartość błędu.
ID posta: 419654 Skopiuj do schowka
 
 
Waldek 
Excel Expert


Wersja: Win Office 2019
Pomógł: 417 razy
Posty: 1766
Wysłany: 13-08-2022, 11:46   

Pomyliło mi się, WorksheetFunction jest szybsza ale mniej funkcjonalna.
Czyli najszybszy byłby taki kod:
Kod:
Sub xxx()
Dim ostw&, ostk&
On Error GoTo blad
ostk = ActiveSheet.Cells(2, ActiveSheet.Columns.Count).End(xlToLeft).Column
ostw = Cells(Rows.Count, 7).End(xlUp).Row
Cells(4, 1).Value = WorksheetFunction.Sum(Range(Cells(2, "G"), Cells(ostw, ostk)))
Exit Sub
blad:
Cells(4, 1).Value = "Błąd"
End Sub
ID posta: 419657 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.wip.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe