Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel, zautomatyzowanie pętli [VBA]

Maciek_xyv 14 Gru 2011 19:13 1541 3
  • #1 14 Gru 2011 19:13
    Maciek_xyv
    Poziom 7  

    Witam.
    Po długich i żmudnych działaniach udało mi się stworzyć pierwszą działającą pętle w Excelu. Sukces! ale nie do końca. Chciałbym alby ta pętla działała automatycznie. a do tego już nie wiem jak się zabrać. Zgłaszam się z pomocą.

    Kod wygląda tak:

    Kod: VB
    Zaloguj się, aby zobaczyć kod



    I jeszcze jedno pytanie czy to ".Value" jest potrzebne i co to jest?
    Bo bez tego też działa.:)

    0 3
  • #2 15 Gru 2011 11:53
    adamas_nt
    Moderator Programowanie

    1) Klikając przycisk wiesz co liczysz. Możesz to wrzucić w kod arkusza i podpiąć do jakiegoś zdarzenia, ale obliczenia "pójdą" przy każdym wybranym zdarzeniu. Musiałbyś wprowadzić jakieś ograniczenia/warunki.
    Tu uwaga: Obliczenia lepiej wykonywać na zmiennych i dopiero gotowy wynik zapisywać w komórce.

    2) Range().Value oznacza, że interesuje Cię wartość komórki/zakresu (nie format, rozmiar, kolor, czcionka, etc). Jako domyślna nie musi być zapisana. Aczkolwiek wskazane, stanowi dobry nawyk (z czym osobiście mam kłopot :) ) i ułatwia późniejszą analizę kodu, szczególnie przy większych projektach.

    0
  • #3 15 Gru 2011 12:17
    Maciek_xyv
    Poziom 7  

    ok, podpiąć do jakiegoś zdarzenia znaczy np. że przy zmianie w komórce D4 lub D7 bo te są wykorzystywane do obliczania G6 czyli interesującego mnie wyniku, będzie wykonywana pętla? i właśnie to by mnie interesowało:)

    znalazłem gdzieś coś takiego:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0) = "D4" or .... then

    i niby wklejając to do kodu działa przy zmianie we wskazanej komórce, tylko nie wiem co oznacza "ByVal Target As Range" i co oznaczają te zera "(0, 0)"

    aha i jeszcze co do warunków ograniczających.. chodzi o zabezpieczenie przed pętlą nieskończoną? w tym wypadku chyba taka nigdy nie będzie miała miejsca.

    0
  • Pomocny post
    #4 15 Gru 2011 12:49
    marcinj12
    Poziom 40  

    Możesz też użyć takiego zapisu, chyba częściej spotykany, tylko należy pomiętać o dolarach w adresie komórki:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Target to nazwa zmiennej typu Range, reprezentująca komórkę, w której nastąpiło zdarzenie (zmiana). Jak wpiszesz kropkę po słowie Target, podpowie Ci się cała lista właściwości tej komórki, m.in. Address - adres komórki, Value - wartość w komórce etc.

    Pętli której użyłeś nieskończony warunek nie grozi, prędzej bym się obawiał przekroczenia zakresu deklarowanych zmiennych (Integer ma od -32767 do 32768 czy coś koło tego). Jeżeli w komórkę D4 wpiszesz liczbę spoza tego zakresu, dostaniesz błąd Overflow. Możesz użyć typu Long, co znacznie rozszerzy ten zakres, lub nie deklarować ich w ogóle / zadeklarować je jak Variant, pozwalając kompilatorowi (?) samemu dobrać odpowiedni typ. Teoretycznie będzie to mniej wydajne niż bezpośrednia deklaracja, jednak w praktyce nie powinieneś zauważyć różnicy.

    PS. Żeby uniknąć niepotrzebnego wywoływania zdarzenia OnChange, lepiej na potrzeby pętli stworzyć dodatkową zmienną na której operujesz (typu Variant lub Double - żeby uwzględnić operację dzielenia mogącego dać liczbę z przecinkiem), i na końcu jej wartość przypisać do komórki. Również uniknąłbym każdorazowego odwoływania się do komórki D7, zakładając, że jej wartość się nie zmienia w trakcie wykonywania pętli.
    Tj. ja tą pętlę bym przedstawił w ten sposób:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0