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


Posty: 1560
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: 10242
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: 295
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.
Exceloholic



Wersja: Win Office 2016
Posty: 237
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.
_________________
Jest niemal niemożliwe nauczenie dobrego programowania uczniów, którzy byli narażeni na kontakt z BASIC: jako potencjalni programiści są okaleczeni, bez nadziei na poprawę. (Edsger Dijkstra, pionier informatyki).
Po części dotyczy również VBA.
ID posta: 398475 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Posty: 4158
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: 2879
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.
_________________
Szkolenia z Excela, Power Query, Power Pivot, wizualizacje danych w Excelu, szkolenia online
ID posta: 398477 Skopiuj do schowka
 
 
Rafał B.
Exceloholic



Wersja: Win Office 2016
Posty: 237
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:
_________________
Jest niemal niemożliwe nauczenie dobrego programowania uczniów, którzy byli narażeni na kontakt z BASIC: jako potencjalni programiści są okaleczeni, bez nadziei na poprawę. (Edsger Dijkstra, pionier informatyki).
Po części dotyczy również VBA.
ID posta: 398485 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Posty: 4158
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: 2879
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
_________________
Szkolenia z Excela, Power Query, Power Pivot, wizualizacje danych w Excelu, szkolenia online
ID posta: 400570 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.marketingNET.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