Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Excel
  Textbox in Userform: Gültigkeit/aktiv

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Textbox in Userform: Gültigkeit/aktiv (5595 mal gelesen)
Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 05. Feb. 2007 11:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

ich habe ein kleines Problem mit einer Textbox in einer Userform. In die Box soll eine Dezimalzahl eingegeben werden; auf der Userform befinden sich weiter Boxen, OptionButtons usw., die danach angesprochen werden können/sollen.

Was ich suche, ist eine halbwegs elegante Lösung, den Inhalt der Textbox auf Gültigkeit zu prüfen (das kriege ich mit isnumeric hin) und der Cursor soll dabei in dieser Textbox bleiben; der User wird über eine msgbox über die ungültige Eingabe informiert ->neuer Versuch, bis... ;-)

Wenn ich mit "_Change()" arbeite, reagiert die Form etwas nervig; nun bin ich auf folgendes gekommen:

Code:
Private Sub txtHoehe_AfterUpdate()

If Not IsNumeric(frmXXX.txtHoehe.Value) Then
    MsgBox "Keine gültige Zahl für die Höhe eingegeben!", vbOKOnly + vbInformation, "Fehler"
    'txtbox erneut aktivieren!!!
    Hoehe = 9999 'beliebiger, unsinniger Wert
End If

End Sub


Der User gibt einen Wert (Text oder Zahl) ein und drückt Tab/Enter. Der Cursor springt in (meinem Fall) die nächste Textbox. Dann taucht die msgbox auf. War der Wert unzulässig (also keine Zahl), soll die Eingabe wiederholt werden. Bei meiner Variante muß der Nutzer jedoch jedesmal die Textbox txtHoehe erneut anklicken. Die Textbox soll also aktiv bleiben -bzw. re-aktiviert werden, bis die Eingabe passt.

Ist zwar nur eine Kleinigkeit - aber es nervt und ich bin neugierig, ob es auch schöner geht.

Gruß,
Frederik

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

okl
Mitglied
Wirtsch-Ing (Maschbau)


Sehen Sie sich das Profil von okl an!   Senden Sie eine Private Message an okl  Schreiben Sie einen Gästebucheintrag für okl

Beiträge: 157
Registriert: 21.04.2006

3,6 GHz, 2 GB RAM, NVIDIA Quadro FX 1300, Delmia V5R16 SP1, Win XP Prof SP2, Office 2003, VS 2005, VB 6

erstellt am: 05. Feb. 2007 11:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

Moin!

Wie wär's mit

Code:
txtBox.SetFocus
?

Gruß, Ole

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 05. Feb. 2007 11:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hey Ole,

