vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest wtorek, 20 maja 2025 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

Left function, colour change in cells


otwartyotwarty rozpoczął: markos97 postów: 30



napisał: Trebor
postów: 1209


umieszczony:
19 listopada 2009
17:48

  
nazwa pliku rozmiar
Zeszyt2.rar 12.30 kB

Ok to nie była pełna informacja. Poprzednie zmiany należało także uwzględnić. Aby nie było niedomówień wklejam załącznik.
napisał: markos97
postów: 114


umieszczony:
19 listopada 2009
16:49

edytowany:
19 listopada 2009
16:52

  
Witka!
Teraz po zamianie procedury Change (tylko po tej zamianie bez wprowadzania tego co napisałeś poprzednio), jest tak; w arkuszu "z dop" kiedy nacisnę enter, niestety, ale w kolumnie z "checkmarkami" pojawi nam się "checkmark-krzyżyk" (czyli odpowiedź interpretowana jest jako błędna), dane w kolumnie "B", są zaś czyszczone, to dobrze; natomiast kiedy wprowadzony wyraz w kolumnie "B" jest poprawny w kolumnie obok pojawia nam się "checkmark-ptaszek" (jest to ważne w odniesieniu do tego co napiszę poniżej).

W arkuszu "z dop bez koloru" jest to samo co opisałem powyżej, ale kiedy wprowadzony w kolumnie "B" wyraz jest poprawny w kolumnie obok nie pojawia nam się "ptaszek", ale bez względu na to czy odpowiedź jest poprawna czy nie zawsze pojawia się tam "krzyżyk".

Nie wiem jednak czy miałem tylko zmienić procedurę Change, czy też może oprócz zamiany Change dodać to co pisałeś ostatnio:

Cytat:
Dim tekst As String

W zdarzeniu Private Sub Worksheet_Change(ByVal Target As Range) dopisz warunek (bold nowa linia)

If Target = "" Then Exit Sub
If Target.Value = tekst Then tekst = "": Exit Sub
Application.EnableEvents = False

Zdarzeniu Private Sub Worksheet_SelectionChange(ByVal Target As Range) taką linię:

Application.EnableEvents = True
tekst = Target.Value
Application.SendKeys ("{F2}{HOME}+{END}")


Ale jak się domyślam, bez tych zmian co ostatnio.
Zresztą, nawet po dodaniu tego co ostatnio, nie dało to pożądanego efektu.

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
19 listopada 2009
16:05

  
A jak zmienić procedurę Change na taką:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column <> 2 Then Exit Sub
If Target.Offset(0, -1) = "" Then Exit Sub
If Target = "" Then Exit Sub
Application.EnableEvents = False
If Target.Value = tekst Then Target.Value = "": Application.EnableEvents = True: Exit Sub
If UCase(Left(Target.Offset(0, -1), Len(Target.Offset(0, -1)) - 2)) <> UCase(Target) Then
    Target.Offset(0, 1) = "ý"
        Else
            Target.Offset(0, 1) = "?"
                End If
Target = ""

Application.EnableEvents = True

End Sub

napisał: markos97
postów: 114


umieszczony:
19 listopada 2009
15:21

edytowany:
19 listopada 2009
15:23

  
Witam!
Cytat:
[...] najłatwiej zrezygnować z wchodzenia w edycję komórki. Jeśli ktoś zechce pisać cały wyraz to po prostu to robi. Jeśli zechce dopisać tylko część niemiecką to wciska klawisz F2 i wpisuje. Prosto i bez komplikacji.
Czyli, jeśli dobrze rozumiem "zrezygnować z wchodzenia w edycję komórki", chodzi o to, aby skorzystać z arkusza bez edycji ("bez dop")? Tylko w takim razie po wciśnięciu F2 powinien pojawić się nam człon polski, a w arkuszu bez dopisywania przecież nie ma takiej opcji.
Cytat:

Jeśli jednak chcesz z edycją to [...]
W zasadzie nie ma to dla mnie większego znaczenia czy z edycją czy bez (chociaż tak naprawdę, właściwie to nie wiem jaka jest różnica). Natomiast w przypadku edycji; zastosowałem się do Twoich uwag, wprowadzając te zmiany. Generalnie dobrze, ale w sytuacji, kiedy nic nie zostanie nadpisane, owszem "checkmark-krzyżyk" się nam nie pojawi, ale też w kolumnie "B", gdzie odbywa się samo nadpisywanie człon polski, który samoczynnie pojawia się w momencie edycji komórki, już po zatwierdzeniu enterem, nie zostaje wyczyszczony! Próbowałem zmienić lokalizację linijki:
Target = ""

, ale bezskutecznie. Natomiast, gdy użytkownik cokolwiek wprowadzi w komórce, i jest to odpowiedź dobra lub zła, to wtedy owszem, wyraz w kolumnie "B", jest czyszczony.

