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
Przesunięty przez: bodek
17-02-2021, 20:18
65. Brak deklaracji zmiennych - konsekwencje?
Autor Wiadomość
MaxRebo 
Świeżak


Posty: 5
Wysłany: 17-01-2021, 00:19   65. Brak deklaracji zmiennych - konsekwencje?

Cześć,

ostatnio pisałem rozbudowane makro wyświetlające dużo różnych UserFormów. Po skończeniu go uświadomiłem sobie, że zaniechałem deklarowanie zmiennych. W większości kodu program po prostu pobiera wartości z kontrolek (np. ComboBoxów) i wkleja te wartości do innego pliku Excela. Docelowy arkusz, do którego makro wstawia wartości, też nie jest zadeklarowany:
"Dim nazwa as Worksheet"

Kompletnie zapomniałem o deklaracjach, a mimo to makro wykonuje się poprawnie. Zastanawiam się, czy warto byłoby te deklaracje zmiennych dopisać - chociaż się waham, bo byłoby to czasochłonne, jako że kodu jest dużo.

I tutaj moje pytanie: jakie są konsekwencje braku deklaracji zmiennych? Czy powinienem się tym martwić?
ID posta: 398451 Skopiuj do schowka
 
 
ąćęłńóś
ExcelSpec


Posty: 1647
Wysłany: 17-01-2021, 01:01   

Jak zwykle, będziesz mieć odpowiedzi z dwóch szkół: Falenickiej i Otwockiej.

Czym grozi ? Wszystkim i Niczym, a nawet tym czym chcesz lub czego nie chcesz.

Pytanie jest inne ... Jak starasz się traktować swoją pracę ?

Tak sobie ("leży mi to", "zwisa mi to", "mam to gdzieś")
Średnio ("dla siebie panie robie to dobrze, ale to nie dla mnie")
Rzetelnie ("i dla siebie i dla innych staram się w miarę dobrze")
Pedantycznie ("wzorem mnichów z Szaolin") => wstęp do programowania w innych językach, które będą mniej "wyrozumiałe" niż VB/VBA

... i dla kogo ona ma być/czy ktoś będzie jeszcze po tobie sprawdzać/poprawiać ?
ID posta: 398453 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Posty: 10652
Wysłany: 17-01-2021, 01:07   

Sorry, że nie reprezentuję żadnej szkoły. Bo żadnej z nich nie kończyłem. :-)

MaxRebo napisał/a:
jakie są konsekwencje braku deklaracji zmiennych?
Przede wszystkim kod wykonuje się wolniej, bo zmienne typu Variant są najwolniej działającymi.
Dobrą zasadą jest wymuszanie na sobie deklarowania zmiennych przez zaznaczenie w edytorze VBA Tools/Options/zakładka Editor pola wyboru "Require Variable Declaration". W nowych projektach pojawiać się wtenczas będzie instrukcja
Kod:
Option Explicit
na początku każdego modułu. W starych projektach musisz ją dodać ręcznie. Z jednej strony przymusza Cię do deklarowania, a z drugiej zabezpiecza przed literówkami oraz próbą przypisania niewłaściwej wartości do zdefiniowanego typu. Znasz to uczucie kiedy patrzysz sto razy na ten sam fragment kodu i nie widzisz, że jedna ze zmiennych jest nieco inna od oczekiwanej? Nie? To jak posiedzisz kiedyś parę godzin nad poszukiwaniem błędu w swoim kodzie to będziesz wiedział o czym mówię. :-)
Brak deklaracji zmiennych, przy jednoczesnym braku na początku modułu instrukcji Option Explicit powoduje, że taka zmienna przyjmie typ Variant. Typ najbardziej pojemny, ale zarazem najwolniej działający. Dopiero w trakcie wykonywania kodu maszyna nada zmiennej odpowiedni podtyp zależny od wartości, która jest przypisywana zmiennej.
Konsekwencje braku deklaracji możesz zauważyć na poniższym kodzie. Co prawda wszystkie zmienne są zadeklarowane, ale druga grupa zmiennych to same Variant-y.
Kod:
Sub AAAA()
    Dim a           As String
    Dim b           As String
    Dim c           As Variant
    '---------------
    Dim i           As Variant
    Dim j           As Variant
    Dim k           As Variant

    a = 2
    b = "3"
    c = a + b
    MsgBox c
    '===============
    i = 2
    j = "3"
    k = i + j
    MsgBox k
End Sub
Przykład trochę słaby, ale nie wymyśliłem na prędce lepszego. Bo tak na prawdę winnym jest znak "+", który jest dopuszczony do operacji łączenia łańcuchów tekstowych (przy okazji, do łączenia łańcuchów zawsze używaj "&").

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 398454 Skopiuj do schowka
 
 
sanctus 
Stały bywalec Excelforum


Posty: 325
Wysłany: 17-01-2021, 11:23   

Taka funkcja wykonuje się w 2ms dla tablicy double o wielkości 47k rekordów.
Jeśli zadeklaruję wszystkie zmienne jako variant czas wyniesie ok 12ms.
6 x dłużej.

Kod:

Function Roc(Array1() As Double, Periods As Integer)

    'Stop zwrotu w ujeciu %
    Dim Result() As Double
    Dim i As Long
    Dim First As Integer
    First = LBound(Array1) + Periods
   
    On Error Resume Next
    ReDim Result(First To UBound(Array1))

    For i = First To UBound(Array1)
        Result(i) = (Array1(i) / Array1(i - Periods) - 1) * 100
    Next
   
    Roc = Result
End Function
ID posta: 398464 Skopiuj do schowka
 
 
Rafał B.
Stały bywalec Excelforum



Wersja: Win Office 2016
Posty: 348
Wysłany: 17-01-2021, 13:41   

To ja jeszcze dodam kolejny argument poza już bardzo ważnymi jak (1) literówki (2)szybkość działania kodu. Tym argumentem są podpowiedzi "IntelliSense" w VBE.

Chcesz powiedzmy programowo dodać poprawność danych do komórki A1 bieżącego arkusza. Zrób to bez patrzenia do dokumentacji i bez deklarowania zmiennych. Dajmy na to, że używasz jakiejś zmiennej typu Range.
Kod:
   Set rng = Range("A1")
       rng.   ' ...i co dalej?

Domyślasz się, że może poprawność danych to może coś z Validation.

Kod:
   Set rng = Range("A1")
       rng.Validation.   ' ...i co dalej?

Jak ją dodać? .New, .Add, .Create...?
Jesteś sprytny i najlepiej pasuje Ci .Add.
Kod:
   Set rng = Range("A1")
       rng.Validation.Add   ' ...i co dalej?


Dalej już nie masz pojęcia jakie argumenty, jakie stałe oferuje VBA.

----------------------------------------------------------
A teraz to samo linijką deklaracji. Upewniamy się, ze mamy włączoną opcję:
Tools->Editor->Auto list members.

Kod:
   Dim rng As Range
   Set rng = Range("A1")
       rng.   

Tym razem po dodaniu tej niepozornej kropeczki od razu pojawiają się podpowiedzi edytora VBE ze wszystkimi metodami i właściwościami obiektu typu Range. Faktycznie na samym końcu tej listy jest Validation.
Kod:
   Dim rng As Range
   Set rng = Range("A1")
       rng.Validation.   

Tym razem nie mamy wątpliwości- edytor od razu podsunie nam metodę .Add i zasugeruje wszystkie parametry. Piszesz ładniej i szybciej duże fragmenty kodu nie bawiąc się myszą (podpowiedzi wybierasz strzałkami góra-dół i akceptujesz TABem). Oczywiście dokumentację warto znać, ale później nie musisz za każdym razem do niej sięgać, podpowiedzi edytora prowadzą Cię same.

Zaznacz koniecznie wymuszanie Option Explicit, jak opisał @Artik. Przez kilka dni będzie to dla Ciebie upierdliwe. Ale czas poświęcony na deklaracje zwróci się z nawiązką błyskawicznie. Nie ma dobrych, ani nawet "średnio dobrych" koderów VBA bez włączonej tej opcji w edytorze.
_________________
Abstrahując od języka: główną przyczyną niesławnego marnego poziomu jest prawdziwość wstydliwego stereotypu, że statystyczny programista VBA od ćwierć wieku czyta jedynie kod innych programistów dialektów Visual Basic.
ID posta: 398475 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Posty: 5073

Wysłany: 17-01-2021, 13:51   

Ta ja jeszcze doprecyzuję: Tools->Options...->Editor->Auto list members.
.
_________________
.
Jak poprawnie opisać problem: http://www.excelforum.pl/...ika-vt59262.htm
Chcesz precyzyjną odpowiedź - zadaj precyzyjne pytanie.
ID posta: 398476 Skopiuj do schowka
 
 
bodek 


Wersja: Win Office 2019
Posty: 3035
Wysłany: 17-01-2021, 13:54   

To i ja dorzucę swoje 3 grosze
Deklarując zmienną nadajesz jej jakąś nazwę, która określa co ta zmienna ma reprezentować np:
Kod:
dim Ostatni_Wiersz_W_Arkuszu_Temp as Long

coś tam dziubiesz i chcesz użyć tej zmiennej w kodzie, zaczynasz pisać ost, wciskasz Ctrl + spacja i bingo, masz wpisane lub listę do wyboru :mrgreen:
Zatem "bezkarnie" używasz długich nazw dla swoich zmiennych.
ID posta: 398477 Skopiuj do schowka
 
 
Rafał B.
Stały bywalec Excelforum



Wersja: Win Office 2016
Posty: 348
Wysłany: 17-01-2021, 16:00   

Mały vox populi: może warto byłoby temat po jakimś małym oczyszczeniu podwiesić? I spamować autorów pytań z kodem bez deklaracji... :mrgreen:
_________________
Abstrahując od języka: główną przyczyną niesławnego marnego poziomu jest prawdziwość wstydliwego stereotypu, że statystyczny programista VBA od ćwierć wieku czyta jedynie kod innych programistów dialektów Visual Basic.
ID posta: 398485 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Posty: 5073

Wysłany: 17-01-2021, 17:27   