Nee - leider nicht! Der Cursor bleibt hartnäckig in txtbox2 stehen, hatte ich schon probiert ;-(

Gruß,
Frederik

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

okl
Mitglied
Wirtsch-Ing (Maschbau)


Sehen Sie sich das Profil von okl an!   Senden Sie eine Private Message an okl  Schreiben Sie einen Gästebucheintrag für okl

Beiträge: 157
Registriert: 21.04.2006

3,6 GHz, 2 GB RAM, NVIDIA Quadro FX 1300, Delmia V5R16 SP1, Win XP Prof SP2, Office 2003, VS 2005, VB 6

erstellt am: 05. Feb. 2007 11:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

Also bei mir funzt
Code:
Private Sub TextBox5_Change()
    If Not IsNumeric(TextBox5.text) Then
        TextBox5.SetFocus
    End If
End Sub


doch schon recht gut - nur eben nicht mit MsgBox etc. Du benutzt Value als Mittel der Wahl und ich Text. Liegt's daran? Wer kennt den Unterschied?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

okl
Mitglied
Wirtsch-Ing (Maschbau)


Sehen Sie sich das Profil von okl an!   Senden Sie eine Private Message an okl  Schreiben Sie einen Gästebucheintrag für okl

Beiträge: 157
Registriert: 21.04.2006

3,6 GHz, 2 GB RAM, NVIDIA Quadro FX 1300, Delmia V5R16 SP1, Win XP Prof SP2, Office 2003, VS 2005, VB 6

erstellt am: 05. Feb. 2007 11:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

So, jetzt hab ich's:

Code:
Private Sub txtBox_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsNumeric(txtBox.text) Then
'ist gar nicht nötig        txtBox.SetFocus
        Cancel = True
    End If
End Sub

Bitte schön

[Diese Nachricht wurde von okl am 05. Feb. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 05. Feb. 2007 12:48    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

Hallo,

hatte letztens mal rumgeknobelt, wie man das direkt im Change() der Textbox
machen könnte, also wen(n) es interessiert, noch ein etwas anderer Weg:
http://ww3.cad.de/foren/ubb/Forum258/HTML/000787.shtml#000004

Grüsse, Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 05. Feb. 2007 14:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@Ole: Funzt soweit - Danke schön  !

Hier mal der Code aus startreks link:

Code:
Option Explicit
Private re As Object

Private Sub UserForm_Initialize()
    Set re = CreateObject("vbscript.regexp")
    re.Pattern = "^-?\d*\.?\d*$"
End Sub

Private Sub TextBox1_Change()
    With TextBox1
        If .TextLength > 0 And Not re.test(.Text) Then .Text = Mid(.Text, 1, .TextLength - 1)
    End With
End Sub


Die zweite sub verstehe ich ja zumindest halbwegs - bei der ersten muß ich leider passen  . Was passiert da? Ich würde es gerne verstehen; wenn Du magst, gib doch bitte der Erbse zwischen meinen Ohren 'nen kurzen Schubser...

[thedit]Nur so, für den Hinterkopf: Wer lässt sich sowas einfallen - sprich: Wer hat's erfunden? [/thedit]

Gruß,
Frederik

[Diese Nachricht wurde von Paulchen am 05. Feb. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 05. Feb. 2007 15:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Paulchen:
... wenn Du magst, gib doch bitte ...

... mach' ich, aber erst heute abend, und der Bernd prüft dann auf Richtigkeit;-)

lg Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 05. Feb. 2007 17:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Ich bin da noch über was gestolpert - bzw. geschubst worden. Mal sehen, ob und wieviel davon hängengeblieben ist. Wo fange ich an? Hier...

^-?\d*\.?\d*$

^  Anfang der Zeichenfolge
$  Ende der Zeichenfolge -was die Sache schon wesentlich vereinfacht;-) . Der
-  darf bis zu einmal vorkommen,d.h. maximal eine Wiederholung, dann folgen mit
d*  beliebig viele Ziffern.
.?  darf bis zu einmal vorkommen, und nochmal beliebig viele Ziffern. Puh. Wenn das bis hierher stimmt, dann wären demnach mit -?\d*\.?\d* z.B. folgende Eingaben zugelassen:

1.1
1,1
1a1
11
1111111
111.111
...
und das ganze dann noch mit negativem Vorzeichen: "-"??? Eieiei... Ich kann nur hoffen, daß das mit dem hier erwähnten Forum was wird... Danke an ruebe   für den link! So, ich bitte um rücksichtslose Zurechtweisung, falls in meinen obigen Ergüssen der Wurm drin sein sollte !

@trekkie: Hoffe, Du nimmst mir meine Gehversuche nicht als Vorgriffe übel - aber so hast Du heute abend hoffentlich etwas weniger zu tun; was ich allerdings immer noch nicht begriffen habe, ist die Zeile mit

Zitat:
Set re = CreateObject("vbscript.regexp")
[...bzw. in sub 2...]
... re.test(.Text)...
Ich wundere mich, warum es funktioniert... Also, wie Du siehst, ist die Erbse etwas ins Rollen gekommen - es reicht aber noch nicht ;-(

Gruß,
Frederik

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Thomas Harmening
Moderator
Arbeiter ツ




Sehen Sie sich das Profil von Thomas Harmening an!   Senden Sie eine Private Message an Thomas Harmening  Schreiben Sie einen Gästebucheintrag für Thomas Harmening

Beiträge: 2897
Registriert: 06.07.2001

Das Innerste geäussert
und aufs Äusserste verinnerlicht

erstellt am: 05. Feb. 2007 17:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

;-)... Finde es ja schade, das Mengenlehre nimmer gelehrt wird ;-)
Wiki - Regulärer_Ausdruck -have fun! ;-)

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 05. Feb. 2007 19:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

         
Zitat:
Original erstellt von Paulchen:
So, ich bitte um rücksichtslose Zurechtweisung, falls in meinen obigen Ergüssen der Wurm drin sein sollte          !

