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 2007 - formatowanie warunkowe kształtu

kyjo89 28 Wrz 2012 07:55 5334 18
  • #1 28 Wrz 2012 07:55
    kyjo89
    Poziom 8  

    Witam!

    Czy byłby ktoś tak miły i przedstawił mi metodę formatowania jakiegoś kształtu (w moim wypadku trzech kółek symbolizujących światła drogowe) w zależności od wartości liczbowej w komórce. Poniżej wartości A - zielone światło, między A i B żółte, powyżej B czerwone. W międzyczasie przeglądam kursy VBA, ale nie mając o nim zielonego pojęcia, nawet nie wiem pod jakim hasłem szukać, więc będę wdzięczny za konkretną pomoc.

    pozdrawiam,
    Krzysiek

    0 18
  • #2 28 Wrz 2012 08:49
    adamas_nt
    Moderator Programowanie

    Zajrzyj do pomocy.

    Cytat:
    Formatowanie warunkowe jest funkcją programu Microsoft Excel, która ustawia format komórki zgodnie z warunkami określonymi przez użytkownika. Formatowanie warunkowe pozwala na przedstawienie danych liczbowych w różnych kolorach;
    kyjo89 napisał:
    W międzyczasie przeglądam kursy VBA, ale nie mając o nim zielonego pojęcia, nawet nie wiem pod jakim hasłem szukać
    Otwórz edytor VB, napisz Shapes(1), następnie kropkę, z listy wybierz Fill, zaznacz i naciśnij [F1]. Pod hasłem "Shape.Fill Property" masz opis z przykładem stosowania.

    0
  • #3 28 Wrz 2012 09:43
    kyjo89
    Poziom 8  

    Dziękuję za podpowiedź, ale nie widzę tam żadnej możliwości ustawiania koloru w zalezności od wartości z komórki excela. Myślałem, że raczej trzeba będzie skorzystac z FormatConditions, ale totalnie nie ogarniam wszystkich parametrów i argumentów tej funkcji. Ktoś może ma pod ręką link, do jakiejś instrukcji po polsku?

    0
  • Pomocny post
    #4 28 Wrz 2012 10:03
    adamas_nt
    Moderator Programowanie

    Musisz napisać instrukcję warunkową If...Then...Else, lub Select Case.

    Coś na wzór, jak w załączniku.
    Formatowanie warunkowe nie obejmuje tego typu obiektów...

    0
  • #5 28 Wrz 2012 10:52
    kyjo89
    Poziom 8  

    W sumie nie mam pojęcia, dlaczego o tym nie pimyślałem... :) Jesteśmy coraz bliżej, ale:

    odpalam excela => wstawiam kształt => z zaznaczonym kształtem klikam "Makra" we wstążce "Widok" => "Utwórz" =>

    Sub a()
    If A1 = 1 Then
    Worksheets(1).Shapes(1).Fill.BackColor = RGB(255, 0, 0)
    [Else Worksheets(1).Shapes(1).Fill.BackColor = RGB(0, 0, 0)]
    End If
    End Sub

    => Compile VBAProject => przechodzę do Excela i... nie działa. Koło, jak było, tak jest niebieskie. Byłbym wdzięczny za pomoc w znalezieniu błędu.

    Niestety pierwszy raz w życiu korzystam z tego typu funkcji, także proszę o wyrozumiałośc.

    Edycja:
    Widzę, zdążyłeś edytowa, zanim dokończyłem odpowiedź! Dzięki wielkie! :)

    0
  • #6 28 Wrz 2012 11:11
    PeteSh
    Poziom 30  

    Za pomocą formatowania warunkowego można by to rozwiązać stosując symbol w kształcie kółka zeskalowany do odpowiedniego rozmiaru.

    1
  • #7 28 Wrz 2012 11:15
    kyjo89
    Poziom 8  

    Właśnie w taki sposób miałem to zrobione wcześniej, ale było mało wygodne. Misternie wykonana ramka, która zostawiała w środku 3 koła bez wypełnienia, a pod nimi komórki z formatowaniem warunkowym. Niestety przy drobnych edyckach wszystko sie rozjeżdżało i robiło problemy...

    0
  • #8 28 Wrz 2012 11:42
    adamas_nt
    Moderator Programowanie

    kyjo89 napisał:
    z zaznaczonym kształtem klikam "Makra" we wstążce "Widok" => "Utwórz" =>
    Tak, gdybyś tworzył procedurę Sub. W tym przypadku potrzebna jest procedura zdarzeniowa.
    1. Klik prawym p.m. na zakładce arkusza (u dołu ekranu)>wyświetl kod
    2. U góry edytora są dwie listy. Z lewej wybierasz Worksheet, z prawej procedurę. W naszym przypadku Change. Do procedury przekazywany jest jeden argument typu Range, który pozwala ograniczyć "pole działania". W tym celu, w instrukcji warunkowej używasz odpowiedniej właściwości. .Address, .Column, .Row, etc. Dalej już z górki.

    Trochę więcej Tutaj

    1
  • #9 28 Wrz 2012 12:09
    PeteSh
    Poziom 30  

    kyjo89 napisał:
    Właśnie w taki sposób miałem to zrobione wcześniej, ale było mało wygodne. Misternie wykonana ramka, która zostawiała w środku 3 koła bez wypełnienia, a pod nimi komórki z formatowaniem warunkowym. Niestety przy drobnych edyckach wszystko sie rozjeżdżało i robiło problemy...

    Miałem na myśli raczej coś takiego:

    0
  • #11 01 Paź 2012 09:03
    kyjo89
    Poziom 8  

    Przyszedł poniedziałek, znowu wróciłem do pracy i kontynuuje po kawałkach swoje dzieło i znowu pytania...

    Sub bl()

    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)

    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$N$5" Then
    Select Case Target.Value


    Case Is > 1.1 * N6: Shapes(4).Fill.ForeColor.RGB = RGB(255, 0, 0)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Case Is < N6: Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(0, 255, 0)
    Case Is > N6, Is < N6 * 1, 1: Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 0)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Case Else: Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    End Select
    End If
    End Sub

    I niestety nie działa... Jak to zwykle bywa - nie wiem dlaczego. W komórce N5 jest wartość procentowa, a N6 wartość procentowa graniczna. Jeżeli N5>110%N6 - czerwone (reszta białe), N5>N6 żółte, N5<N6 zielone. Tak miałoby to działać. Kod jest oczywiście wpisany w odpowiednim arkuszu i komórki są na pewno dobre. Numery obiektów (4,5,6) też się muszą zgadzać (ale na wszelki wypadek, jak można to sprawdzić?).

    Niestety wbudowane zestawy ikon to straszna pikseloza przy rozmiarach, które ja potrzebuję, a formatowanie warunkowe symbolu wygląda nieestetycznie, bo nie potrafię zrobić tak, żeby wypełniło całą komórkę. Po prostu ma jeszcze miejsce w komórce, a już przycina symbol, później są duże odległości między kołami i jest mega rozciągnięte w pionie.

    Edycja:
    Doszedłem, że algorytm nie odczytuje, albo źle odczytuje warunki w "case", a najprawdopodobniej nie pobiera wartości z N6. Jakieś rozwiązania?

    Edycja 2:
    Sub bl()

    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)

    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$N$5" Then
    Select Case Target.Value

    Case Is >= 1.1 * Cells(6, 14).Value:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 0, 0)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Case Is < Cells(6, 14).Value:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(0, 255, 0)
    Case Is >= Cells(6, 14).Value:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 0)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Case Else:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)

    End Select
    End If
    End Sub

    Udało się. A wiadomo, dlaczego opcja "cofnij" stała się nieaktywna w momencie zastosowania w dokumencie makr?

    I jeszcze kwestia odświeżania. W komórce N5 i N6 wartości zmieniają się same. I w momencie, kiedy się zmienią makro tego nie widzi i pozostawia stare kolory świateł. Widzi natomiast przy zmianie ręcznej. Ktoś zna rozwiązanie tego problemu?

    0
  • #12 01 Paź 2012 13:42
    marek003
    Poziom 40  

    Wszytko działa tylko zastosowałeś jakiś skrót myślowy (chyba że masz nazwaną komórke o adresie N6 jako "N6" jeżeli nie zastąp "kod" N6 kodem Range("N6")

    edit:

    Widzę że poradziłes sobie co prawda z cells ale tak tez można. :)

    Tak jest że przy uruchomieniu makra "cofnij" nie będzie działać, chyba że "zapamiętasz" wcześniejsze ustawienia w makrze i cofniesz makrem.

    0
  • #14 01 Paź 2012 16:54
    marek003
    Poziom 40  

    Spróbuj wpisać

    Code:
    Application.CalculateFull

    linię przed
    Code:
    If Target.Address = n5 then 

    0
  • #16 02 Paź 2012 09:36
    marek003
    Poziom 40  

    Co oznacza ze "zmieniają się same"

    Jeżeli zmiana innej komórki ma wpływ na zmiane w N5 i N6

    To te które ulegają zmianie wprowadź do warunku jezeli, a do obliczeń pobierz N5

    Np jeżeli zmiana w A1 wpływa na zmiane w N5 a B1 wpływa na N6 to zmień kod

    Code:
    If Target.Address = "$A$1" Or Target.Address = "$B$1" Then
    

    Select Case Range("N5").Value

    Case Is >= 1.1 * Cells(6, 14).Value:
    ... itd.

    0
  • #18 02 Paź 2012 11:22
    marek003
    Poziom 40  

    Chyba się nie rozumiemy.

    Napisałeś kod w "sekcji" Change arkusza (monitorującym czy w arkuszu nastąpiły zmiany)

    Czyli oczekujesz że jeżeli "coś" zmienisz w arkuszu to uruchomi się makro.

    Ograniczyłeś że ta zmiana ma dotyczyć komórki N5. Jednak jak sie okazuje komórka n5 nie zmienia się gdyż jest w niej formuła - zmienia się tylko wynik (nie robisz tego ręcznie)

    Dlatego pytam co "z reki" robisz w tym arkuszu jeżeli się zmieniają wartości w N5 i N6.

    Jeżeli nic nie robisz w tym arkuszu z ręki (jest to arkusz czysto wynikowy) to może trzeba zmienić "sekcję" kodu.
    Np kod formatujący ma się uruchomic gdy przełączając się między arkuszami włączysz/ zaktywujesz ten arkusz.

    Wtedy zmień moduł wpisania kodu na Worksheet_Activate() i pozbądz się warunku IF

    Czyli:

    Cytat:
    Private Sub Worksheet_Activate()

    Select Case Range("N5").Value

    Case Is >= 1.1 * Cells(6, 14).Value:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 0, 0)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Case Is < Cells(6, 14).Value:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(0, 255, 0)
    Case Is >= Cells(6, 14).Value:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 0)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Case Else:
    Shapes(4).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(5).Fill.ForeColor.RGB = RGB(255, 255, 255)
    Shapes(6).Fill.ForeColor.RGB = RGB(255, 255, 255)

    End Select

    Wtedy przy zaglądaniu do tego arkusza nastąpi "odświeżenie" danych.

    edit:
    Ewentualnie jeżeli zmiana N5 i N6 jest związana z wieloma komórkami które nie sa obok siebie (by można je było "zebrać" w warunku If Target ...) to pomiń/usuń warunek czyli wykasuj linie kodu "If Target .... Then" oraz pod koniec linię "end If"
    Wtedy przy jakiejkolwiek zmianie w arkuszu (z ręki) będzie sprawdzany warunek i ewentualnie "odświeżane" kolorki

    0