Nie wiem jak rozwiązać to w samym kodzie. Na razie wiem tylko tyle, iż jeżeli zanim jeszcze nacisnę enter, i nacisnę backspace, czyli usunę wyraz, to wyrazu już tam nie będzie. Może podane przez Ciebie linijki z ostatniego postu trzeba przesunąć w inne miejsce, ale nie wiem, więc tylko mogę się domyślać.

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
17 listopada 2009
16:40

edytowany:
17 listopada 2009
16:42

  
Jeśli chodzi o "olewanie" dużych liter to miałem tylko na myśli MatchCase:=False (tak masz w kodzie).
Jeśli zamienisz False na True "olewanie" wielkości liter się zakończy i będzie precyzyjniej.
Co do drugiego to najłatwiej zrezygnować z wchodzenia w edycję komórki. Jeśli ktoś zechce pisać cały wyraz to po prostu to robi. Jeśli zechce dopisać tylko część niemiecką to wciska klawisz F2 i wpisuje. Prosto i bez komplikacji.
Jeśli jednak chcesz z edycją to:
Na samej górze modułu (poza procedurami) zadeklaruj zmienną tekst:

Dim tekst As String

W zdarzeniu Private Sub Worksheet_Change(ByVal Target As Range) dopisz warunek (bold nowa linia)

If Target = "" Then Exit Sub
If Target.Value = tekst Then tekst = "": Exit Sub
Application.EnableEvents = False

Zdarzeniu Private Sub Worksheet_SelectionChange(ByVal Target As Range) taką linię:

Application.EnableEvents = True
tekst = Target.Value
Application.SendKeys ("{F2}{HOME}+{END}")

ten sposób powinno przestać reagować na wejście i wyjście w edycję bez wprowadzania zmian.
Pozdrawiam
napisał: markos97
postów: 114


umieszczony:
17 listopada 2009
11:42

edytowany:
17 listopada 2009
13:55

  
Witka!
W takim razie zamieniłem odwołanie w tych umlautach na całą kolumnę, słuszna uwaga. Nie bardzo zaś chyba łapię to "olewanie" liter, widocznie chodzi tu o konflikt interesów, jeśli można się tak wyrazić. Racja, jeśli dobrze rozumiem, wystarczy, że wygląd kodu będzie taki jak poniżej:
Range("B:B").Replace What:="A`", Replacement:="Ä", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Range("B:B").Replace What:="U`", Replacement:="Ü", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Range("B:B").Replace What:="O`", Replacement:="Ö", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Range("B:B").Replace What:="S`", Replacement:="ß", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False


W tej sytuacji wypróbowałem zarówno dużych jak i małych liter; teraz chyba wszystko w porządku.
I owszem była to niekonsekwencja, dziękuję za spostrzeżenie, może i w tym wypadku obyło się bez konsekwencji, ale chodzi też o dokładność.

Cytat:

Masz do dyspozycji w tym przypadku dwie procedury zdarzeniowe do wykorzystania.
Worksheet_Change(ByVal Target As Range) i
Worksheet_SelectionChange(ByVal Target As Range)
Pierwsza się uruchomi gdy wejdziesz w edycję komórki, druga gdy tylko klikniesz na komórkę. Jeśli takie rozróżnienie nie wystarczy zamieść bieżący plik, aby stała się jasność. To samo dotyczy kodu który zamieściłeś.


Hm..., jak się domyślam takie coś chyba nie wystarczy. Ale też raczej nie ma potrzeby zamieszczania załącznika. Chodzi mi o arkusz o nazwie: "z dop", oraz arkusz "z dop bez koloru", które to arkusze zamieściłeś w Zeszyt2.rar

Samo dopisywanie zaś najprawdopodobniej zamienię w niedalekiej przyszłości z kolumny "B" do kolumny "C", "checkmark" z kolei do kolumny "E", ale to nie problem.

[Natomiast ten kod tak tylko zamieściłem bo wydaje mi się, że mogą być w nim pomocne rozwiązania. Jest tam taki warunek, że jeżeli aktywna komórka jest pusta to...; wydaje się, że niewiele brakuje, by zmodyfikować to, coś na kształt: jeżeli nie zostanie nic nadpisane, to... i przystosować do twoich kodów.]

Generalnie więc problem jest taki, aby w kolumnie z nadpisywaniem, naciskając enter (dobrze byłoby gdyby można wcisnąć także strzałkę kierunkową w celu przejścia), w kolumnie z "chekmarkami" nie pojawiał nam się "krzyżyk-checkmark" przy tego rodzaju akcji, gdzie nic nie zostaje nadpisane, a użytkownik jedynie chce przemieścić się do innej komórki. W skrócie: zła odpowiedź będzie zasygnalizowana tylko w przypadku kiedy użytkownik cokolwiek nadpisze, w przeciwnym razie brak "checkmarka". A poprawna odpowiedź, to wiadomo.