Klar eyy, ich weise mal rücksichtslos ...;-)

Also Frederik schonmal ganz gut, aber nicht ganz stimmen tun bei -?\d*\.?\d*
die 1,1 und die 1a1.

Code:

? ==> keinmal oder einmal
* ==> keinmal oder mehrmal

'd.h. für das Pattern ^-?\d*\.?\d*$ gilt:

^ ==> 'Start of string' unmittelbar gefolgt!! von:
-? ==> kein oder ein '-' (Minus)
\d* ==> kein oder mehrere digits
\.? ==> kein oder ein '.' (Punkt)
\d* ==> kein oder mehrere digits
$ ==> unmittelbar beendet!! mit 'End of String'

'...[mit ^ und $ ist also die Eingabe/das gültige Schema von Anfang-Ende festgezurrt, Platz für Spielraum im String gibt es absolut keinen mehr] ...


Es werden/sind also mal vereinfacht gesagt zugelassen:

Code:
[-].####
[-]#.###
[-]#####

Wobei immer gilt, bei jeder Eingabe eines neuen Zeichens in der Textbox,
beginnt die RE den kompletten String von links nach rechts erneut zu prüfen.
Es werden also keine einzelnen [hinzugekommenen] Zeichen geprüft,
sondern immer der aktuelle Eingabestring als Gesamtes.

Zum:
> Set re = CreateObject("vbscript.regexp")

Das ist der late Binding Ausdruck für die M$ VBScript Regular Expressions (5.5) Bibliothek,
du kannst dir unter Menue > Extras > Verweise da auch einen Haken setzen, dann hiesse die Zeile:

Code:

Dim re as Object
Set re = CreateObject("vbscript.regexp")

'einfach:
dim re as New RegExp


> re.test(.Text)

test() ist einfach eine Methode/Funktion der o.g. dll/Bibliothek, welche einen Boolean zurückgibt:

wahr == wenn der zu prüfende Ausdruck mit dem Muster/Pattern übereinstimmt, also matched
falsch == wenn der zu prüfende Ausdruck nicht übereinstimmt / no match.
Siehe auch: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/jscript        7/html/jsjsgrpregexpsyntax.asp
[die VB-Teile hab ich grade nicht gefunden, aber jscript ist ähnlich bei M$;;;-))))]

Wenn du die Bibliothek 'hart verdrahtet' also den Verweis angehakt hast, kannst Du Dir via <F2> auch den Objektkatalog anschauen.

>[thedit]Nur so, für den Hinterkopf: Wer lässt sich sowas einfallen -
> sprich: Wer hat's erfunden? [/thedit]

**Puzzled**, ... die Schweizer?;-)
Weiss nicht, wie die Frage gemeint war, was den Code für das Change()Ereignis der TB anging,
das war mal eine Session mit Nepumuk, er hat den Standard-KeyPress genommen und ich parallel mich an RegExp versucht. Nepumuk war natürlich viel früher fertig mit seinem Code als ich,
dann haben wir zusammen noch ca. 2-3h rumgedoktert, weil das recht tückisch war [synchron im change() prüfen]. Aber - als es dann ging, ging's mit 'nem fast One-Liner;;-))
(Oder was meintest Du?)

cu & lg Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 05. Feb. 2007 20:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

***Schluck*** Puuh, 'ne Menge an Information. Sehr schön, danke - soviel mal vorweg.