Ad 1. Jest weekend (ze wskazaniem na "end") - ale część osób może jeszcze odpoczywać - poczekajmy do któregoś dnia roboczego.
Ad 2. Deklarowanie zmiennych jest opcją (tak: dobry zwyczaj) - ale tylko opcją i nie widzę powodu do "spamowania" użytkowników którzy z niej nie korzystają.
.
_________________
.
Jak poprawnie opisać problem: http://www.excelforum.pl/...ika-vt59262.htm
Chcesz precyzyjną odpowiedź - zadaj precyzyjne pytanie.
ID posta: 398487 Skopiuj do schowka
 
 
bodek 


Wersja: Win Office 2019
Posty: 3035
Wysłany: 17-02-2021, 20:34   

Rafał B. napisał/a:
może warto byłoby temat po jakimś małym oczyszczeniu podwiesić?
Podwiesiłem w FAQ

edit:
jeszcze kolejna, czasami przydatna, korzyść. Deklarując zmienną od momentu inicjacji procedury nadajemy jej wartość zgodną z deklaracją (zero, "", empty, nothing ...) , jak nie ma deklaracji to tylko empty.
Można to ewentualnie wykorzystać.
ID posta: 400570 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Posty: 2141
Wysłany: 06-02-2022, 23:28   

Fajny temat podwiesiliście.\

Właściwie ze wszystkim się zgadzam z Wami

plusy deklarowania:
intellisense
szybkość pisania kodu
łatwość czytania kodu
mniej pomyłek
itd

Jednak z jednym nie mogę się z Wami zgodzić, mam takie prawo i się: Nie Zgadzam :niee

Variant nie jest powolny ani pojemy.
Varian właściwie na początku jest typem wartościowym z możliwością typu referencyjnego ,
Rezerwuje 16 bajtów pamięci umieszczone na stosie.
Śmiało można deklarować Varianty bez obawy o pojemności i szybkości.
O szybkość i pojemność należy się martwić w momencie planowania jakie typy danych w kodzie będziemy używać, niezależnie czy w deklaracji są określone czy nie.
Dokładne określenie typu danych przy deklaracji pomaga w panowaniu nad typem przypisywanym do zmiennej, co oczywiście polecam (Artur o tym wspomniał).

Gdzie podzialiście mój artykuł o przechowywaniu danych w pamięci? ://
Wiem że stary z 2013...pewnie coś bym w nim pozmieniał i dodał, ale na razie nie planuję wracać do tematu...
(zamieszczam w załączniku)

p.s.
@Sanctus, jeżeli robisz jakieś testy to rób na konkretnych typach danych, nie mieszaj referencyjnych i wartościowych.
coś typu:
Kod:
Sub testDouble()

Dim tmStart As Double
Dim tmStop As Double
Dim x As Double
Dim zmienna As Double

tmStart = Timer
For x = 1 To 50000 Step 0.1
zmienna = x
zmienna = zmienna + 0.2
Next

tmStop = Timer
Debug.Print tmStop - tmStart

End Sub



Sub testVariant()

Dim tmStart
Dim tmStop
Dim x
Dim zmienna

tmStart = Timer
For x = 1 To 50000 Step 0.1
zmienna = x
zmienna = zmienna + 0.2
Next

tmStop = Timer
Debug.Print tmStop - tmStart

End Sub



Artik napisał/a:
Sorry, że nie reprezentuję żadnej szkoły. Bo żadnej z nich nie kończyłem. :-)Artik

Taaaa, Arturo przecież wiem że klaszor Szaolin i w dodatku tajną sekcję :beer

Reprezentacja danych w pamięci.pdf
Pobierz Plik ściągnięto 31 raz(y) 145.7 KB

_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Apps, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 414212 Skopiuj do schowka
 
 
Artik 



Wersja: Win Office 365
Posty: 10652
Wysłany: 07-02-2022, 19:11   

master_mix napisał/a:
Gdzie podzialiście mój artykuł o przechowywaniu danych w pamięci?
Pierwotnie był w dziale dla uczestników zlotów (i tylko dla nich). Ale, że nam właściciel wyriezał wszystkie załączniki, to tylko cień po artykule pozostał. Fajnie, że go przywołałeś.
master_mix napisał/a:
Kod:
Dim tmStart As Double
Dlaczego Double skoro Timer zwraca Single?
master_mix napisał/a:
klaszor Szaolin
A kto mnie tam szkolił jak nie Ty? Buty bym Ci chętnie wyczyścił. :-)

Artik
_________________
Persistence is a virtue in the world of programming.
ID posta: 414234 Skopiuj do schowka
 
 
master_mix 
Excel Expert



Wersja: Win Office 365
Posty: 2141
Wysłany: 08-02-2022, 01:04   

Artik napisał/a:
Dlaczego Double skoro Timer zwraca Single?

Właściwie to nic szczególnego.
Obie zmiennoprzecinkowe tylko innej precyzji a nie jestem oszczędny i zazwyczaj deklaruję jako Double, a całkowite jako Long - z rozpędu :-)
_________________

Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Apps, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie.
ID posta: 414242 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