Może jeszcze odniosę się co do tego w jaki sposób miga sam kursor. Obecnie miga on na końcu edycji wyrazu. Wyszukałem sobie taki kawałek kodu:
Application.SendKeys "{f2}+^{home}"

Przy takim sposobie migania, kursor znajduje się na początku wyrazu, a nie na końcu, i dodatkowo jeszcze zaznaczony jest cały wyraz, dzięki czemu, w każdej chwili, jeśli się rozmyślimy, to możemy wyraz usunąć i napisać cały. Myślę, że może to być ciekawe urozmaicenie. A jeśli użytkownik będzie chciał tylko nadpisać część niemiecką, to wystarczy nacisnąć np. ctr+prawa strzałka kierunkowa, aby przenieść się na koniec wyrazu polskiego (chociaż trochę to niewygodne, lepiej byłoby gdbyby wyraz był podświetlony, ale kursor migał/znajdował się na końcu wyrazu polskiego; wtedy jeśli będziesz chciał(a) napisać cały wyraz, to po prostu go wpisujesz, a jeśli chcesz go tylko nadpisać, to naciskasz prawą starzłkę kierunkową, i już jesteś na końcu wyrazu polskiego, ale wyszukałem na razie tylko to co powyżej, i nie wiem co w tej linijce zmienić, aby tak się działo).

W porządku już dałem radę:
Application.SendKeys ("{F2}{HOME}+{END}")
'http://www.mrexcel.com/forum/showthread.php?t=143560

Trochę to potrwało, ale jest satysfakcja.


Sygnalizuję to teraz, bo zastanawiam się także nad zastosowaniem również tej opcji, a nie wiem czy może to mieć wpływ na powyższy problem (jeśli nie to w porządku, później wystarczy już w razie potrzeby ewentualnie zastąpić tylko twoją linijkę na moją).

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
16 listopada 2009
16:45

  
Cytat:

Ładnie wymyślone, ale... nie do końca? Sugerujesz zatem może jakieś zmiany?!

Przede wszystkim w kodzie zamiany sugerujesz "olewanie" dużych i małych liter a jednocześnie piszesz linie zamieniające duże litery na duże. To niekonsekwencja, która może mieć konsekwencje lub nie.
Cytat:

Piszesz, że przy wielu danych może to trochę potrwać. Trochę nie rozumiem o co tak dokładnie z tym chodzi, bo zamiana odbywa się tylko w jednej komórce

Zamiana to może i odbywa się w jednej komórce, ale aby jej dokonać funkcja wyszukująca musi przeszukać cały skoroszyt - cells. Może na początek zmień na jedną konkretną kolumnę. Zawsze to jakieś ograniczenie "akwenu" poszukiwań
Cytat:

A ha... Mam jeszcze takie pytanie, gdy chodzi o kod z dopełnieniem: mianowicie kiedy użytkownik znajdzie się w kolumnie "B", gdzie pojawia się to dopełnienie (miga kursor), to jeśli nic nie nadpisze i zatwierdzi enterem, to w kolumnie obok pojawi się "checkmark", sygnalizujący błędną odpowiedź,....

Masz do dyspozycji w tym przypadku dwie procedury zdarzeniowe do wykorzystania.
Worksheet_Change(ByVal Target As Range) i
Worksheet_SelectionChange(ByVal Target As Range)
Pierwsza się uruchomi gdy wejdziesz w edycję komórki, druga gdy tylko klikniesz na komórkę. Jeśli takie rozróżnienie nie wystarczy zamieść bieżący plik, aby stała się jasność. To samo dotyczy kodu który zamieściłeś.
Pozdrawiam
napisał: markos97
postów: 114


umieszczony:
16 listopada 2009
12:08

edytowany:
16 listopada 2009
15:16

  
Cytat:
Ładnie wymyślone, ale jest pewna niekonsekwencja związana z zakresami działania. Na początku stawiasz warunki, kiedy ma działać makro. Wychodzi, że zamiana ma być przeprowadzana w kolumnie 2 pod pewnymi warunkami. Natomiast w liniach wyszukiwania i zamiany nie ograniczasz się do kolumny B, a dokonujesz zamiany w całym arkuszu. Przy wielu danych może to trochę potrwać. [...]


Witam!
Ładnie wymyślone, ale... nie do końca? Sugerujesz zatem może jakieś zmiany?! Masz rację zamiana ma być przeprowadzana w kolumnie 2 (oczywiście podczas użytkowania przez użytkownika tego słownika, a dokładniej podczas testu poprawności/błędów; rzecz jasna podczas tworzenia przeze mnie samej bazy danych w kolumnie "A", to tam właśnie będzie odbywać się zamiana, ale w tym celu tylko kawałek tego ostatniego kodu).