Mein Denkfehler ist mir noch aufgefallen. Ich hatte den . als wildcard betrachtet;-( 

Zitat:
Das ist der late Binding Ausdruck für...
Nun ja, die ländliche Gegend in Böhmen scheint echt nett zu sein - wollte da schon immer mal hin  . Werde das testen...

Die Sache mit dem ...test... hatte ich mir fast schon gedacht, so blöd das auch klingen mag; leider funktioniert hier - wie auch gelegentlich andernorts - die "Auto-Ergänzung" im VBA-Editor nicht; das nur nebenbei; letztlich auch egal, Hauptsache, es funktioniert! Auch den Objektkatalog mit Verankerung will ich mir angucken -nur heut nimmer. 

Zitat:
**Puzzled**, ... die Schweizer?;-)
Prinzipiell mal völlig richtig (schmunzel)! Ich dachte mir schon, daß da ein paar (gutmütig gemeint!) Freaks dran waren - aus dem Ärmel geschüttelt ist das nicht! Ich meinte eigentlich die Grundidee - die wird aber von obigen links erklärt; trotzdem danke für die Erklärung - und BTWBy the way (So nebenbei bemerkt) ist der One-Liner genial. Habe mich zwischendrin noch ein wenig damit befasst; ich staune und lerne.

So, ich sehe schon, ich habe Nachholbedarf. Danke, danke, danke für die ausführlichen Ausführungen!

[thedit]Da war -weiter oben- noch 'ne Frage von Ole offen: "Du benutzt Value als Mittel der Wahl und ich Text. Liegt's daran? Wer kennt den Unterschied?" Tja - wer weiß auf die Schnelle den Unterschied zwischen *.text und *.value? [/thedit]

Guten Abend - gute Nacht!
Frederik

[Diese Nachricht wurde von Paulchen am 05. Feb. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Nepumuk
Mitglied
Entwicklungsleiter


Sehen Sie sich das Profil von Nepumuk an!   Senden Sie eine Private Message an Nepumuk  Schreiben Sie einen Gästebucheintrag für Nepumuk

Beiträge: 351
Registriert: 16.10.2004

erstellt am: 05. Feb. 2007 21:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

Hi,

Zitat:
Tja - wer weiß auf die Schnelle den Unterschied zwischen *.text und *.value?

Also bei einer Textbox geben die beiden Eigenschaften den identischen Wert zurück.

Text = Value und Value = Text

------------------
Gruß
Nepumuk 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 06. Feb. 2007 23:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Paulchen 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Paulchen:
Mein Denkfehler ist mir noch aufgefallen. Ich hatte den . als wildcard betrachtet;-(

Das ist kein Denkfehler an sich, der '.' stellt jedes beliebige Zeichen dar [ausser Zeilenumbrüche/Newline.
Der '.' ist somit ein Metazeichen in der RE-Syntax.
Um den '.' [Punkt] also wirklich als solchen zu beschreiben, musst du ihn 'escapen' mittels '\'.
Code:

. ==> ein beliebiges Zeichen
\. ==> der '.' Punkt selber
d ==> alle 'd's also alle kleinen 'D'oras
\d ==> nur digit's [0-9]
\ ==> ein Metazeichen ohne irgendwas (gibt i.d.R. nen Error)
\\ ==> um einen Backslash als Backslash zu erkennen

Kontextsensitive Eingaben funktionieren nur bei gesetzten Verweisen,
aber niemals mit 'createObject', das ist völlig normal;-)

lg Nancy

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 08. Feb. 2007 09:37    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Mann, das Zeug kann süchtig machen... Nach einigen Experimenten gibt's weitere Erkenntnisse von der Erbsenfront (ist ganz schön am rotieren, das Teil...).

TEIL 1: SUBS...

VBA unterscheidet definitiv zwischen

Code:
Dim re as New regexp '1
'ODER
Set re = CreateObject("vbscript.regexp") '2
re.Pattern = "^\d{1,4}$" 'nur Ganzzahl ;-))) mit min.1 und max.4 Stellen

Zu 1)
Hierzu muß im Editor unter Extras-Verweise "M$ VBScript RegExp 5.5" aktiviert sein - sonst gibt's beim Kompilieren eins auf die Finger: "Benutzerdefinierter Typ nicht definiert". Dann wird auch freundlicherweise die Auto-Vervollständigung (-wie auch immer die im Fachjargon heißt-) wieder aktiv; "re.abc" wird also nur ergänzt, wenn beim Verweis ein Häkchen sitzt und mit "Dim" gearbeitet wird. Dafür hakt's dann in sub2: "Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt" 

Nach Festlegung des re.Pattern wird der Inhalt beim Einzelschrittmodus (F8) in der Quickinfo angezeigt.

Zu 2)
Die CreateObject-Zeile hat scheinbar nur eine Macke: Vervollständigung. [OTon]Ich bin etwas verwöhnt und fühle mich wohler bzw. bestätigt, wenn der Editor mit mir einer Meinung ist und dies durch freundliches Aufblättern diverser Optionen kundtut. Ein bißchen Unsicherheit ist zugegebenermaßen auch dabei.[OToff] Soo viele Möglichkeiten gibt's wohl für die REs gar nicht; bei aktivem Verweis zeigt der Objektkatalog unter "VBScript_RebExp_55" die entsprechenden Optionen an - wie von trekkie bereits prophezeit:). Auch wenn also mal gerade nix ergänzt wird, so funktioniert's doch - bisher zumindest.

