Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Excel VBA - jak w okienku textbox zaznaczyć tekst

marek003 08 Lip 2009 21:40 13984 20
  • #1 08 Lip 2009 21:40
    marek003
    Poziom 40  

    Mam funkcję sprawdzającą która sprawdza czy wprowadzona dana jest liczbą. Jeżeli jest źle ma krzyczy żeby poprawić i wraca do textbox'a.

    Code:

    If IsNumeric(UserForm1.TextBox1.Value) = False Then
        MsgBox "Złe dane. Popraw."
        UserForm1.TextBox1.SetFocus 'TO TU
    Else
        UserForm1.TextBox1.Value = CStr(Round(UserForm1.TextBox1.Value, 2))
        Range("a1").Value = CDbl(UserForm1.TextBox1.Value)
    End If


    W moim przykładzie po naciśnięciu ok na komunikacie z błędem kursor wraca do textbox'a ustawiając się na końcu.

    Jak zrobić by po powrocie do textboxa tekst w nim zawarty był zaznaczony w całości? (Tak jak ma to miejsce kiedy "skacze" się między wypełnionymi textboksami klawiszem TAB - wtedy tekst w boxie zaznacza się cały).

    0 20
  • #2 08 Lip 2009 22:17
    adamas_nt
    Moderator Programowanie

    Jeśli krzyczy, że źle to usuń zawartość =Null (przecież trzeba poprawić) i dopiero SetFocus

    Shift+Tabulator można wysłać SendKey'em (kilka razy, jeśli trzeba przejść kilka TextBox'ów), ale wg. mnie wystarczy wyczyścić pole i ustawić fokus.

    0
  • #3 08 Lip 2009 22:17
    528649
    Użytkownik usunął konto  
  • #4 09 Lip 2009 13:33
    marek003
    Poziom 40  

    Code:
    TextBox1.InputType = xlNumber 


    Textbox w VBA excela nie posiada takiej właściwości.

    Co do usuwania wpisanej wartości to owszem. Ale chciałem ją pozostawić, żeby ktoś zobaczył co wpisał, a poprzez pełne zaznaczenie wystarczy zacząć jeszcze raz wprowadzać dane a stary wpis jest zastąpiony.

    Ostatecznie zrobie z wyczyszczeniem okna, ale myślałem że jest jakiś sposób (właściwość w stylu select).

    0
  • #5 09 Lip 2009 19:53
    marek003
    Poziom 40  

    Mam kolejny kłopot.
    Pomimo "SetFocus" kursor nie wraca do okna z błędem.
    Co jest nie tak?

    Code:
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    

    If IsNumeric(Okno.TextBox1.Value) = False Then
    MsgBox "popraw"
    Okno.TextBox1.SetFocus
    End If
    End Sub


    Przechodzę między textbox'ami enterem (tak docelowo będzie to robić pani obsługująca raport). W pierwszym okienku wpisuje tekst - formuła sprawdza czy liczba - krzyczy popraw - ok i .... jestem w kolejnym textbox'ie. (jak nacisnę myszką na przycisk to też jestem na przycisku a nie w błędnym textbox'ie. Gdzie jest błąd formuły?

    Wszystko jest niby dobrze z fokusem jeżeli ten powyższy kod wstawię pod przyciskiem. Ale chciałem to tak zrobić by już po wyjściu z danego textbox'a (zatwierdzeniu danych enterem i przejściu do kolejnej danej) wyrzucało mi komunikat popraw i pozostawało w edycji tego textbox'a a nie w kolejnym.

    0
  • #6 14 Lip 2009 13:04
    walek33
    Poziom 28  

    marek003 napisał:

    Mam kolejny kłopot.
    Pomimo "SetFocus" kursor nie wraca do okna z błędem.
    Co jest nie tak?
    Code:

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If IsNumeric(Okno.TextBox1.Value) = False Then
    MsgBox "popraw"
    Okno.TextBox1.SetFocus
    End If
    End Sub



    Przenieś to do TextBox1_Change() i fokus będzie. Możesz pominąć
    Code:

    Okno.TextBox1.SetFocus

    0
  • #7 14 Lip 2009 15:04
    marek003
    Poziom 40  

    walek33 napisał:


    Przenieś to do TextBox1_Change() i fokus będzie. Możesz pominąć
    Code:

    Okno.TextBox1.SetFocus


    To też zauważyłem tylko że i to rozwiązanie nie do końca spełnia moje oczekiwania bo pomimo tego że pojawi sie monit "POPRAW" daje ok i tab (czyli nie poprawiam danej tylko idę do kolejnej komórki) i .... nie było "Change" więc nie ma sprawdzenia i przepuszcza błąd.

    Docelowo zrobiłem sprawdzanie w przycisku OK. Jak coś jest nie tak wstrzymuje działanie daje focus na okno przed i wciska Tab dzięki czemu błędny tekst zostaje podświetlony.

    0
  • Pomocny post
    #8 14 Lip 2009 16:30
    adamas_nt
    Moderator Programowanie

    Spróbuj z anulowaniem zdarzenia (Cancel=True)

    Code:
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    

    If IsNumeric(Okno.TextBox1.Value) = False Then
    MsgBox "popraw"
    Cancel = True
    End If
    End Sub

    0
  • #9 15 Lip 2009 12:08
    marek003
    Poziom 40  

    Dzięki adamas_nt
    To jest strzał w 9. :)
    Nie da się opuścić okienka jeżeli się nie wpisze poprawnej wartości. Cymuś.
    Szkoda tylko że nie zaznacza tekstu - ale już z tym się pogodziłem.
    Dzięki.

    -1
  • Pomocny post
    #10 15 Lip 2009 13:14
    walek33
    Poziom 28  

    Cytat:

    Szkoda tylko że nie zaznacza tekstu - ale już z tym się pogodziłem.


    Nie gódź się ze wszystkim tak łatwo. Obsługę zaznaczenia tekstu zrealizujesz wpisując pod wierszem Cancel = True

    Code:

    Okno.TextBox1.SelStart = 0
    Okno.TextBox1.SelLength = Okno.TextBox1.TextLength


    To powinno załatwić spędzający Ci sen z powiek problem :D

    0
  • #11 15 Lip 2009 18:08
    marek003
    Poziom 40  

    Dobre.
    Ustaw początek zaznaczania na 0 (SelStart),
    zaznacz znaki w ilości (SelLength) równej długości tekstu (TextLength)
    Przy okazji poznałem funkcę/właściwość SelText

    To ta ostatnia 1 do do strzału w 10 :)

    Dzięki.

    0
  • #12 15 Lip 2009 18:31
    walek33
    Poziom 28  

    Cieszę się, że choć raz się do czegoś przydałem. A może są jeszcze jakieś problemy w których mogę pomóc?

    0
  • #13 15 Lip 2009 20:13
    marek003
    Poziom 40  

    Zapewne kolejne problemy przyjdą z czasem. Chociaż ... to właściwie temat pokrewny.
    Mianowicie:
    Maska wprowadzania w textboxie excela.

    Np. pod NIP "999-99-99-999" czy np. "000-00-000-00"
    Akces ma to wbudowane a excel ...
    Chodzi o to by wprowadzać tylko liczby i ewentualnie "-" (bo jak się nie wprowadzi "-" to i tak powinno wyświetlić się 999-99-99-999) Po wprowadzeniu 10 cyfr nie może przyjmować kolejnych liczb.
    Kombinowałem z
    textBox1.Value = Format(wartość, format)
    ale owszem standardowe formaty ładnie wyświetla (data, ilość miejsc po przecinku, odstęp tysięcy itp.) ale maska to trochę co innego.

    0
  • #14 16 Lip 2009 11:59
    walek33
    Poziom 28  

    Swego czasu była dostępna w necie kontrolka nazywająca się Super Text z numerkami (chyba 1.1...). Ma w sobie to co TextBox i jeszcze więcej. :D Spróbuj walki z nią.

    ---
    2009-07-17
    No dobrze. Może inny sposób, bo nie dawało mi spokoju, że nie można użyć standardowych kontrolek. Spróbuj połączyć w jedno:
    - Twoja kontrola wprowadzania wartości liczbowej z ograniczeniem ilości wprowadzonych znaków do dziesięciu realizowane w "TextBox_Exit",
    - kod poniżej.

    Code:

    TextBox1.Text = Format(TextBox1.Text, "###-##-##-###")

    Po wprowadzeniu do TB dziesięciu cyfr bez dodatkowych znaków zobaczysz efekt. Nie jest to oczywiście maska w całym tego słowa znaczeniu. Ale awaryjnie może być. Znaczy ograniczenie, o którym pisałem wyżej, nie w funkcji tylko we właściwościach TB.

    ---
    Dodane po jakimś ? czasie
    Rozwiązanie to ma jednak parę upierdliwości, które można ominąć. Jedną z nich jest np. powtórne wejście do prawidłowo wypełnionego TB. TB_Exit nie pozwala z niego wyskoczyć. Czego się jednak nie da zrobić. Moim zdaniem powinien być zastosowany dodatkowy If, w którym zagnieżdżony jest Twój. Warunek dla dodatkowego to:
    Code:

    If Len(TextBox1.Text) = 13 Then

    Pozwoli on na przejście dalej, gdy w TB będzie 13 znaków. Sam TB nie pozwoli wprowadzić więcej niż 10 i w dodatku same cyfry, więc nie ma możliwości pomyłki. Jeśli się mylę poprawcie mnie proszę.
    A tak na marginesie to wychodzi nam całkiem niezły tutek w temacie obsługi TextBox-a :D

    ---
    Dodane trochę później
    Jako że każdy wiek ma swoje prawa to i mnie dopada skleroza. Zapomniałem Ci podpowiedzieć, że ustawiając właściwość "Text" TB na "___-__-__-___" uzyskasz (przynajmniej przy odpaleniu formy) maskę. Co prawda wprowadzi ona w błąd użytkownika i może doprowadzić go do białej gorączki, bo będzie chciał wprowadzać NIP z kreskami a TB mu na to nie pozwoli, ale maska będzie i umożliwi przejście przez TB bez wpisu (czasami może być konieczne).

    0
  • #15 16 Sty 2011 21:20
    norek511
    Poziom 9  

    użyłem wskazówek z zaznaczaniem błędnych danych w textboxie.. nawet zaznacza mi błędny tekst, ale nie pojawia się kursor.. więc i tak muszę kliknąć, żeby móc poprane dane wpisać..
    gdzie mam to ustawić, bo domyślam się, że gdzieś w ustawieniach textboxu, ale nie mogę znaleźć gdzie ;/

    0
  • #16 16 Sty 2011 22:12
    marek003
    Poziom 40  

    Strasznie stary temat odświeżasz.
    Jak masz zaznaczony cały tekst w textbox'ie to po prostu zacznij pisać z klawiatury. Nie czekaj na kursor. Ten zabieg był po to by pokazać błędny tekst i móc zacząć go wprowadzać od początku, a w przypadku poprawy jednego znaku i tak musisz go wskazać myszką.

    0
  • #17 17 Sty 2011 10:23
    norek511
    Poziom 9  

    Wiem do czego służyły powyższe przykłady..
    Ale własnie na tym polega mój problem, ze zaznaczy txt, ale jak zaczynam pisać to nic sie nie dzieje..!! Nie zamienia podswietlonego tekstu..!! ;)
    Ktoś ma jeszcze jakieś pomysły?!

    0
  • #18 17 Sty 2011 11:04
    walek33
    Poziom 28  

    A opcja Locked jaką ma wartość?

    0
  • #20 17 Sty 2011 11:32
    walek33
    Poziom 28  

    Sugeruję więc założyć swój temat w którym podepniesz przykładowy plik z niedziałającym TextBox-em. Ma to tę zaletę, że pojawi Ci się przycisk Pomógł, którego będziesz mógł użyć w odpowiednim momencie. ;)

    0
  • #21 17 Sty 2011 16:35
    norek511
    Poziom 9  

    Znalazłem juz rozwiazanie.. a osoba, która mi pomogła przynajmniej nie wymaga klikania pomógł.. zwykle dziękuje wystarczyło.. ;)

    0