Piszesz, że przy wielu danych może to trochę potrwać. Trochę nie rozumiem o co tak dokładnie z tym chodzi, bo zamiana odbywa się tylko w jednej komórce; kod podpięty zaś pod procedurę zdarzeniową, aby zamiana odbywała się już w trakcie wprowadzania danych. Przy tworzeniu samej bazy danych zakładałem pierwotnie, że użyję zwykłego kodu, i dopiero później za jednym zamachem wszystko zamienię (w tym wypadku miałoby to sens, że mianowicie działanie kodu ulegnie spowolnieniu), ale doszedłem do wniosku, że gdzieś mogę popełnić błąd (a chcę, aby słownik był bezbłędny) i wpadłem na pomysł tej procedury, bo przecież można to zamieniać na bieżąco. Miałem z tym trochę problemów, aby połączyć ten kod z twoim kodem, dlatego opisałem problem na forum, ale metodą prób i błędów w końcu się udało, przy okazji lepiej zrozumiałem budowę tych kodów.

A ha... Mam jeszcze takie pytanie, gdy chodzi o kod z dopełnieniem: mianowicie kiedy użytkownik znajdzie się w kolumnie "B", gdzie pojawia się to dopełnienie (miga kursor), to jeśli nic nie nadpisze i zatwierdzi enterem, to w kolumnie obok pojawi się "checkmark", sygnalizujący błędną odpowiedź, podczas gdy odpowiedź nie została w ogóle udzielona, a jedynie użytkownik zamierzał tylko przejść o komórkę poniżej (zdaję sobie sprawę z tego, że w kodzie jest warunek, iż dane w kolumnie z dopełnieniem muszą się zgadzać z kolumną "A"). Jedynym wyjściem z tej sytuacji, jest jak się wydaje, przejść za pomocą tabulatora, tudzież przy użyciu myszy, do kolumny obok, ominąć daną komórkę, i powrót do wybranej komórki kolumny "B".

Nie wiem czy istnieje prosty trik, aby jakoś temu zaradzić (to znaczy, "checkmark" sygnalizujący złą odpowiedź pojawiałby się, ale tylko, jeśli cokolwiek zostanie nadpisane, oczywiście w dodatku błędnie; być może wystarczy dodać coś w rodzaju warunek-wyjątek: jeżeli zostanie wciśnięty tylko enter, czyli nic poza tym nie zostanie nadpisane, to "checkmark-krzyżyk" by się nie pojawiał). Jeśli nie to w porządku, mam świadomość tego, że znowu trzeba by modyfikować kod. Tak tylko pytam.

Tak wstępnie wyszukałem taki kawałek kodu, coś mi mówi, że to będzie mniej więcej to, przynajmniej tak wygląda:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'http://www.excelbanter.com/archive/index.php/t-215751.html
Dim sComment As String
Set Target = Range("B:B")

If Intersect(ActiveCell, Target) Is Nothing Then Exit Sub

If Len(ActiveCell) = 0 Then
Application.SendKeys "{F2}"
Else
sComment = ActiveCell.Text
ActiveCell = sComment & vbLf
Application.SendKeys "{F2}"
End If
DoEvents

End Sub


Jeśli się nie mylę co do tego kodu, to gdyby ktoś pomógł, i ulżył cierpień przy jego modyfikacji i sklejaniu z tym co już mamy, serdecznie dzięki.


No chyba, że można jeszcze nieco inaczej. Jeżeli użytkownik nic nie wpisze w kolumnie "B", tylko naciśnie enter w celu przejścia do kolejnej komórki, w kolumnie "C" pojawi się "checkmark" sygnalizujący potencjalnie błędną odpowiedź, to "checkmark" ten zostanie wyczyszczony (tylko jeśli cokolwiek zostanie nadpisane, i gdy będzie dopisane błędnie to wtedy dopiero "checkmark" taki pojawi już się tam na stałe).

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
14 listopada 2009
20:22

  
Myślę, że oczekujesz jakiś uwag na temat Twojego makra.
Ładnie wymyślone, ale jest pewna niekonsekwencja związana z zakresami działania. Na początku stawiasz warunki, kiedy ma działać makro. Wychodzi, że zamiana ma być przeprowadzana w kolumnie 2 pod pewnymi warunkami. Natomiast w liniach wyszukiwania i zamiany nie ograniczasz się do kolumny B, a dokonujesz zamiany w całym arkuszu. Przy wielu danych może to trochę potrwać.
Na marginesie można wprowadzać różne znaki posługując się ich nr kodu. Jest to sposób bardzo niewygodny i stosowany dla pojedynczych symboli. Wciśnij i przytrzymaj lewy klawisz alt i z klawiatury numerycznej wpisz np. liczbę 0220 i puść klawisz alt. Powinno pojawić się Ü. Sposób przydatny bardziej poza Excelem, np na forum.

Pozdrawiam
napisał: markos97
postów: 114


umieszczony:
13 listopada 2009
10:55

edytowany:
13 listopada 2009
12:33

  
Witka!