Der Inhalt des re.Pattern wird in keiner Quickinfo angezeigt; Überwachungsausdruck klappt in beiden Fällen.

Die Hilfe äußert sich (Office 2k) nicht gerade ausführlich. Nebenbei stelle ich gerade fest, daß die Textbox allgemein bei der Eingabe auf [Esc] sehr freundlich reagiert: Sämtliche (Zahlen-)Werte werden gelöscht.

Nochmal zu

Code:
With TextBox1
        If .TextLength > 0 And Not re.Test(.Text) Then .Text = Mid(.Text, 1, .TextLength - 1)
End With
Diesen Teil habe ich nun tatsächlich 'verstanden'. Es wird jede Eingabe geprüft. Handelt es sich (hier) um eine Zahl, läuft sie anstandslos -ohne 'Then' und aber- durch. Wird z.B. ein Buchstabe eingegeben, tritt der 'Then'-Fall ein; 'Mid' ändert sofort den Inhalt der Textbox: Das zuletzt eingegebene Zeichen wird gestrichen, die sub wird mit geändertem Inhalt erneut durchlaufen; 'Mid' ändert den Inhalt der Textbox, also wird das Ereignis 'Change' aufgerufen. Etwas verwirrend schien, daß VBA im Debugmodus (und sonst wohl auch) dann zwischen 'End With' und 'End Sub' nochmals zurück- und wieder vorspringt; jetzt gibt das doch einen Sinn: Bei fehlerhafter Eingabe wird das 'End With' im ersten Durchlauf gar nicht ausgeführt, da sofort von 'Mid' zum Anfang gesprungen wird.

TEIL 2: TEXT UND VALUE...

Nepumuk hat natürlich Recht - bei einer Textbox macht es wohl nix aus??? Folgendes:

Code:
Dim Zellinhalt As Variant

'1.Lauf: In Zelle B7 steht 'text' - ohne die ' versteht sich ;-)
'2.Lauf: In Zelle B7 steht  '123'

Zellinhalt = Range("B7")
  'liefert 1: "text" - 2: 123
Zellinhalt = Zellinhalt + Zellinhalt
  'liefert 1: "texttext" -2: 246
Zellinhalt = Zellinhalt & Zellinhalt
  'liefert 1: "texttexttexttext" -2: "246246"

Zellinhalt = Range("B7").Text
  'liefert 1: "text" - 2: "123" - UNTERSCHIED!!!
Zellinhalt = Zellinhalt + Zellinhalt
  'liefert 1: "texttext" -2: "123123" - UNTERSCHIED!!!
Zellinhalt = Zellinhalt & Zellinhalt
  'liefert 1: "texttexttexttext" -2: ""123123123123"

Zellinhalt = Range("B7").Value
  'liefert 1: "text" - 2: 123
Zellinhalt = Zellinhalt + Zellinhalt
  'liefert 1: "texttext" -2: 246
Zellinhalt = Zellinhalt & Zellinhalt
  'liefert 1: "texttexttexttext" -2: "246246"

Zellinhalt = Range("B7").Value2
  'liefert 1: "text" - 2: 123
