Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

pobieranie koloru komórki z excela

3,056 views
Skip to first unread message

perfetka

unread,
Nov 11, 2007, 12:30:14 PM11/11/07
to
Witam!
Mam duży problem, nad którym siedzę już kilka dni i nic :(
Mam bazę danych w excelu, która wygląda w ten sposób:

DATA | SNIADANIE | OBIAD | PODWIECZOREK | KOLACJA |
2007-11-01 | kanapki | placki ziemn | lody z owocami| bigos |
2007-11-02 | owsianka | bigos | budyn czekol. |salatka grecka|
2007-11-03 |rog. z miodem| spaghetti | truskawki |kanapki |

gdzie wiersze oznaczające weekendy mają kolor komórek czerwony
(oczywiście podana przeze mnie zawartość tabeli jest fikcyjna).

Pewne wartości powtarzają się w różnych miejscach a ja potrzebowałabym za
pomocą jednej funkcji zaznaczyć np wszystkie komórki zawierające "bigos" na
zielono (nie stosując żmudnego kopiowania i wklejania do Edycja->Znajdź).
Udało mi się napisać takie makro, kopiujące dowolną komórkę i znajdującą w
całej bazie komórki z taką wartością i zamieniające kolor komórki na zielony.
Makro działa super ale potrzebuję jeszcze funkcję odwracającą ów proces (by
podświetlenie komórki odbywało się tylko na chwilę i by arkusz wracał do
poprzedniego stanu-wykluczone jest zamykanie arkusza bez zapisywania zmian,
potrzebuję to zrobić za pomocą skrótu klawiaturowego).
Jak wiadomo, makra nie można cofnąć, można napisać jedynie procedurę odwrotną
do makra zmieniającego. Nie byłoby problemu, gdyby wszystkie komórki w arkuszu
miały przed zmianą ten sam kolor-wtedy można zrobić makro "wyszukaj wszystkie
komórki o kolorze zielonym i zamień kolor na brak koloru". Niestety wszystko
rozbija się o to, że wiersze z dniami weekendowymi zaznaczone są kolorem
czerwonym i moje makro wyszukawszy np. "bigos" na niedzielny obiad, zaznaczy go
na zielono, ale gdybym zrobiła drugie makro usuwające kolor, to komórka po
zmianie miałaby kolor "brak koloru" a przed zmianą była czerwona.
Próbowałam zapamiętać w makrze "wyszukaj" kolor aktywnej komórki ( starykolor =
ActiveCell.Interior.ColorIndex) jednak przy zastosowaniu w makro "odznacz"
wartości starykolor, kompilator wyrzuca błąd.
Proszę o pomoc bo już mi ręce opadają, prawdopodobnie jest to proste i zajmie
kilka minut, ale nie mogę na to wpaść.


--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

krzysztof kwapisz

unread,
Nov 11, 2007, 1:12:10 PM11/11/07
to
Witam!
Nagraj w VBA makro formatowania warunkowego - zobacz jak ono wygląda i ...

--
Archiwum grupy: http://niusy.onet.pl/pl.comp.lang.vbasic

perfetka

unread,
Nov 11, 2007, 1:24:52 PM11/11/07
to
I co? Bo nie bardzo rozumiem. Jakie mam dać warunki?

Jacek

unread,
Nov 11, 2007, 1:48:07 PM11/11/07
to

Dodaj sobie kolumne np. Z, w ktorej bedziesz trzymac informacje o
dokonywanych zmianach na kolumnie, zalozmy to A.
Po uruchomieniu makra, ktore zmienia z czarnego na zielony w kol. A,
bedziesz zapisywac w kol. Z wartosc pierwotna atrybutu z kol A.
Jak bedziesz chciala dokonac dzialania odwrotnego, to posluzysz sie danymi
z kol. Z.


Pozdrawiam.

krzysztof kwapisz

unread,
Nov 11, 2007, 1:46:19 PM11/11/07
to
Może inaczej czyli cofnięcie makra.W celu uaktywnienia cofania
polecenia/makra należy zastosować metodę OnUndo jako ostatnie działanie
makra. Metoda ta umożliwia zdefiniowanie tektu opisu który wyświetli się w
miejscu polecenia Cofnij, a także procedury jaka będzie wykonana po wybraniu
tego polecenia, np.

Application.OnUndo "Ostatnie Makro", "Bigos" 'to ostatnie to nazwa Twojego
makra.

Aby móc zrealizować to z opóźnieniem proponuje zastosować coś takiego:

Application.OnTime Now+TimeValue("00:00:15") 'Następna linijka zostanie
uruchomiona po '15 sek
Application.OnUndo "Ostatnie Makro", "Bigos" 'to ostatnie to nazwa Twojego
makra.

Powinno zadziałać, chociaż nie sprawdzone, bo pisane z ręki.

Pozdrawiam

perfetka

unread,
Nov 11, 2007, 2:05:08 PM11/11/07
to
Problem w tym, że ja nie wiem, w której kolumnie nastąpi zmiana.
Może wkleję moje makro:

Sub zaznacz()
'
' zaznacz Makro
' Makro zarejestrowane 2007-11-04, autor ghia
'
' Klawisz skrótu: Ctrl+w
'


Selection.Copy

With Application.ReplaceFormat.Interior

.ColorIndex = 4
.Pattern = xlSolid
End With
Cells.Replace What:=ActiveCell.Value, Replacement:="", LookAt:= _
xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=True

End Sub

"Bigos" może wystąpić na poniedziałkowy obiad, piątkową kolację lub niedzielne
śniadanie (przykładowo). Moje makro wyszukuje komórki o wartości takiej, jak
komórka na której właśnie znajduje się zaznaczenie. Jeśli zaznaczenie (kursor?)
jest na "bigosie" to po kliknięciu Ctrl+w zaznaczy mi wszystkie bigosy w całej
bazie na zielono. Jeśli zaznaczenie jest na "kanapkach" to zaznaczy mi
wszystkie kanapki w całej bazie. Dlatego nie mogę określić, że zmiany będą się
odbywać tylko w kol. B lub C

pxd74

unread,
Nov 13, 2007, 3:49:17 PM11/13/07
to
Użytkownik "perfetka" <ghiaWY...@buziaczek.pl> napisał w wiadomości
news:7f19.000000...@newsgate.onet.pl...

> Witam!
> Mam duży problem, nad którym siedzę już kilka dni i nic :(
> Mam bazę danych w excelu, która wygląda w ten sposób:
>
> DATA | SNIADANIE | OBIAD | PODWIECZOREK | KOLACJA |
> 2007-11-01 | kanapki | placki ziemn | lody z owocami| bigos |
> 2007-11-02 | owsianka | bigos | budyn czekol. |salatka grecka|
> 2007-11-03 |rog. z miodem| spaghetti | truskawki |kanapki
> |
(...)

Proponuję to zrobić bez angażowania VBA, bo tak będzie znacznie prościej.
Szukaną wartość wpisuj do jakiejś komórki w arkuszu (może być też w jakimś
innym arkuszu alternatywnie jako nazwany zakres danych). Przypuśmy, że jest
komórka G1 w tym arkuszu.
Zaznacz komórkę A1 i naciśnij Ctrl+A, aby zaznaczyć wszystkie komórki w
arkuszu (ważne aby komórka A1 była komórka aktywną). Wybierz menu Format ->
Formatowanie warunkowe. Po lewej stronie zamiast "Wartośc komórki jest"
wybierz "Formuła jest" i obok wpisz taką formułę:
=ORAZ(A1<>"";A1=$G$1)
Naciśnij przycisk Formatuj, aby odpowiednio ustawić kolor zielony
wypełnienia i naciśnij OK.

Teraz wpisz do komórki G1 szukany tekst i na zielono zostaną zaznaczone
wszystkie komórki zawierające ten tekst. Jeśli wyczyścisz tą komórkę, to
wszystko wróci do stanu poprzedniego.


--
Pozdrowienia
pxd74


perfetka

unread,
Nov 13, 2007, 5:35:43 PM11/13/07
to
Takie rozwiązanie chyba najbardziej by mnie zadowalało.
Niestety wyrzuca nieprawidłowe użycie Application.OnTime :(

perfetka

unread,
Nov 13, 2007, 5:49:31 PM11/13/07
to
Dzięki ale ja potrzebuję właśnie błyskawiczne wyszukiwanie dowolnego wyrazu
(bez wpisywania go w oddzielną komórkę). Ma to wyglądać tak, że najeżdzam na
dowolną nazwę, np "owsianka", naciskam skrót klawiaturowy i w tym momencie
wszystkie "owsianki" wpisane w arkuszu zostają podświetlone na zielono. Klikam
kolejny skrót klawiaturowy i owsianki przestają być podświetlone (wracają do
porzednich kolorów-brak koloru w przypadku dni powszednich, czerwony jeśli
weekend lub święto). Jadę "piętro wyżej" i jest tam np zupa ogórkowa-wciskam
kombinację 2 klawiszy i wszystkie zupy ogórkowe podświetlają się na zielono.
Klikam drugi skrót klawiaturowy i zupy przestają być podświetlone. I tak w
kółko. Jak już wspominałam, podświetlanie na zielono mam już zrobione i działa
bez zarzutu, brakuje mi funkcji "powrotnej", uwzględniającej pierwotne kolory
komórek.
Nie mogę jednak wrzucić nie zapisywania zmian przy zamykaniu czy zapisywaniu
arkusza, bo właśnie dopisałam jadłospis na kolejny dzień, więc gdybym nie
zapisywała zmian, to owszem, podświetlenia znikną ale również znikną
najświeższe wpisy. A muszę najpierw zapuścić makro wyszukujące, żeby nie
zapodać bigosu czwarty raz w ciągu tygodnia (albo np w siódmy wtorek pod rząd).
Aplikacji nie piszę dla siebie, takie dostałam wytyczne więc nie mogę
powiedzieć, żeby ta osoba wpisywała sobie inaczej niż by chciała, bo mi tak
będzie łatwiej. Mimo wszytko dzięki za rady.
Pozdrawiam

pxd74

unread,
Nov 14, 2007, 12:50:50 PM11/14/07
to
Użytkownik "perfetka" <ghiaWY...@buziaczek.pl> napisał w wiadomości
news:3ff2.000001...@newsgate.onet.pl...
(...)

> Jak już wspominałam, podświetlanie na zielono mam już zrobione i
> działa bez zarzutu, brakuje mi funkcji "powrotnej", uwzględniającej
> pierwotne kolory komórek.

Najprościej i najlepiej wykorzystać w tym celu właśnie formatowanie
warunkowe. W przypadku innych rozwiązań kod będzie bardzo długi i
niepotrzebnie skomplikowany.

Jeśli nie możesz/nie chcesz przechowywać danej wartości w jakieś komórce, to
wykorzystaj nazwy.
Wybierz polecenie menu Wstaw -> Nazwy -> Definiuj. W polu "Nazwy w
skoroszycie wpisz jakąś nazwę nie zawierającą spacji, np.: MojaNazwa, a w
polu "Odwołuje się do" wpisz:

=""

Naciśnij przycisk Dodaj, a następnie zamknij okno dialogowe "Definiowanie
nazw".
W dalszym kroku dodaj formatowanie warunkowe jak napisałem wcześniej
zmieniając tylko formułę na następującą:

=ORAZ(A1<>"";A1=MojaNazwa)

Dwa makra: zmieniające podświeltenie i usuwające będą wyglądały w ten
sposób:

Sub Zmień()
ActiveWorkbook.Names("MojaNazwa").Value = ActiveCell.Value
End Sub

Sub Wyczyść()
ActiveWorkbook.Names("MojaNazwa").Value = "="""""
End Sub

Zauważ ponadto, że nazwę możesz ukryć poprzez VBA uruchamiając taki kod:

ActiveWorkbook.Names("MojaNazwa").Visible = False

Nie będzie ona wtedy widczna w oknie "Definiowanie nazwy"


--
Pozdrowienia
pxd74

perfetka

unread,
Nov 14, 2007, 1:36:16 PM11/14/07
to
Zrobiłam wszystko dokładnie jak opisałeś i... makra działają w bardzo dziwny
sposób. Mianowicie znajdują tylko jeden tekst (zawartość komórki), dajmy na
to "owsianka" (w przypadku innych potraw nie reaguje :P), na dodatek zaznacza
tylko i wyłącznie owsiankę występującą w komórce H12 (a zapewniam, że tych
umownych "owsianek" jest co najmniej 20), co dziwi mnie bardzo, gdyż w żadnej z
czynności, którą wykonywałam (definiowanie nazwy, pisanie makr) nie pisałam nic
na temat komórki H12.
Tak jak pisałam wcześniej, nie działa to kompletnie na inne teksty. A zrobiłam
wszystko dokładnie jak opisałeś, najpierw pisałam z palca (oczywiście nie
bezmyślnie, starałam się rozważyć każdą linijkę), później zrobiłam od nowa
kopiując Twoje zapisy, ale ani tak ani tak nie działa. Tzn działa tak jak
opisałam.
Już sama nie wiem co mam robić. Masz może jakąs sugestię?
Dziękuję i pozdrawiam

P.S. Makro odznaczające działa chyba prawidłowo, w każdym razie odznacza
zaznaczoną wcześniej na zielono komórkę H12.
perfetka

pxd74

unread,
Nov 14, 2007, 3:14:12 PM11/14/07
to
Użytkownik "perfetka" <ghiaWY...@buziaczek.pl> napisał w wiadomości
news:520f.000000...@newsgate.onet.pl...

> Zrobiłam wszystko dokładnie jak opisałeś i... makra działają w bardzo
> dziwny sposób. Mianowicie znajdują tylko jeden tekst (zawartość
> komórki), dajmy na to "owsianka" (w przypadku innych potraw nie reaguje
> :P), na dodatek zaznacza tylko i wyłącznie owsiankę występującą w
> komórce H12 (a zapewniam, że tych umownych "owsianek" jest co najmniej
> 20), co dziwi mnie bardzo, gdyż w żadnej z czynności, którą wykonywałam
> (definiowanie nazwy, pisanie makr) nie pisałam nic na temat komórki H12.
> Tak jak pisałam wcześniej, nie działa to kompletnie na inne teksty. A
> zrobiłam wszystko dokładnie jak opisałeś, najpierw pisałam z palca
> (oczywiście nie bezmyślnie, starałam się rozważyć każdą linijkę),
> później zrobiłam od nowa kopiując Twoje zapisy, ale ani tak ani tak nie
> działa. Tzn działa tak jak opisałam.
> Już sama nie wiem co mam robić. Masz może jakąs sugestię?

Czy przed uruchomieniem makra Zmień masz zaznaczoną pojedynczą komórkę,
która nie zawiera wpisu "owsianka", a mimo to zaznaczana jest "owsianka" w
komórce H12?

Poza tym potrzebuję też takiej informacji:
Zaznacz komórkę, powiedzmy D1, wybierz menu Format -> Formatowanie
warunkowe, a następnie skopiuj i wklej do swojego postu formułę z
formatowania warunkowego. Wybierz też menu Wstaw -> Nazwa -> Definiuj,
zaznacz nazwę "MojaNazwa" i wklej tutaj zawartość pola "Odwołuje się do".

Możesz też przesłać mi na priva przykład.


--
Pozdrowienia
pxd74

perfetka

unread,
Nov 14, 2007, 3:56:46 PM11/14/07
to
Ogromne dzięki za pomoc!
Należą Ci się wielkie buziaki :)
Obeszłam ten błąd, wykorzystując Twoją pierwszą poradę (że też wcześniej na to
nie wpadłam-o ja durna :) ). Tzn formatowanie warunkowe przy wpisywaniu do
(umownej) komórki G1. Aby aplikacja działała tak jak tego potrzebuję,po prostu
zautomatyzowałam kopiowanie interesującej mnie komórki do komórki G1, a kolumnę
G ukryłam :) (może jeszcze zablokuję komórkę G1, żeby użytkownik przypadkiem
jej nie skasował). Jedno makro kopiuje wybraną przeze mnie komórkę do G1 (przez
co uruchamia się formatowanie warunkowe) , a drugie kasuje zawartość G1. Tak
więc działa tak jak potrzebuję :) Dzięki Tobie oczywiście. Dodatkowo ma to tę
przewagę nad wersją z definiowaniem nazwy, że nie wysypuje się w przypadku
próby przekopiowania pustej komórki (a w przypadku ActiveWorkbook.Names
("MojaNazwa").Value = ActiveCell.Value wyrzucało błąd kompilacji).

Pracuję jeszcze nad położeniem kursora-po kasowaniu zawartości G1 kursor
niestety tam zostaje a ja chcąc zaznaczać inne komórki muszę "jechać" przez
cały arkusz, który zawiera kilkaset linijek... Ale myślę, że z tym sobie już
poradzę.
Jeszcze raz ogromne dzięki!

Pozdrawiam

perfetka

pxd74

unread,
Nov 14, 2007, 4:33:56 PM11/14/07
to
Użytkownik "perfetka" <ghiaWY...@buziaczek.pl> napisał w wiadomości
news:520f.000000...@newsgate.onet.pl...
(...)

> Dodatkowo ma to tę
> przewagę nad wersją z definiowaniem nazwy, że nie wysypuje się w
> przypadku próby przekopiowania pustej komórki (a w przypadku
> ActiveWorkbook.Names ("MojaNazwa").Value = ActiveCell.Value wyrzucało
> błąd kompilacji).

No, ale nie napisałaś, że ktoś może mieć zaznczoną pustą komórkę przed
uruchomieniem makra :P
Można zmienić makro Zmień w ten sposób, aby się przed tym zabezpieczyć:

Sub Zmień()
If ActiveCell.Value = "" Then
MsgBox "Zaznaczyłeś pustą komórkę", vbCritical
Else


ActiveWorkbook.Names("MojaNazwa").Value = ActiveCell.Value

End If
End Sub


> Pracuję jeszcze nad położeniem kursora-po kasowaniu zawartości G1 kursor
> niestety tam zostaje a ja chcąc zaznaczać inne komórki muszę "jechać"
> przez cały arkusz, który zawiera kilkaset linijek... Ale myślę, że z
> tym sobie już poradzę.

Kod powienien wyglądać w ten sposób:

Sub Zmień()
ActiveSheet.Range("G1") = ActiveCell.Value
End Sub

Sub Wyczyść()
ActiveSheet.Range("G1").ClearContents
End Sub


--
Pozdrowienia
pxd74

pelkin

unread,
Jan 14, 2008, 5:16:51 PM1/14/08
to pxd74


On 13/11/2007 20:49, in article fhd2ln$dmh$1...@inews.gazeta.pl, "pxd74"
<px...@poczta.onet.pl> wrote:

Ciach


Wybierz menu Format ->
> Formatowanie warunkowe. Po lewej stronie zamiast "Wartośc komórki jest"
> wybierz "Formuła jest" i obok wpisz taką formułę:
> =ORAZ(A1<>"";A1=$G$1)
> Naciśnij przycisk Formatuj, aby odpowiednio ustawić kolor zielony
> wypełnienia i naciśnij OK.
>
> Teraz wpisz do komórki G1 szukany tekst i na zielono zostaną zaznaczone
> wszystkie komórki zawierające ten tekst. Jeśli wyczyścisz tą komórkę, to
> wszystko wróci do stanu poprzedniego.

Hej, pracuje nad podobnym formatowaniem warunkowym.

Jest to timesheet, co tydzien macro generuje liste kilkunastu pracownikow:
czyli: Numer + Nazwisko + DAY lub Night w jednej samej komorce
Jak ponizej:


Monday |Tuesday |Wednesday |etc
1. ktos Night |1. ktos Night |1. ktos Day
2. ktos Night |2. ktos Day |3. ktos Day
4. ktos Day |4. ktos Day |4. ktos Day
5. ktos Night |5. ktos Night |5. ktos Night
6. ktos Night |6. ktos Day |6. ktos Day
7. ktos Day |7. ktos Day |7. ktos Night
8. ktos Day |8. ktos Night |8. ktos Day
9. ktos Night |9. ktos Day |9. ktos Day
10. ktos Night |10. ktos Day |10. ktos Night

Potrzebuje w calym wygenerowanym arkuszu zaznaczyc wszystkie komorki w
ktorych wystepuje slowo Day na niebiesko a ze slowem Nigh na czerwono.

Probowalem samo formatowanie warunkowe, bylo by proste gdyby komorka
zawierala samo slowo daya nie zmienny numer spacja zmienne nazwisko day lub
night. Z gory dziekuje za pomoc

p.s dodam tylko ze nie znam, nigdy nie widzialem polskiego excela, formuly
po polsku dla mnie nie zrozumiale

pelkin

unread,
Jan 14, 2008, 6:54:36 PM1/14/08
to pelkin
On 14/01/2008 22:16, in article C3B18FD3.1644%pel...@gazeta.pl, "pelkin"
<pel...@gazeta.pl> wrote:
ciach

>Monday |Tuesday |Wednesday |etc
>1. ktos Night |1. ktos Night |1. ktos Day
>2. ktos Night |2. ktos Day |3. ktos Day
>4. ktos Day |4. ktos Day |4. ktos Da.y

>5. ktos Night |5. ktos Night |5. ktos Night
>6. ktos Night |6. ktos Day |6. ktos Day
>7. ktos Day |7. ktos Day |7. ktos Night
>8. ktos Day |8. ktos Night |8. ktos Day
>9. ktos Night |9. ktos Day |9. ktos Day
>10. ktos Night |10. ktos Day |10. ktos Night

>Potrzebuje w calym wygenerowanym arkuszu zaznaczyc wszystkie komorki w
>ktorych wystepuje slowo Day na niebiesko a ze slowem Nigh na czerwono.

>Probowalem samo formatowanie warunkowe, bylo by proste gdyby komorka
>zawierala samo slowo daya nie zmienny numer spacja zmienne nazwisko day lub
>night. Z gory dziekuje za pomoc

>p.s dodam tylko ze nie znam, nigdy nie widzialem polskiego excela, formuly
>po polsku dla mnie nie zrozumiale

Wymyslilem cos takiego : formatowanie warunkowe : formula:

=LEN(TRIM(A1))-LEN(SUBSTITUTE(A1,"Night",""))>0

Tylko to mi zaznacza komorki z night only - a chcialbym by od razu night
byly zaznaczone na czerono a day na niebiesko i nie tylko dla A, a dla
calego arkusza - pls jakies pomysly? Lepiej macro tylko od czego zaczac?


pozdrawiam


pxd74

unread,
Jan 22, 2008, 5:44:53 AM1/22/08
to
Użytkownik "pelkin" <pel...@gazeta.pl> napisał w wiadomości
news:C3B18FD3.1644%pel...@gazeta.pl...

> Potrzebuje w calym wygenerowanym arkuszu zaznaczyc wszystkie komorki w
> ktorych wystepuje slowo Day na niebiesko a ze slowem Nigh na czerwono.
>
> Probowalem samo formatowanie warunkowe, bylo by proste gdyby komorka
> zawierala samo slowo daya nie zmienny numer spacja zmienne nazwisko day
> lub night. Z gory dziekuje za pomoc

Ja bym zaznaczył komórkę A1 a następnie Ctrl+A, aby zaznaczyć wszystkie
pozostałe komórki (ważne aby komórka A1 była komórą aktywną). Nasepnie
uruchomiłbym formatowanie warunkowe i użył do jednego warunku takiej
formuły:

=NIE(CZY.BŁĄD(ZNAJDŹ("Day";A1)))

a do drugiego warunku takiej:

=NIE(CZY.BŁĄD(ZNAJDŹ("Night";A1)))


> p.s dodam tylko ze nie znam, nigdy nie widzialem polskiego excela, formuly
> po polsku dla mnie nie zrozumiale

Ja z kolei nie używam angielskich funckji, ale powinny one brzmieć w taki
sposób:

=NOT(ISERROR(FIND("Day",A1)))

Na przyszłość tutaj masz tłumaczenie funkcji angielskich i polskich:
http://excel.republika.pl/bazawiedzy/formuly/slownikfunkcji/slownikfunkcji.htm


--
Pozdrowienia
pxd74

0 new messages