W języku niemieckim mamy też takie coś jak przegłosy (umlauty Ü, Ä, Ö, ß, ü, ä, ö). Chyba najprościej wprowadzać je przełączając się między językami (oczywiście uprzednio należy zapoznać się niemieckim układem klawiatury). Ja wymyśliłem jednak coś nieco innego; napisałem sobie taki kod, i podpiąłem pod tę procedurę "checkmarka":
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column <> 2 Then Exit Sub
If Target.Offset(0, -1) = "" Then Exit Sub
If Target = "" Then Exit Sub
Application.EnableEvents = False
'http://www.herber.de/forum/archiv/256to260/t258883.htm
'wpisujesz literę, np. a, oraz apostof, ten na lewo od klawisza "1", co jest zamieniane na umlaut niemiecki
Cells.Replace What:="a`", Replacement:="ä", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="u`", Replacement:="ü", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="o`", Replacement:="ö", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="s`", Replacement:="ß", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="A`", Replacement:="Ä", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="U`", Replacement:="Ü", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="O`", Replacement:="Ö", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
Cells.Replace What:="S`", Replacement:="ß", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False
If UCase(Target.Offset(0, -1)) <> UCase(Target) Then
    Target.Offset(0, 3) = "ý"
        Else
            Target.Offset(0, 3) = "?"
                End If
Target = ""
Application.EnableEvents = True

End Sub



Z pozdrowieniami
napisał: markos97
postów: 114


umieszczony:
4 listopada 2009
15:07

edytowany:
16 listopada 2009
11:48

  
Witka!

Już w porządku, doszedłem z tym do ładu. Pomogli mi z tym drobiazgiem na innym forum:
http://www.coderscity.net/ftopic29971.html

Całość wzbogaci arkusz zaopatrzony w wyszukiwarkę wyrazów, zobacz tutaj:
http://www.coderscity.net/ftopic29878.html
W kolumnie "A" nowego arkusza, będą wyrazy, a w dowolnej komórce kolumny "B" będzie wpisywany wyraz do wyszukania.
Teraz, kiedy część techniczną mam już za sobą zabieram się za budowanie bazy danych. Jeśli już ją opracuję, a admin pozwoli, to oczywiście zamieszczę na forum; ewentualnie założę własną stronę internetową, i już tam będę co jakiś czas uaktualniać tę bazę. Oczywiście podam wtedy linka. Kto wie, może w przyszłości pokuszę się o napisanie innych słowników?!

Z pozdrowieniami
napisał: markos97
postów: 114


umieszczony:
3 listopada 2009
12:29

edytowany:
5 listopada 2009
16:57

  
Witam!

Generalnie masz rację. Teraz jak mi podałeś w ostatnim załączniku te dwa nowe arkusze, "bez koloru", to poradziłem sobie też z tymi rodzajnikami, bo to rzeczywiście dokładnie to samo, ale gdybyś tego nie zamieścił to nie wiem czy bym sobie poradził, bo jednak te dwa pierwsze arkusze, te z kolorem, działają nieco inaczej.

No właśnie i co do tych dwóch pierwszych arkuszy, mam jeszcze jeden problem. Otóż w jednej z kolumn, niech będzie to kolumna "C" muszę jeszcze utworzyć miejsce dla objaśnień/komentarzy; może przedstawię na przykładzie jak to ma wyglądać:
--------------A------------------------B---------------------C----------------
1-BASENSCHWIMMBECKEN05-------------------KOMENTARZ, b. pływacki09
2-BASENBETTSCHUSSEL05----------------------KOMENTARZ, brytwanna09
3-BIUROBURO05
4-BIUROREISEBURO05---------------------------KOMENTARZ, b. podróży09

Bazując na tych arkuszach, z ostatnio zamieszczonego przez ciebie załącznika, komentarze te umieszczę w każdym z arkuszy, np. w kolumnie "C", natomiast w tych arkuszach przeznaczonych na rodzajniki, będą one umieszczone w kolumnie "D" (bo w kolumnie "C" znajdują się wyrazy). Komórki w kolumnie "C" mają się podświetlać tak jak podświetlają się komórki w kolumnie "A".
We wszystkich arkuszach, już sobie z tym poradziłem, w ten sposób:
'...
Set WatchRange = Union(Range("A:A"), Range("C:C"))
'...
adres = Target.Address
End If

End Sub



W tych dwóch pierwszych arkuszach: "bez dop", "z dop", zamieszczonych przez Ciebie w tym ostatnim załączniku, wyskakuje błąd typu type mismatsch, gdy komórka jest pusta.

Myślę, że wystarczy zamienić ten warunek:
If adres <> "" Then



Hmm, tylko jak to zrobić?!

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
31 października 2009
18:35

  
nazwa pliku rozmiar
Zeszyt2.rar 17.81 kB

