napisał: Trebor postów: 1209
umieszczony: 19 listopada 2009 17:48
|
|
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ę:
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
|
|
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
|
|
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:
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ę.
Z pozdrowieniami |
|
wszystkich stron: 2
|
|