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
|
|
|
 |
|
|
|
ąćęłńóś
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
|
|
|
 |
|
|
Artik
Artik


Wersja: Win Office 365
Posty: 10702
|
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 instrukcjana 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.
Weryfikator NIP - szybka, masowa weryfikacja w MF i VIES. |
|
 | ID posta:
398454
|
|
|
 |
|
|
sanctus
Stały bywalec Excelforum

Posty: 350
|
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
|
|
|
 |
|
|
Rafał B.
ExcelSpec


Wersja: Win Office 2016
Posty: 421
|
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. |
_________________ Częstym błędem jest zakładanie, że autorzy niezrozumiałego kodu będą w jakiś sposób potrafili wyrazić się jasno i klarownie w komentarzach. Kevlin Henney |
|
 | ID posta:
398475
|
|
|
 |
|
|
umiejead
Excel Expert

Wersja: Win Office 2013
Posty: 5298
|
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
|
|
|
 |
|
|
bodek

Wersja: Win Office 2019
Posty: 3109
|
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
Zatem "bezkarnie" używasz długich nazw dla swoich zmiennych. |
|
 | ID posta:
398477
|
|
|
 |
|
|
Rafał B.
ExcelSpec


Wersja: Win Office 2016
Posty: 421
|
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... |
_________________ Częstym błędem jest zakładanie, że autorzy niezrozumiałego kodu będą w jakiś sposób potrafili wyrazić się jasno i klarownie w komentarzach. Kevlin Henney |
|
 | ID posta:
398485
|
|
|
 |
|
|
umiejead
Excel Expert

Wersja: Win Office 2013
Posty: 5298
|
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
|
|
|
 |
|
|
bodek

Wersja: Win Office 2019
Posty: 3109
|
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
|
|
|
 |
|
|
master_mix
Excel Expert


Wersja: Win Office 365
Posty: 2377
|
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
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ę
Reprezentacja danych w pamięci.pdf
|
Pobierz Plik ściągnięto 82 raz(y) 145.7 KB |
|
_________________
Podejmę współpracę (pracę)
Programowanie C#, Android, iOS, VB.NET, VBA, ASP.NET Core, WPF, Xamarin, Power Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie. |
|
 | ID posta:
414212
|
|
|
 |
|
|
Artik
Artik


Wersja: Win Office 365
Posty: 10702
|
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.
Weryfikator NIP - szybka, masowa weryfikacja w MF i VIES. |
|
 | ID posta:
414234
|
|
|
 |
|
|
master_mix
Excel Expert


Wersja: Win Office 365
Posty: 2377
|
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 Platforms, XAML, MVC, LINQ, Entity Framework. Bazy danych SQL Server, Oracle, MySQL, Firebird
Wrocław i okolice …lub zdalnie. |
|
 | ID posta:
414242
|
|
|
 |
|
|
|
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
|