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

Excel - formatowanie warunkowe

25 Cze 2009 17:23 5776 21
  • Poziom 15  
    Mam pytanie związane z formatowaniem warunkowym w excelu. Dostałem zrobiony taki arkusz który informuje po czasie 60 dni o konieczności potwierdzenia kontaktu poprzez kliknięcie w komórce "E". Co zauważyłem, że na początku jak miałem mało wierszy wszystko działało sprawnie i szybko, niestety przy ilości ok. 50 wierszy działa to bardzo wolno tzn. przesuwanie dokumentu oraz potwierdzenie np. w ostatnim wierszu powoduje coraz większe opóźnienie. Nie wiem czy można by było to jakoś uprościć bo boję się że przy 200 wierszu dokument może wcale nie funkcjonować. Niestety nie jestem biegły w excelu dlatego zwracam się o pomoc oraz o jakieś wskazówki poprawy tego dokumentu. Pracuje w excelu 2007.
  • Pomocny post
    Moderator Programowanie
    Na przyszłość: spakuj plik i zrezygnuj z prowizji :) Zauważyłem za późno (-4pkt)...
    Problem w tym, że w arkuszu 1 masz 14185 CheckBox'ów (większość jeden na drugim) policzyłem makrem
    Code:
    Sub policz()
    
    MsgBox Sheets("Arkusz1").Shapes.Count
    End Sub
    w ostatnim wierszu z "ręcznym" usuwaniem dałem spokój na 50-tym...
  • Poziom 15  
    Rozwiązanie jest bez porównania lepsze ale zależałoby mi żeby np. pole było puste i zależne od daty tzn. Ustawiam datę 1.01.2009 i pole sygnalizuje mi "czas" po upływie 60 dni pole to zmienia się na czerwono z oznaczeniem termin a ja potwierdzam kliknięciem na kolor zielony potwierdzone. Ładnie się mówi ze strony początkującego ale czy można coś wymyśleć w tym kierunku.
  • Pomocny post
    Moderator Programowanie
    Właśnie wróciłem z ogrodu (burza), przyjrzałem się formułom i usunąłem mój załącznik. Najlepiej zostać jednak przy polach wyboru. Możesz zrobić tabelkę od nowa w nowym arkuszu lub próbować usunąć nadmiar checkbox'ów makrem
    Code:
    Sub wywal()
    
    On Error Resume Next
    For i = Sheets("Arkusz1").Shapes.Count To 100 Step -1
        Shapes(i).Delete
    Next
    End Sub
    i resztę "ręcznie" (prawy pm, wytnij. Po skasowaniu ostatniego Ctrl+z). Gdy zostaną już pojedyncze sprawdź tylko czy łącze pola wyboru zgadza się z Nr wiersza. Podrzuciłbym Ci gotowca ale nie zachowałem Twojego pliku, a ten w 1 poście ciągle kosztuje...
  • Poziom 15  
    Dla Ciebie to bardzo proste, a ja nie mam pojęcia o takich rzeczach. Chciałbym tylko zwrócić uwagę na fakt że na początku miałem 1 wiersz zaznaczałem go i kopiowałem zmieniając wartość komórki z 1 na 2 itd. do której się odnosiło pole gdzie musiałem potwierdzać.
  • Pomocny post
    Moderator Programowanie
    W załączniku plik z przyciskiem wstawiania nowego wiersza. Natomiast gdybyś usuwał wiele wierszy z zaznaczenia pamiętaj, że pola wyboru z tych wierszy ułożą się w stosik jeden na drugim. I dlatego, podejrzewam, tyle ich się nazbierało. Można dorobić makro usuwania Np ostatniego wiersza, ale to ew. później. Wyłączam komputer, idzie nowa burza...
  • Poziom 15  
    Jesteś Wielki KOLEGO !!!
  • Pomocny post
    Moderator Programowanie
    Byczek się zakradł, zmień 3 linijkę od końca :)
    Code:
        .Cells(ostWiersz + 1, 4) = ""
    
  • Poziom 15  
    Nie zauważyłem błędu tzn. wstawia mi się dobrze następny wiersz
  • Pomocny post
    Moderator Programowanie
    Ale kasuje datę z wiersza wyżej...
    W załączniku poprawiony z przyciskiem usuwania ostatniego. (Burza poszła bokiem)
    Gdybyś zamiast ostatniego chciał kasować pierwszy to zmień w makro UsunWiersz linię: ostatni = True na: ostatni = False (opisane w makro)
  • Moderator Programowanie
    Ta linia
    Code:
    ostwiersz = .UsedRange.Rows.Count
    liczy ile zajmujesz wypełnionych wierszy. W załączonym pliku post wyżej masz wstawione 3 puste wiersze nad nagłówkiem tabelki i stąd problemy. Makro wiersz Nr 50 "widzi" jako 47...
    Jeśli musisz je tam mieć to wpisz dowolny tekst w dowolną komórkę każdego wiersza i zmień czcionkę na białą (będzie niewidoczny) Lub dodaj do zmiennej ostwiersz
    Code:
    ostwiersz = .UsedRange.Rows.Count + 3
    Z tym, że pola wyboru już masz "pokiełbaszone". Wróć do pliku z mojego załącznika...

    Przypominam, że w przypadku "ręcznego" usunięcia wiersza pole wyboru ułoży się na tym z wiersza niżej (i będzie niewidoczne dla oka, ale widoczne dla makra). Przyjmij zatem zasadę: Nie usuwam wierszy "ręcznie". Oczywiście przy odrobinie czasu można przerobić makro wykorzystując InputBox, w którym podawałoby się konkretny Nr wiersza do usunięcia (łącznie z ChechBox'em)... Ale czy to będzie przydatne?
    Ręczne wstawianie wierszy gdzieś w środek tabeli (z wyjątkiem ostatniego) też powodować będzie błędy, ponieważ zmienią się (nie będą po kolei) numery indeksów pól wyboru, po których makro je rozpoznaje.
  • Poziom 15  
    Tak dodałem linię bo wcześniej miałem tam tekst. Mogę wpisać go jednak w nagłówku ale znowu będzie mi się drukował na każdej stronie.
  • Poziom 40  
    Pozwolę sobie dodać słówko w związku z "dziwnym" zdażeniem które zauważyłem.
    Jeżeli doda się tylko jeden pierwszy wiersz funkcja:
    Code:
    ostwiersz = Sheets("Arkusz1").UsedRange.Rows.Count

    działa poprawnie. Od dwóch przestaje działać (nie zlicza pozostałych pustych wierszy).
  • Moderator Programowanie
    :arrow: marek003
    UsedRange liczy tylko używane wiersze. Czyli: jeśli wpiszesz coś (wartość, formułę) tylko w A4 (a reszta arkusza jest pusta) to UsedRange.Rows.Count=1

    Żeby zupełnie "uodpornić" arkusz na takie wypadki (uznając słuszność Twojej uwagi) można zastosować
    Code:
    ostwiersz = Range("E65536").End(xlUp).Row

    w obu makrach. Co niniejszym czynię i zmieniam załącznik (oraz tekst) w poprzednim moim poście...
  • Pomocny post
    Poziom 40  
    adamas_nt napisał:
    :arrow: marek003
    UsedRange liczy tylko używane wiersze. Czyli: jeśli wpiszesz coś (wartość, formułę) tylko w A4 (a reszta arkusza jest pusta) to UsedRange.Rows.Count=1


    Żeby nie było nieporozumień - nie chciałem żebyś przeze mnie zmieniał kod.

    Ja tylko wtrąciłem tak na marginesie jeden powiedzmy bug funkcji UsedRange.Rows.Count który w niektórych przypadkach może źle wpływać na obliczenia.

    Wg mnie ta funkcja liczy nie tyle używane wiersze tylko zakres między pierwszym wierszem używanym do ostatniego użytego wiersza. Jeżeli między tymi wierszami będą puste wiersze ta funkcja uwzględnia je w obliczeniach. I jeszcze zauważ że nigdy nie osiągnie ona wartości 0.

    Nie znam się mocno na VB ale stwierdziłem to doświadczalnie na poniższym przykładzie i tylko chciałem dla samej wiedzy wskazać ciekawostkę (dotyczącą tego 0 a tym samym możliwości uzyskania w wyniku dwóch 1).
  • Pomocny post
    Moderator Programowanie
    marek003 napisał:
    I jeszcze zauważ że nigdy nie osiągnie ona wartości 0.
    Hmm, no o tym nie wiedziałem :) Tym słuszniej liczyć wiersze arkusza autora od dołu...
    Do autora: [Pomógł] dla kolegi marek003, uczciwie zasłużył :)
  • Poziom 15  
    Teraz to ja się pogubiłem który arkusz i parametry są teraz aktualne :)
  • Pomocny post
    Poziom 40  
    :) Pobierz jeszcze raz ostatni załącznik podany przez kolegę adamasa. Zaktualizował go. A co do pomógł to nie do końca bo moja uwaga była poza głównym tematem. Chociaż dziękuję za uznanie :)
  • Poziom 15  
    Pracuję już trochę dni na tym dokumencie i jednak coś do końca jest nie tak. Cały czas jak zrobię 51,52,53,54 wiersz to w wierszu ostatnim formatowanie jest ok natomiast w przedostatnim jak kliknę do zaznacza mi kilka wierszy powyżej.
  • Moderator Programowanie
    Podejrzewam, że już masz bałagan z polami wyboru. Sprawdź takim makrem
    Code:
    Sub sprawdz()
    
    ileWierszy = Cells(Cells.Find(What:="potwierdzenie").Row, Cells.Find(What:="potwierdzenie").Column).End(xlDown).Row _
    - Cells.Find(What:="potwierdzenie").Row
    If Sheets("Arkusz1").CheckBoxes.Count - ileWierszy <> 0 Then
        MsgBox "Niestety...", vbInformation
    Else
        MsgBox "W porządku...", vbInformation
    End If
    End Sub
    Wydaje mi się, że takie rozwiązanie prędzej czy później będzie powodować błędy, które nie będzie łatwo wyeliminować. Należałoby dopracować makro (ochrona przed ręcznym usuwaniem wierszy, liczenie elementów przy każdej operacji itp) lub pomyśleć nad czymś innym (bez checkbox'ów).