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.

VBA - zmiana koloru kształtu w zależności od wartości określonej komórki

minstrelmk 04 Sie 2018 11:51 237 4
  • #1 04 Sie 2018 11:51
    minstrelmk
    Poziom 7  

    Bardzo proszę o pomoc w napisaniu poprawnego makra, które będzie się uruchamiało przy każdorazowej zmianie wartości określonej komórki.
    Na tę chwilę mój problem polega na tym, że makro działa, kiedy ręcznie zmieniam wartości w komórce. Nie działa jednak, gdy w tę samą komórkę wstawiam prostą formułę, której wynikiem są określone wartości (formuła to: =MIN(J4:J5)).
    Wspomniane makro ma zmieniać kolor kształtu "Elipsa 4".
    Z góry wielkie dzięki za pomoc!

    Obecnie kod (nie działający w przypadku komórki z formułą), który mam:

    Code:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Intersect(Target, Range("K9")) Is Nothing Then Exit Sub
        If IsNumeric(Target.Value) Then
            If Target.Value < 3 Then
                ActiveSheet.Shapes("Elipsa 4").Fill.ForeColor.RGB = vbRed
            ElseIf Target.Value > 2 And Target.Value < 7 Then
                ActiveSheet.Shapes("Elipsa 4").Fill.ForeColor.RGB = vbYellow
            Else
                ActiveSheet.Shapes("Elipsa 4").Fill.ForeColor.RGB = vbGreen
            End If
        End If
    End Sub


    Próbowałem też z tym:

    Code:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$K$9" Then
            If Target.Value < 3 Then
                ActiveSheet.Shapes("Elipsa 4").Fill.ForeColor.RGB = vbRed
            ElseIf Target.Value > 2 And Target.Value < 7 Then
                ActiveSheet.Shapes("Elipsa 4").Fill.ForeColor.RGB = vbYellow
            Else
                ActiveSheet.Shapes("Elipsa 4").Fill.ForeColor.RGB = vbGreen
            End If
    End If
    End Sub


    P.S. Dodam, że plik, w którym ma działać to makro obecnie mam zapisany jako .xlsb. Czy to ma jakieś znaczenie? Powinienem go zapisać jako .xlsm?

    0 4
  • #2 04 Sie 2018 17:12
    Andie
    Poziom 21  

    Zdarzenie Worksheet_Change zachodzi wtedy, kiedy fizycznie edytujesz komórkę.
    Ponieważ Twój kod jest uruchamiany tylko przy edycji komórki K9, nie wykona się, jeśli wartość tej komórki zmieni się w wyniku działania formuły, a jedynie wówczas kiedy wyedytujesz tę komórkę (nawet bez zmiany wartości).

    Jeśli komórki, do których odnosi się formuła (J4, J5) są edytowane ręcznie, możesz zmienić kod, tak aby się uruchamiał po ich zmianie (edycji). Przykładowy kod poniżej. Jeśli nie, trzeba pomyśleć nad innym rozwiązaniem - najlepiej załącz wówczas skoroszyt z przykładem.

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    andie

    0
  • #3 04 Sie 2018 18:32
    minstrelmk
    Poziom 7  

    Andie, bardzo dziękuję za Twoją odpowiedź. Sprawa niestety wygląda tak, że wartości komórek J4, J5 to również wynik formuł w nich zawartych, a te odnoszą się do kolejnych komórek z formułami... dość to rozbudowane, dlatego załączam prosty plik (w załączeniu; rozszerzenie zmieniłem z .xlsb na .txt ponieważ nie mogłem załączyć pliku z rozszerzeniem .xlsb), w którym zademonstrowałem mój problem w uproszczonej formie. Tym razem chodzi o komórki E2 i E3.

    A może trzeba tak to napisać, by jakakolwiek zmiana w całym arkuszu (a nie tylko w jednej komórce) uruchamiała makro sprawdzające wartość w tej jednej, ściśle określonej komórce, by następnie nadać odpowiedni kolor kształtowi...? Tyle, że ja nie wiem jak to napisać. Help!

    0
  • Pomocny post
    #4 04 Sie 2018 19:52
    czeles
    Poziom 16  

    Zmieniłem nieco procedurę napisaną przez ciebie. Wydaje się że zdarzenie Calculate arkusza jest właściwsze niż Change. Wywoływane jest przy przeliczaniu formuł arkusza.

    0
  • #5 04 Sie 2018 20:53
    minstrelmk
    Poziom 7  

    Czeles, piękne dzięki.
    Działa jak należy.

    0