Według mnie w poprzednich przykładach masz już wszystko. Pozostaje tylko sklejać odpowiednie fragmenty.
Przykłady w załączniku.
Co do rodzajników to nie różni się to zbytnio od przykładu z ostatniego arkusza, poza kolorowaniem czcionki w pierwszej kolumnie. Dopisywanie literki d nie powinno też być problemem ponieważ to tylko uproszczenie makra z poprzedniego arkusza.
Pozdrawiam
napisał: markos97
postów: 114


umieszczony:
31 października 2009
12:15

edytowany:
31 października 2009
12:36

  
Witam!
Chyba źle się wyraziłem. Makro, które teraz zamieściłeś zmienia prezentację danych w kolumnie "A", tak?! Nie o to mi chodziło. Poza tym teraz w kolumnie "B" wyraz polski wyskakuje (człon niemiecki jest dopisywany), a potrzebna jest jeszcze opcja, kiedy użytkownik samodzielnie wpisuje cały wyraz.

Zatem jeszcze raz, od początku. Dane w kolumnie "A", które tam wprowadzę będą wyglądać tak:

-A
1POSEŁABGEORDNETER
2WIDOKANSICHT
3PALECZEHE

Człony polskie są np. 5 literowe. Kolor czcionki tych członów jest czarny. Kolor czcionki członów niemieckich jest biały (są one niewidoczne).

I dla takich danych chcę, aby wykonywało się to wszystko co sobie założyliśmy wcześniej. Czyli:

1. Po zaznaczeniu którejś z komórek w kolumnie "A", np. komórki "A1", komórka ta podświetla się na określony kolor (w momencie podświetlenia człon niemiecki staje się widoczny na tle danego koloru, ale tutaj czcionka tego członu niemieckiego nie robi się już czarna, tak jak to mieliśmy uprzednio; tutaj kolor czcionki tego członu pozostaje biały, a więc nic się nie dzieje, tylko podświetla się nam sama komórka), następnie gdy przechodzisz do innej komórki w kolumnie "A", np. do "A2", podświetlenie w komórce "A1" znika, a podświetla nam się komórka "A2".
2. W którejś z komórek kolumny "B", np. "B1" wpisujesz jakiś wyraz; po przejściu do innej komórki, np. "B2" wyraz w poprzedniej komórce czyli w "B1" zostaje wyczyszczony; i tutaj dwie wersje wprowadzania danych w kolumnie "B": cały wyraz wklepujesz samodzielnie (jedna wersja), i druga wersja: człon polski wyskakuje automatycznie, dopisujesz tylko człon niemiecki; w tym samym wierszu w kolumnie "E" pojawia się "checkmark", sygnalizujący dobrą lub złą odpowiedź.

I podobnie dla tych rodzajników niemieckich, dla których jednak utworzę osobną bazę danych w innym arkuszu. Dane wyglądają tak:

-A---------B-----------C-
1DER------------POSEŁABGEORDNETER
2DIE-------------WIDOKANSICHT
3DAS------------PALECZEHE

W kolumnie "A" mamy rodzajniki niemieckie, są one niewidoczne, gdyż kolor tej czcionki zaznaczyłem na biało. W kolumnie "C" mamy zlepek wyrazów polskiego i niemieckiego (czarny kolor czcionki, a więc przez cały czas będą one widoczne dla użytkownika), ale jest to nieważne, sygnalizuję jednak tylko, że w tej kolumnie takie coś się znajduje. I znowu ma się odbywać to wszystko co sobie wcześniej założyliśmy. Czyli:

1. Po zaznaczeniu którejś z komórek w kolumnie "A", np. komórki "A1", komórka ta podświetla się na określony kolor (w momencie podświetlenia człon niemiecki staje się widoczny na tle danego koloru), następnie gdy przechodzisz do innej komórki w kolumnie "A", np. do "A2", podświetlenie w komórce "A1" znika, a podświetla nam się komórka "A2.
2. W którejś z komórek kolumny "B", np. "B1" wpisujesz odpowiedni rodzajnik, który będzie odpowiadał wyrazowi znajdującemu się w kolumnie "C" (oczywiście wcześniej musisz się tego rodzajnika nauczyć); po przejściu do innej komórki, np. "B2" rodzajnik w poprzedniej komórce czyli w "B1" zostaje wyczyszczony; i tutaj dwie wersje wprowadzania danych w kolumnie "B": cały rodzajnik wklepujesz samodzielnie (jedna wersja), i druga wersja: automatycznie wyskakuje literka "D" (bo każdy rodzajnik zaczyna się właśnie na tę literę), a ty dopisujesz już tylko odpowiednią końcówkę "ER", "IE", bądź też "AS"; w tym samym wierszu w kolumnie "E" pojawia się "checkmark" sygnalizujący odpowiednio, czy wpisany przez nas rodzajnik w kolumnie "B", zgadza się, czy też nie z jego odpowiednikiem w kolumnie "A".

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
30 października 2009
20:39

  
Dla pierwszej części może coś takiego?
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Target.Column <> 2 Then Exit Sub
If Target.Offset(0, -1) = "" Then Exit Sub
If Target = "" Then Exit Sub
Application.EnableEvents = False
If UCase(Target.Offset(0, -1)) <> UCase(Target) Then
    Target.Offset(0, 3) = "ý"
        Else
            Target.Offset(0, 3) = "?"
                End If
