Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla 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

08 Lip 2009 21:40 14545 20
  • 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).
  • 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.
  • Użytkownik usunął konto  
  • 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).
  • 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.
  • 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
  • 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.
  • Pomocny post
    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
  • 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.
  • Pomocny post
    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
  • 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.
  • 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?
  • 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.
  • 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).
  • Poziom 10  
    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 ;/
  • 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ą.
  • Poziom 10  
    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?!
  • Poziom 28  
    A opcja Locked jaką ma wartość?
  • 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. ;)
  • Poziom 10  
    Znalazłem juz rozwiazanie.. a osoba, która mi pomogła przynajmniej nie wymaga klikania pomógł.. zwykle dziękuje wystarczyło.. ;)