Zellinhalt = Zellinhalt + Zellinhalt
  'liefert 1: "texttext" -2: 246
Zellinhalt = Zellinhalt & Zellinhalt
  'liefert 1: "texttexttexttext" -2: "246246"

Zellinhalt = UserForm1.TextBox2
Zellinhalt = UserForm1.TextBox2.Text
Zellinhalt = UserForm1.TextBox2.Value
  'liefert 1: "text" -2: "123" - IMMER, zu mehr reicht's momentan zeitlich nicht.

End Sub


Kein besonders eleganter Code, aber darum geht's mir gerade auch nicht - Schönschreiben kommt später. Meines Wissens ist die Default-Eigenschaft des 'Range'-Objekts 'Value' - was bedeutet, daß mand das Wörtchen '.Value' 1) weglassen kann und 2) die Zeilen 1 und 13 oben zwingend das selbe liefern müssen!!!

Wird Zellinhalt als String definiert, läuft's. Bei integer zickt's - mit Inhalt 'text', also 1.Lauf, versteht sich. Bemerkenswert sind die (eigentlich logischen) Unterschiede mit '.Text'. Also: .Text wird verknüpft, .Value berechnet. So, das sind nun meine Erfahrungen der vergangenen Tage. Mit RegExp geht's natürlich auch weiter. To whom it may concern...

Gruß,
Frederik

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Paulchen
Mitglied
Bauing./SW-Entwickler


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

Beiträge: 1227
Registriert: 19.08.2004

Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice

erstellt am: 10. Feb. 2007 18:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Mit Regular Expressions geht's langsam voran; immerhin habe ich  hier noch was gefunden - auf Deutsch, für VB/VBA. Ein einfaches Beispiel mal für VBA: Gültigkeit der Eingabe einer E-Mail-Adresse. Man benötigt:

- Eine Userform namens UserForm1
- Eine Schaltfläche namens cmdEmail
- Ein Textfeld namens txtEmail

Außerdem unter Extras-Verweise Häkchen setzen! Die Userform enthält dann diesen

Code:
Option Explicit
Dim myReg As RegExp
Private Sub cmdEmail_Click()
    TestEmail UserForm1.txtEmail.Text
End Sub
Public Function TestEmail(ByVal vstrEmail As String)
  Dim blnTest As Boolean

  Set myReg = New RegExp

  myReg.Pattern = _
        "^[a-z0-9\-\.]{2,63}@[a-z0-9\-\.]{2,63}\.[a-z]{2,4}$"
  myReg.IgnoreCase = True

  blnTest = myReg.Test(vstrEmail)
  If blnTest = True Then
    MsgBox "E-Mail-Adresse ist gültig.", vbOKOnly, "eMail-Test"
  Else
    MsgBox "E-Mail-Adresse ist ungültig!", vbOKOnly + vbCritical, _
            "eMail-Test"
  End If

  UserForm1.txtEmail.SetFocus
  Set myReg = Nothing
End Function


Ist schnell gebaut und zum Nachvollziehen recht gut geeignet - finde ich jedenfalls.

Für mein eigenes Verständnis der RegExps habe ich den link von trekkie gelesen; da läßt sich sehr viel ableiten. Der 'Mengenlehre'-link von Thomas [auf deutsch] ist auch informativ und für den Einstieg recht gut gemacht, wenn auch weniger ausführlich; dafür gibt's zahlreiche weiterführende links. An der

Prüfe-mir-den-Wert-direkt-bei-der-Eingabe-ohne-daß-der-User-auf-nen-Knopf-drücken-muß

-Geschichte für mein konkretes Vorhaben muß ich noch ein wenig feilen; jedenfalls lichten sich langsam, aber sicher die Schatten! Nun ist der Samstag auch schon wieder 'rum... Euch allen noch ein geruhsames Wochenende!

[thedit] So, und aus aktuellem, gegebenem und glücklichen Anlass füge ich gleich mal den link zum neuen  Forum ein    [/thedit]

Frederik

[Diese Nachricht wurde von Paulchen am 06. Mrz. 2007 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz