[VB, Excel]Kolorowanie komórki z pewnym warunkiem

0

Witam,

Nie przepadam kompletnie za tym językiem i tykam się go w sumie drugi raz w życiu (z pierwszego już prawie nic nie pamiętam).
Mam w dokumencie kilka komórek pokolorowanych na różne kolory z różnymi wartościami liczbowymi, rosnąco, jedna pod drugą, np.

300 (czerwone tło)
400(pomarańczowe tło)
1000 (żółte tło)
...
itd.

Tego w sumie jest 7.

W innej, długiej na ~30 komórek kolumnie mam też wartości liczbowe, też rosnąco.

I teraz: Chciałem zrobić coś takiego, że w momencie, gdy w tej drugiej kolumnie, wartość liczbowa będzie większa niż np. 300, to żeby przybrała czerwone tło, jak potem przekroczy 400, to pomarańczowe, jak 1000, to żółte itd. Generalnie na pewno musi być jakiś If, ale jak wstawić za pomocą tych makr wartość do komórki, jak zmienić kolor itd.... tego nie potrafię ogarnąć.

0

Jeżeli nie musisz używać VBA to w menu Format->Formatowanie warunkowe. Jeżeli koniecznie VBA to najprościej nagrać sobie makro (np zaznaczając komórkę i ustawiając jej kolor wypełnienia) i podejżeć jakie komendy są wykonywane. Jak nagrać makro? - Excel i F1.

0

Takoż próbowałem. Ale nie wiem jak się odnieść do wartości w danej komórce. Próbowałem podobne rzeczy robić, nagrywać różne makra, ale wiele rzeczy sam nie obkminiłem. Help nic nie daje, oczywiście, a VB uprzykrza życie.

A formatowanie warunkowe byłoby ok, gdyby nie to że ktoś (jakiś idiota chyba) wymyślił że tylko 3 warunki max mogą być. A ja, mówiłem już, że mam 7 pozycji...

0

Napisałeś długiej na ~30 komórek kolumnie mam też wartości liczbowe
oraz ale jak wstawić za pomocą tych makr wartość do komórki.
Te zdania są sprzeczne.
Makro ma wyliczyć wartości, wpisać do komórki i zmienić kolor tła?
Dane do komórek wpiszesz sam, a makro ma czuwać i zmieniać kolor tła?
Dane do komórek wpiszesz sam, klikniesz w jakiś przycisk, a dzielne makro pozmienia kolory tła?

0
bo napisał(a)

Napisałeś długiej na ~30 komórek kolumnie mam też wartości liczbowe
oraz ale jak wstawić za pomocą tych makr wartość do komórki.
Te zdania są sprzeczne.

Sory, nie wyraziłem się jasno. W tym drugim po prostu wymieniałem po kolei rzeczy z makr, których nie umiem. Nie umiem ODNIEŚĆ się do komórki w żaden sposób. W helpie pisze tylko o funkcjach, ale co mi po nich, jak nie ma jak tego w arkusz wrzucić...

Chodzi mi o tą drugą opcję - ja wklepuję daną, wpiszę np. 301, niech mi pokoloruje na czerwono po opuszczeniu komórki. Automatycznie (tak działa to formatowanie warunkowe, tylko że tylko 3 warunki są :/ ). I jeszcze jak mam tą kolumnę na boku - żeby ten kolor był kopiowany stamtąd. Czyli jak sobie zmienię kolor tamtej komórki na boku, żeby się zmieniły wszystkie kolory tych komórek w głównej 30pozycjowej kolumnie. Jakbym zmienił wartość w którejś z komórek na boku, żeby się zmieniły kolory (np. zmienię z 300 na 350, i komórka z czerwonej się odbarwi z powrotem na domyślny czyli brak wypełnienia).

0

Nie mam Excela (i używam go sporadycznie). W Calcu kod makra wyglądałby tak

Sub Koloruj
  For w = 0 To 20
    For k =0  To 30
      Cell = ThisComponent.Sheets(1).getCellByPosition(k,w)
      v = Cell.Value
      If v < 20 Then 
        Cell.CellBackColor = ThisComponent.Sheets(1).getCellRangeByName("B24").CellBackColor
      ElseIf v < 40 Then
        Cell.CellBackColor = ThisComponent.Sheets(1).getCellRangeByName("C24").CellBackColor
      ElseIf v < 60 Then
        Cell.CellBackColor = ThisComponent.Sheets(1).getCellRangeByName("D24").CellBackColor
      Else 
        Cell.CellBackColor = ThisComponent.Sheets(1).getCellRangeByName("E24").CellBackColor
      End If
    Next k
  Next w  

End Sub

W Excelu zamiast ThisComponent.Sheets(1).getCellByPosition(k,w) można użyć Cells(w,k), kolor jest opisywany chyba przez Interior.ColorIndex.
Jeżeli zmieniane jest tło wielu komórek to wykonanie makra chwilę trwa. Można makro podpiąć pod klawisz (i W Calcu i w Excelu). W Calcu można podpiąć wykonanie makra pod utratę fokusu przez komórkę (w Excelu nie wiem).

0

A formatowanie warunkowe byłoby ok, gdyby nie to że ktoś (jakiś idiota chyba) wymyślił że tylko 3 warunki max mogą być.
Excel 2007 i 2010 już nie ma tego ograniczenia.

0

Dzięki, bo, bardzo pomogłeś ;)

Bo znowu (przepraszam, nie bić! :( ) źle się wyraziłem - chodziło właśnie o Calca. Może to dlatego że wydawało mi się że Basic i w Excelu i w Calcu jest taki sam...

Trochę przerobiłem to Twoje makro, i już prawie jest tak jak trzeba. Jedyne czego mi brakuje, to żeby toto wykonywało się automatycznie, nie żeby trzeba było nacisnąć guzik, tylko - zmieni się wartość - i już się odpowiednio komórka koloruje. I, jakoś błędnie mu wychodziło odniesienie się do wartości komórki w innym arkuszu (nie tak jak Ty - że porównujesz z wartością 30/60/90... itd, ale przez

If v < ThisComponent.Sheets(5).getCellByPosition(1,1).Value

I jakoś toto nie wiedzieć czemu nie działało poprawnie (od 300 (które jest pierwszym progiem) zaczynało mi kolorować od razu na ten ostatni kolor (ten po samym Else)), nie udało mi się tego zdebugować, zrozumieć czemu tak. No ale to już jest szczegół.

Teraz tylko ten automat by się przydał i będzie super ^^

0

Dodaj jeszcze to:


Sub Main
  lst = createUnoListener("my_", "com.sun.star.util.XModifyListener")
  komorka = ThisComponent.Sheets(1).getCellByPosition(0,0)
  komorka.addModifyListener(lst)
  komorka = ThisComponent.Sheets(1).getCellByPosition(1,1)
  komorka.addModifyListener(lst) 
  rem i analogiczne wiersze dla każdej komórki, której kolor ma zależeć od wartości.   
End Sub

Sub my_modified()
  Koloruj()  
End Sub

Metoda my_modified Listenera reaguje tylko na zmiany wartości, jeżeli zmienisz tło w komórkach wzorcowych, to chwilowo nic się nie dzieje. Zmiany kolorów nastąpią dopiero po zmianie wartości.
Nie jestem ekspertem Calca, może w inny sposób da się reagować automatycznie na zmiany koloru tła.

0

Łojeju, to jak będę miał w przyszłości 2000 takich komórek, to muszę 4000 linijek napisać?... już prościej guzik klikać po każdym update... Hmmm nie ma opcji do tej listy komórek w listenerze dodać całego zakresu? Jak sobie zrobię zakres, nazwę go np. "dane".

0

O pętlach słyszałeś?

0

<facepalm> dobra. OK. Tutaj zlamiłem. Może nie pomyślałem o tym bo już zmęczony jestem.
Dzięki wielkie anyway.

0

Sub Koloruj
for k = 1 to 2
For w = 1 To 31
Cell = ThisComponent.Sheets(4).getCellByPosition(k,w)
v = Cell.Value
With ThisComponent.Sheets(5)
If v < 300 Then
Cell.CellBackColor = .getCellRangeByName("B1").CellBackColor
ElseIf v < 1200 Then
Cell.CellBackColor = .getCellRangeByName("B2").CellBackColor
ElseIf v < 3600 Then
Cell.CellBackColor = .getCellRangeByName("B3").CellBackColor
ElseIf v < 7200 Then
Cell.CellBackColor = .getCellRangeByName("B4").CellBackColor
ElseIf v < 12000 Then
Cell.CellBackColor = .getCellRangeByName("B5").CellBackColor
ElseIf v < 24400 Then
Cell.CellBackColor = .getCellRangeByName("B6").CellBackColor
ElseIf v < 30000 Then
Cell.CellBackColor = .getCellRangeByName("B7").CellBackColor
Else
Cell.CellBackColor = .getCellRangeByName("B8").CellBackColor
End If
End With
Next w
next k

End Sub

Sub Main
lst = createUnoListener("my_", "com.sun.star.util.XModifyListener")
for k = 1 to 2
for w = 1 to 31
komorka = ThisComponent.Sheets(4).getCellByPosition(w,k)
komorka.addModifyListener(lst)
next w
next k
End Sub

Sub my_modified()
Koloruj()
End Sub

Mam taki kod. Komórki na arkuszu 4tym - 31 wierszy, 2 kolumny, poczynając od B2, kolorują się. Na arkuszu 5tym od B2 jest jedna kolumna siedmiu kolorów.
Działa tak, jak bez tych dwóch ostatnich makr. Po prostu automatyczność nie działa

0

A Ty rozumiesz ten kod?
<code==vba>
Sub Main
lst = createUnoListener("my_", "com.sun.star.util.XModifyListener")
for k = 1 to 2
for w = 1 to 31
komorka = ThisComponent.Sheets(4).getCellByPosition(w,k)
komorka.addModifyListener(lst)
next w
next k
End Sub

Słuchacza zmiany wartości podpinasz tylko do komórek z arkusza 4. Podepnij do wszystkich, których tło ma się zmieniać, również do tych z arkusza 5.
0

Tak, mniej więcej rozumiem. On nie zmienia koloru tych w 4tym! a właśnie w 4tym ma zmieniać. W 5tym nie ma zmieniać, bo tam właśnie sobie umieściłem ten "przybornik" z kolorami, które ma kopiować...

0

A Ty wiesz, że arkusze są numerowane od zera?
ThisComponent.Sheets(0) to "Arkusz1".

0

Ej, weź mnie nie obrażaj. :/

To że raz mi się o pętlach zapomniało, bo ledwo już na oczy wtedy widziałem (nieprzespana noc) - nie znaczy że nie znam pewnych podstaw o programowaniu (od 8 lat programuję - Pascal, potem C++, potem przerzuciłem się na C# -> po prostu z VB się nie zetknąłem, i nie chciałem się stykać, bo znam pewne hmmm... negatywne opinie o nim). Jak raz coś tam nie działało jeszcze przed automatycznością, bo właśnie numerowałem od 1 - to pomyślałem "Hmmm, pewnie jest zero-based." Zmieniam - działa.

Pisząc w poprzednim poście o 4tym i 5tym - mam na myśli numerację właśnie od zera.

Gdybym zresztą złą numerację arkuszy dał, to by mi w ogóle nie kolorowało. A koloruje, tylko muszę uruchomić makro.

A wgl nie potrzebowałbym pomocy, gdybym znał m.in. sposób odniesienia się do wartości komórki, jej koloru itp. (teraz już znam). Teraz jedyne czego mi brakuje to ta automatyczność - i mówię, że jej nie ma. :(

0

Czekaj. Co masz na myśli pisząc, że automatyczność nie działa? Że nie odpala się funkcja Main?
W VBA nie ma czegoś takiego jak główna funkcja, od której zacznie się wykonywanie programu. Mamy jednak różnie inne bajerzaste obejścia - np. funkcja AutoOpen.

http://www.yogeshguptaonline.com/2009/04/macros-in-excel-auto-open-macro-auto.html

EDIT: Sory, teraz dopiero doczytałam, że piszesz w Calcu, nie w Excelu. A ja o Calcu nic nie wiem ;)

0
aurel napisał(a)

Czekaj. Co masz na myśli pisząc, że automatyczność nie działa?

Że po zmianie wartości komórki (i wciśnięciu Enter) nie zmienia się od razu jej kolor... Ale skoro i tak nie umiesz w Calcu :P

0

Nie reaguje automatycznie na zmianę wartości, czy na zmianę koloru komórek wzorcowych?
Jeżeli pierwsze, to nie wierzę.
Jeżeli drugie, to napisałem

Metoda my_modified Listenera reaguje tylko na zmiany wartości, jeżeli zmienisz tło w komórkach wzorcowych, to chwilowo nic się nie dzieje. Zmiany kolorów nastąpią dopiero po zmianie wartości.

Pytałem na forum OO czy można reagować automatycznie na zmianę koloru komórki, na razie cisza.

0

Przecież mówię, że wartości. Nie wierzysz - cóż, to nie zmieni tego, że to nie działa. Próbowałem po zmianie wartości "ręcznie" odpalać funkcję Main z listy makr - nic się nie dzieje. Ale to problem wywołania tego my_modified w Mainie, bo jak odpalam my_modified, to spokojnie działa (i nie spodziewałem się niczego innego...). Po prostu chyba ten listener chyba ma problemy ze słuchem, albo nie uważa zamiast nasłuchiwać ;)

0

Jak nie masz nic tajnego w tym pliku, to go wyślij mailem (albo jakimś innym sposobem udostępnij), sprawdzę czemu nie działa.

0

Nie mam nic tajnego ;P

http://www.speedyshare.com/files/25827071/punktyITePe.ods

arkusz 5ty (licząc od zera to 4ty) -> zawiera komórki które mają się kolorować
arkusz 6ty (od zera - 5ty) -> "przybornik" z kolorami.
Jeszcze wartości arkusza 5tego -> są wyliczane na podstawie arkusza 4tego (liczącod zera - 3ciego).
Druga kolumna w 5tym jest taka bardziej testowa.

0
  1. Makro Main przypisujące słuchacza do komórek musi się raz wykonać, dodaj przycisk uruchamiający to makro lub przypisz je do zdarzenia Otwarcie dokumentu.
  2. Jak się adresuje komórki w arkuszu, (wiersz, kolumna) czy (kolumna,wiersz)?
Sub Main
  lst = createUnoListener("my_", "com.sun.star.util.XModifyListener")
  for k = 1 to 2
    for w = 1 to 31
      komorka = ThisComponent.Sheets(4).getCellByPosition(k,w)
      komorka.addModifyListener(lst)
    next w
  next k
End Sub
0
  1. Hmmm tego nie wiedziałem.
  2. O.o A tutaj to zonka zaliczyłem. W Excelu jest w/k a nie k/w (tak mi znajomy mówił). Niezła odchyłka. Sądziłem że i tu będzie adresowanie "macierzowe", a nie "układoWspółrzędnoKartezjańskie"...

Anyway - problem rozwiązany... dzięki za pomoc :) wszystko działa jak należy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1