Target = ""
Application.EnableEvents = True

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer
If Target.Column = 2 Then
If Target.Offset(0, -1) <> "" Then
    Application.EnableEvents = False
    For i = 1 To Len(Target.Offset(0, -1))
        If Target.Offset(0, -1).Characters(i, 1).Font.Color <> RGB(0, 0, 0) Then i = i - 1: Exit For
            Next i
        Target.Value = Left(Target.Offset(0, -1), i)
            Application.EnableEvents = True
                Application.SendKeys ("{F2}")
                    End If
End If

End Sub


Co do drugiej to nie rozumiem logiki działania.
Hej
napisał: markos97
postów: 114


umieszczony:
29 października 2009
12:53

edytowany:
30 października 2009
18:33

  
Witam!

Dzięki. Potrzebowałbym jeszcze jedną odmianę tego czego przedstawiłeś w załączniku. Chodzi mi o prezentację danych w kolumnie "A". Teraz wygląda to tak, że biała czcionka w członie niemieckim jest zamieniana przy podświetleniu komórki na kolor czarny. Dobrze byłoby gdyby kolor tej czcionki pozostał biały (wyraz polski będzie zatem czarny, a niemiecki biały; oczywiście wiąże się to z innym wprowadzaniem danych do arkusza, już bez tego nr określającego długość wyrazu polskiego). Reszta się nie zmienia, tak jak to jest w twoim załączniku. Oczywiście będzie to inna wersja tego słownika, użytkownik będzie miał wybór. Każdą wersję słownika zamieszczę rzecz jasna w dwóch osobnych dokumentach/ewentualnie arkuszach.

I jeszcze jedna zagwozdka. W języku niemieckim, wyrazy mają rodzajniki (der, die, das). Zachodzi potrzeba, aby w osobnym arkuszu stworzyć osobną dla nich bazę danych. Ja to widzę tak: w kolumnie "A" mamy rodzajnik (niewidoczny, biała czcionka), w kolumnie "C" natomiast będzie zlepek wyrazów polskiego z niemieckim, ale będzie on cały widoczny (czarna czcionka). W kolumnie "E" ma pojawiać się "checkmark", w momencie sprawdzania wyrazów. Generalnie to jest to samo co z załączniku (chodzi mi o ogólną zasadę działania), z tym że, w kolumnie "A" zmienia nam się forma danych. Makra, które są w załączniku nie zadziałają dla dwóch przedstawionych teraz przeze mnie przypadków, gdyż zostały napisane pod kątem nieco innej formy danych względem kolumny "A". Wiem, generalnie wszystko jest już napisane, cały zarys problemów został przez ciebie rozwiązany. Sam jednak, nie wiem co zmienić w tych kodach, aby przysposobić to do tego, o czym teraz piszę.

Jeszcze co do tych "check marków" zmieniłem ich lokalizację z kolumny "C" na kolumnę "E", dlaczego, o tym napiszę w instrukcji obsługi słownika, kiedy go już zakończę, i opatrzę pedagogicznym komentarzem.

Target.Offset(0, 3) = "ý"
        Else
            Target = ""
                Target.Offset(0, 3) = "?"



Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
28 października 2009
15:56

  
W zdarzeniu Private Sub Worksheet_Change(ByVal Target As Range) przesuń wiersz Target = "" przed wiersz Application.EnableEvents = True czyli poza warunek If.
Hej
napisał: markos97
postów: 114


umieszczony:
28 października 2009
15:09

edytowany:
28 października 2009
15:16

  
Generalnie wszystko w porządku, ale...

W wersji, z dopisywanym członem niemieckim, czy też w tej wersji, w której użytkownik wpisuje cały wyraz samodzielnie, jedno zastrzeżenie: wpisany w kolumnie B wyraz, ma zostać usunięty po/przy przejściu do kolejnej komórki kolumny B, bez względu na to czy jest on taki sam jak jego odpowiednik w określonej komórce kolumny A, czy też jest on różny od wyrazu w kolumnie A; obecnie jest tak, że w kolumnie B komórka zostaje wyzerowana, tylko wtedy gdy wpisany przez nas wyraz w kolumnie B jest dokładnie taki sam jak ten w kolumnie A (czyli wtedy gdy, np. B1=A1), a mnie chodziło o to, że co byśmy tam nie wpisali to zawsze określona komórka tej kolumny zostanie wyczyszczona (przepraszam, widocznie nie sprecyzowałem tego zbyt dokładnie, chociaż nie do końca, bo kod, który zamieściłem w ostatnim moim wpisie czyścił właśnie każdą komórkę kolumny B, myślałem, że wykorzystasz ten kod; określona komórka w kolumnie B ma zatem zostać zawsze wyzerowana).

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
27 października 2009
17:36

  
nazwa pliku rozmiar
Zeszyt1.rar 12.73 kB

