ID tematu: 73225
|
Sumowanie liczb w wybranym zakresie |
Autor |
Wiadomość |
sp3wbe
Stały bywalec Excelforum
Wersja: Win Office 2016
Pomógł: 83 razy Posty: 383
|
Wysłany: 12-08-2022, 11: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 57 raz(y) 14.17 KB |
|
_________________ Tadek |
|
| ID posta:
419622
|
|
|
|
|
|
|
minijack
ExcelSpec
Pomógł: 210 razy Posty: 477
|
Wysłany: 12-08-2022, 11: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
|
|
|
|
|
|
umiejead
Excel Expert
Wersja: Win Office 2013
Pomógł: 977 razy Posty: 5298
|
Wysłany: 12-08-2022, 11: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
|
|
|
|
|
|
sp3wbe
Stały bywalec Excelforum
Wersja: Win Office 2016
Pomógł: 83 razy Posty: 383
|
Wysłany: 12-08-2022, 16: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
|
|
|
|
|
|
Tadek
Excel Expert
Wersja: Win Office 2010
Pomógł: 2215 razy Posty: 6110
|
Wysłany: 12-08-2022, 17: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
|
|
|
|
|
|
Waldek
Excel Expert
Wersja: Win Office 2019
Pomógł: 517 razy Posty: 2120
|
Wysłany: 12-08-2022, 20: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
|
|
|
|
|
|
sp3wbe
Stały bywalec Excelforum
Wersja: Win Office 2016
Pomógł: 83 razy Posty: 383
|
Wysłany: 13-08-2022, 10: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:
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
|
|
|
|
|
|
Maciej Gonet
Excel Expert
Wersja: Win Office 365
Pomógł: 3495 razy Posty: 10323
|
Wysłany: 13-08-2022, 10: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.
To są najprostsze warianty. Istnieją jeszcze warianty z ElseIf, które obsługują kilka warunków. |
|
| ID posta:
419649
|
|
|
|
|
|
Waldek
Excel Expert
Wersja: Win Office 2019
Pomógł: 517 razy Posty: 2120
|
Wysłany: 13-08-2022, 11: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 powinien być wyświetlany błąd #NAZWA?, bo nie ma formuły NAZWA. Podobnie jak wpiszesz , 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
|
|
|
|
|
|
Maciej Gonet
Excel Expert
Wersja: Win Office 365
Pomógł: 3495 razy Posty: 10323
|
Wysłany: 13-08-2022, 11: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
|
|
|
|
|
|
Waldek
Excel Expert
Wersja: Win Office 2019
Pomógł: 517 razy Posty: 2120
|
Wysłany: 13-08-2022, 11: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
|
|
|
|
|
|
Maciej Gonet
Excel Expert
Wersja: Win Office 365
Pomógł: 3495 razy Posty: 10323
|
Wysłany: 13-08-2022, 12: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
|
|
|
|
|
|
Waldek
Excel Expert
Wersja: Win Office 2019
Pomógł: 517 razy Posty: 2120
|
Wysłany: 13-08-2022, 12: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
|
|
|
|
|
|
|
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
|
|
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
|