ID tematu: 313
|
Makro rozszerzające formatowanie warunkowe |
Autor |
Wiadomość |
chips
Exceloholic
Posty: 249
|
Wysłany: 19-01-2007, 12:57 Makro rozszerzające formatowanie warunkowe
|
|
|
Wiadomo, że formatowanie warunkowe jest ograniczone do 3 warunków.
Jak napisać kod by działał w ten sposób:
Jeżeli komórka A1>0 wtedy:
- cieniuj A1 na zielono
- pogrub czcionkę A1
- zmień czcionkę na kolor niebieski A1
- cieniuj cały wiersz1 na szaro
- zmień czcionkę w wierszu1 na italic
Jezeli A1<=0 wtedy:
- cieniuj A1 na czerwono
- pogrub czcionkę A1
- zmień czcionkę na kolor biały A1
- cieniuj cały wiersz1 na żółto
- zmień czcionkę w wierszu1 na podkreśloną
Z góry dzięki. |
|
| ID posta:
1605
|
|
|
|
|
|
|
Rycho
Excel Expert
Pomógł: 203 razy Posty: 322
|
Wysłany: 19-01-2007, 15:12
|
|
|
Witam.
Nie sądzę, by w tym przypadku potrzebne było makro, gdyż masz jedynie dwa warunki.
Oczywiście osobno należy ustawić formatowanie warunkowe dla komórek w kolumnie A
'wartość komórki jest' 'większa niż' '0'
i osobno dla reszty komórek ale dla wiersza w zależności od komórki A1
'formuła jest': =($A1>0)
lub
'formuła jest': =($A1<=0)
lub takie makro:
Kod: | Sub koloruj()
Dim kom As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each kom In Intersect(ActiveSheet.UsedRange, Columns("A"))
With kom
If .Value > 0 Then
.Interior.ColorIndex = 35
.Font.ColorIndex = 5
.Font.Bold = True
With Rows(.Row)
.Interior.ColorIndex = 15
.Font.Underline = xlUnderlineStyleNone
.Font.Italic = True
End With
Else
.Interior.ColorIndex = 3
.Font.ColorIndex = 5
.Font.Bold = True
With Rows(.Row)
.Interior.ColorIndex = 36
.Font.Underline = xlUnderlineStyleSingle
.Font.Italic = False
End With
End If
End With
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub |
Pozdrawiam |
|
| ID posta:
1611
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 22-01-2007, 06:55
|
|
|
Wielkie dzieki. W tym przykładzie podałem tylko niezbedne dane aby nie zagmatwać problemu. W rzeczywistości formatowanie warunkowe jest wykorzystane Jeszcze raz - Dzięki. |
|
| ID posta:
1662
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 22-01-2007, 17:28
|
|
|
Kurcze nie działa. Jeżeli zmienie wartość w A1 nic nie się nie zmienia. Rycho sprawdzałeś to makro u siebie? |
|
| ID posta:
1696
|
|
|
|
|
|
Trebor
Excel Expert
Pomógł: 1752 razy Posty: 4680
|
Wysłany: 22-01-2007, 17:38
|
|
|
Będzie działać pod warunkiem, że go (makro) uruchomisz ręcznie, przyciskiem, skrótem itp.
Nie odpali się z automatu. |
_________________ Trebbor@wp.pl |
|
| ID posta:
1699
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 22-01-2007, 17:40
|
|
|
A co zrobić żeby działało z automatu? |
|
| ID posta:
1701
|
|
|
|
|
|
Rycho
Excel Expert
Pomógł: 203 razy Posty: 322
|
Wysłany: 22-01-2007, 17:58
|
|
|
Hej.
Możesz dodatkowo w module arkusza (nie module ogólnym) wstawić takie makro uruchamiające procedurę 'koloruj' po zmianie w kolumnie A:
Kod: | Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("A")) Is Nothing Then
Call koloruj
End If
End Sub |
Pozdrawiam |
|
| ID posta:
1704
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 22-01-2007, 18:23
|
|
|
Dzięki. Kod jednak powodował że:
1. Jeżeli opuściłem jakieś wiersz zaznaczał go na zółto.
2. Formatowanie wiersza było nadzrzedne dla formatowania komórki.
Trochę więc zmienilem twój kod i chyba działa:
Kod: | Sub koloruj()
Dim kom As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each kom In Intersect(ActiveSheet.UsedRange, Columns("A"))
With kom
If .Value > 0 Then
With Rows(.Row)
.Interior.ColorIndex = 15
.Font.Underline = xlUnderlineStyleNone
.Font.Italic = True
End With
.Interior.ColorIndex = 35
.Font.ColorIndex = 5
.Font.Bold = True
End If
If .Value < 0 Then
With Rows(.Row)
.Interior.ColorIndex = 36
.Font.Underline = xlUnderlineStyleSingle
.Font.Italic = False
End With
.Interior.ColorIndex = 3
.Font.ColorIndex = 5
.Font.Bold = True
End If
End With
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("A")) Is Nothing Then
Call koloruj
End If
End Sub |
|
|
| ID posta:
1710
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 22-01-2007, 18:48
|
|
|
Kurcze a jak zmienić sprawdzany warunek
Na
Kod: | [Wartość komórki] - [Dzisiejsza data] < 30 |
|
|
| ID posta:
1715
|
|
|
|
|
|
Trebor
Excel Expert
Pomógł: 1752 razy Posty: 4680
|
Wysłany: 22-01-2007, 18:52
|
|
|
"Dzisiejsza data" w VBA to Date
Pozdrawiam |
_________________ Trebbor@wp.pl |
|
| ID posta:
1717
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 22-01-2007, 19:10
|
|
|
Co tu niegra? Type mismatch
Kod: | Sub dataauditu()
Dim kom As Range
Application.EnableEvents = False
Application.ScreenUpdating = False
For Each kom In Intersect(ActiveSheet.UsedRange, Columns("E"))
With kom
If .Value - Date < 30 Then
.Interior.ColorIndex = 35
.Font.ColorIndex = 5
.Font.Bold = True
End If
End With
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("E")) Is Nothing Then
Call dataauditu
End If
End Sub |
|
|
| ID posta:
1718
|
|
|
|
|
|
Trebor
Excel Expert
Pomógł: 1752 razy Posty: 4680
|
Wysłany: 22-01-2007, 21:18
|
|
|
Być może w kolumnie jest coś co nie jest datą. Aby przeskoczyć taki błąd możesz zrobić tak:
Kod: |
For Each kom In Intersect(ActiveSheet.UsedRange, Columns("E"))
With kom
If IsDate(.Value) Then
If .Value - Date < 30 Then
.Interior.ColorIndex = 35
.Font.ColorIndex = 5
.Font.Bold = True
End If
End If
End With
Next
|
|
_________________ Trebbor@wp.pl |
|
| ID posta:
1721
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 23-01-2007, 06:38
|
|
|
Domyślam się, że twoja linia kodu sprawdza czy komórka jest datą. Gdy ją wstawiłem makro nic nie robi. Tak jakby wartość w kolumnie E nie była datą. A jest w formacie rrrr-mm-dd. Może to problem z deklaracjami zmiennych na poczatku kodu tzn. tą date trzeba jakoś zadeklarować (strzelam ) |
|
| ID posta:
1729
|
|
|
|
|
|
Tajan
Pomógł: 5501 razy Posty: 11968
|
Wysłany: 23-01-2007, 08:25
|
|
|
A czy wartość komórki po zmianie formatu na "Ogólny" zmienia się w liczbę? Pamiętaj, że czasem nie wystarczy sama zmiana formatu do tego, aby wartość była traktowana przez Excela jak data. Możesz tez spróbować zmienić kod makra z:
Kod: | If IsDate(.Value) Then |
na:
Kod: | If IsNumeric(.Value) Then |
|
|
| ID posta:
1733
|
|
|
|
|
|
chips
Exceloholic
Posty: 249
|
Wysłany: 23-01-2007, 08:56
|
|
|
hmm, Otworzyłem dziś arkusz, stanąłem na końcu jednej z dat w kolumnie E i nacisnąłem ENTER i zakolorowało mi zgodnie z danymi w kodzie wszystkie daty w kolumnie E.
Więc niby działa. Tylko coś nie tak jest z warunkiem:
Kod: | If .Value - Date < 30 Then |
bo nawet jezeli Data w komórce - Data dzisiejsza = 60 to zabarwia komórkę tak jak inne komórki. Generalnie jeżeli w komórce jest data (nieważne jaka) to formatuje ją wg paramterów podanych w kodzie.
P.S. Narazie nie zmieniałem kodu na:
Kod: | If IsNumeric(.Value) Then |
|
|
| ID posta:
1737
|
|
|
|
|
|
|