Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[VBA Excel] - szybka zmiana warosci zakresu (takze tych ukrytych komorek)

tomek-hp13 27 Jun 2014 10:00 1419 8
  • #1
    tomek-hp13
    Level 9  
    Witam,

    otrzymalem od was pomoc juz kilkakrotnie za co jestem bardzo wdzieczny!

    Moj nowy problem polega na tym:
    jak zrobic szybkie makro ktore zmienia wartosci zakresu komorek (Range)
    na zadana wartosc, SZYBKO I NIE POMOJAJAC UKRYTYCH WARTOSCI ?

    mam 2 proste makra, z tym ze:



    pierwsze makro "clearall" dziala strasznie wolno... zmienia wartosci komorek na wartosc "NO" pojedynczo i przy 5000 komorek trwa to okolo minuty, a docelowa ilosc komorek to moze nawet 100000 wiec nie jest to zbyt optymalnie rozwiazanie.

    Code: vb
    Log in, to see the code


    Moje inne makro zmienia wartosci na "NO" ale dziala tylko na widocznych komorkach (pomija ukryte, co niestety mija sie z celem)
    Dziala za to natychmiastowo (ponizej 1sec)

    Code: vb
    Log in, to see the code


    najchetniej uzyl bym tego drugiego makra z jakims dopiskiem w stylu
    HiddenCells = Ture
    ale nie mam pojecia jak i gdzie

    pomozecie?
  • #2
    marcinj12
    Level 40  
    Dwie propozycje na update tych makr:
    Code: vb
    Log in, to see the code


    Code: vb
    Log in, to see the code
  • #3
    tomek-hp13
    Level 9  
    Witam, dzieki za chec pomocy,

    a wiec to pierwsze nie zmienia ukrytych wartosci
    a w tym drugim otrzymuje blad na "ShowAllData"

    Code: vb
    Log in, to see the code


    Dodano po 8 [minuty]:

    ta pierwsza opcja bziala bardzo dziwnie

    Code: vb
    Log in, to see the code


    faktycznie zmienia wszystkie (nawet ukryte wartosci)
    z tym ze od nich zalezne sa inne wartosci w innych komorkach,

    wenn AC5="NO" itd... to one nawet tego nie zauwazaja ze ta opcja sie zmienila

    a te dane sa kluczowe (chodzi o to ze jak jest YES to dany wiersz jest obrabiany, a jak "NO" to nie jest, z tym ze ta opcja zmienia to na "NO" w taki sposob ze inne komorki tego nie widza, wiec jest "NO" ale nie dziala

    Dodano po 16 [minuty]:

    HA!

    obszedlem problem, to znacz problem zostal, ale jest zminimalizowany...
    (rozwiazanie przydalo by sie miomo to)

    dodalem jeszcze jedna kolumne ktora jak w komorce obok jest "YES" to zwraca numer wiersza, a na samej gorze zwracana jest maksymalna wartosc jaka znajduje sie w tych komorkach, czyli max wiersz w ktorym jest "YES"

    i moj skrypt zmieniajacz zawartosc na "NO" dziala tylko do TEJ ilosci wierszy, a nie jak to bylo do tej pory do 5000, z tym ze jak to bedzie 5000, to i tak bede w "czarnej d...e" bo to bedzie trwalo...
  • #4
    marcinj12
    Level 40  
    tomek-hp13 wrote:
    to one nawet tego nie zauwazaja ze ta opcja sie zmienila
    A nie zapomniałeś włączyć na końcu przeliczeń automatycznych xlCalculationAutomatic ?
    tomek-hp13 wrote:
    a w tym drugim otrzymuje blad na "ShowAllData"
    Jeżli umieściłeś makro w module a nie na arkuszu, musisz dodać ActiveSheet albo odwołać się do konkretnego arkusza:
    Code: vb
    Log in, to see the code
  • #5
    tomek-hp13
    Level 9  
    co do tego to rozwala mi filtr, a jak sie ma kilak tysiecy wiersz i wyfiltrowane np 50 weirszy (za pomoca roznych filtrow) to nagle jest abrakadabra i nie wiesz na co patrzysz :) to odpada

    Code: vb
    Log in, to see the code


    a co do tego:
    "A nie zapomniałeś włączyć na końcu przeliczeń automatycznych xlCalculationAutomatic ?"

    to wpis znajduje sie dokladnie tam gdzie jest w zaproponowanym kodzie, a powinien byc na koncu?

    Dodano po 5 [minuty]:

    a inne pytanie:

    a jak by w tym kodzie

    Code: vb
    Log in, to see the code


    a dokladnie tutaj

    Code: vb
    Log in, to see the code


    zmienic zeby nie zmienal tej wartosci, tylko zeby zmienial ta wartosc JEZELI jest ona rozna od "NO"

    to moze dzialalao by to szybciej, niestety warunek w makrze to juz za wysokie progi na moje... mozliwosci
  • Helpful post
    #6
    Antares64
    Level 11  
    marcinj12 miał na myśli ponowne włączenie automatycznego przeliczania arkusza, bo:

    Application.Calculation = xlCalculationManual

    włącza przeliczanie ręczne (defaultowo - klawisz F9), żeby przyspieszyć podmienianie wartości w komórkach.

    Tak więc po wykonaniu całej pętli powinieneś na nowo włączyć przeliczanie automatyczne, tj:

    Application.Calculation = xlCalculationAutomatic
  • #7
    tomek-hp13
    Level 9  
    OK UDALO SIE !!!!

    Code: vb
    Log in, to see the code


    makro nawet jak obrabia 1000000 wierszy to czas potrzebny na zmiane zalezny jest nie od ilosci owych wierzy tylko od ilosci zmian jakie musi wykonac, czyli jak jest 100 wierszy z napisem YES i 1000000 z napisem NO, to obrabia tylko te 100 i to idzie piorunem :)

    Dzieki za pomoc!!!

    Dodano po 1 [minuty]:

    Antares64 wrote:
    marcinj12 miał na myśli ponowne włączenie automatycznego przeliczania arkusza, bo:

    Application.Calculation = xlCalculationManual

    włącza przeliczanie ręczne (defaultowo - klawisz F9), żeby przyspieszyć podmienianie wartości w komórkach.

    Tak więc po wykonaniu całej pętli powinieneś na nowo włączyć przeliczanie automatyczne, tj:

    Application.Calculation = xlCalculationAutomatic


    acha, to nie wiedzialem, z tym ze to to makto co wywala filtr a filtry musza zostac.
  • Helpful post
    #8
    marcinj12
    Level 40  
    No coś za coś... Skoro zdjęcie filtra przed operacją nie wchodzi w rachubę, to faktycznie nie tędy droga...

    Natomiast pierwszy przykład w takiej postaci jak podałem u mnie działa prawidłowo, zarówno z filtrem, jak i z ukrytymi wierszami, przeliczają się też powiązane komórki. Przyczynę musisz mieć gdzie indziej, sprawdź czy inne funkcje w ogóle się przeliczają? Może są jakieś odwołania cykliczne?

    Natomiast Application.ScreenUpdating zawsze mimo wszystko zastosować.
  • #9
    tomek-hp13
    Level 9  
    to jest faktycznie lepsze i pomylilem sie, to nie to co rozwala filtry:

    makro idealne, dziala szybko i po skonczonej robocie wszystko sie akutalizuje (wszystko trwa ponizej sekundy)

    Code: vb
    Log in, to see the code


    Extremalnie wielkie dzieki !!!