Sprawdź w załączniku.
napisał: markos97
postów: 114


umieszczony:
26 października 2009
16:56

edytowany:
28 października 2009
15:17

  
Witam!
O to mi właśnie chodziło. Serdeczne dzięki, jesteś wielki!

W toku pracy wpadłem na jeszcze jeden pomysł (to już raczej ostatni). Jedno makro już sobie sam w tym celu poszukałem.

Otóż: klikamy na "B1"; wpisujemy tutaj wyraz, który znajduje się w "A1", np. POSEŁABGEORDNETER [oczywiście wyrazu tego musimy się wcześniej nauczyć; to narzędzie będzie nam służyć za coś w rodzaju "listy poprawności i (lub) błędów"];
Jeżeli wpisany przez nas wyraz w komórce "B1" jest taki sam jak w "A1", to w "C1" chciałbym, aby został automatycznie wstawiony "check mark" (i będzie to: "ptaszek", jeśli wpisaliśmy poprawnie; bądź też znak "x", jeśli wpisany przez nas wyraz zawiera błąd);
Następnie przechodzimy strzałką kierunkową/myszką/enterem (czym tam komu najwygodniej) do komórki poniżej, do "B2"; i tutaj znowu analogicznie, jak powyżej: wpisujemy wyraz, który jest w "A2", np. LINATAU; ale jednocześnie przechodząc z "B1" do "B2" wyraz POSEŁABGEORDNETER, wpisany przez nas przed chwilą w komórce "B1" zostaje usunięty (cała zawartość tej komórki), co osiągniemy przy pomocy poniższego kodu:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'http://www.eggheadcafe.com/software/aspnet/33950779/clear-contents-on-change.aspx
With Target
Select Case .Column
Case'column O
Application.EnableEvents = False
Cells(.Row, "B").ClearContents

Application.EnableEvents = True

End Select
End With

End Sub



Pseudo-kod napisany przeze mnie wyglądałby mniej więcej tak: jeżeli B1=A1; C1= v/x
Czyli jeżeli komórka B1 jest równa komórce A1 to w komórce C1 pojawia się "ptaszek"/"krzyżyk".

I jeszcze jedna uwaga, co do samego momentu wpisywania przez nas wyrazu w komórce "B1"; widziałbym tutaj dwie osobne tego wersje, mianowicie: cały wyraz wpisujemy samodzielnie (tak jak to opisałem powyżej), czyli np. POSEŁABGEORDNETER, a druga wersja ma być taka, iż po kliknięciu na "B1" automatycznie załaduje nam się w tej komórce przedrostek polski, np. POSEŁ; na końcu tego wyrazu powiedzmy, że będzie sobie migać kursor; użytkownik tylko nadpisuje wyraz niemiecki, a reszta odbywa się już tak jak pisałem powyżej (w kolumnie "C" pojawia się "ptaszek", następnie przejście do kolejnej komórki w kolumnie "B", jednocześnie czyszczenie poprzedniej komórki w tejże kolumnie); nie wiem tylko z jakiej lokalizacji następowałoby takie pobranie danych; można by wykorzystać do tego dane z kolumny "A:A", i zrobić to za pomocą czegoś w rodzaju jak chociażby funkcja "len"; no chyba, że prościej byłoby w jakiejś pustej kolumnie arkusza utworzyć taką listę danych wyłącznie z polskim wyrazem, i wtedy pobierać dane z tejże kolumny już bez żadnych "len-ów".

Co do tych "check marków" wyszukałem wstępnie, np. takie makro:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'http://www.yogeshguptaonline.com/2009/09/excel-macros-check-mark-symbols-with.html
'************************************************************************************
'* Macro recorded by Yogesh Gupta, smiley123z@gmail.com, Ygblogs.blogspot.com on September 16, 2009 *
'************************************************************************************
    
    If Not Intersect(Target, Range("G4:G14")) Is Nothing Then ' You can Change the range here
        
        Cancel = True
        
        With Target
            .Font.Name = "Wingdings"
            .Font.Size = 20
            .HorizontalAlignment = xlCenter
        End With
      
        If Target.Value = "?" Then
            Target.Value = "ý"
            
        Else
            Target.Value = "?"
        End If
    
    End If
    
End Sub


Ale w necie można znaleźć też wiele innych tego rozwiązań.

Do całego projektu dodaję jeszcze poniższe makro, które zamienia migający kursor na strzałkę.

Sub ChangeCursor4()
   'http://en.allexperts.com/q/Excel-1059/hidden-cursor.htm
   Application.Cursor = xlNorthwestArrow
End Sub



Z pozdrowieniami


<-wstecz  1 2  dalej->
wszystkich stron: 2


Sortuj posty: z