| |
 | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min 48 |
| |
 | KISTERS 3DViewStation: Schutz sensibler 3D CAD Daten, egal von wo Sie arbeiten, eine Pressemitteilung
|
Autor
|
Thema: Userinput validieren: natürliche Zahl? (1638 mal gelesen)
|
Starbirth Mitglied Konstrukteur
 
 Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 11. Nov. 2010 09:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo Forum, habe hier ein kleies Problemchen. Ich würde gerne den Input für mein Makro (CATVBA), vor der weiteren Arbeit damit, auf seine Eignung testen und dem User gegebenen Falles eine Fehlermeldung ausgeben, wen was nicht passt. Der Input selber kommt über eine Textbox in einer kleinen GUI rein. Erwartet wird lediglich eine natürliche Zahl zwischen 2 und 999. Nun gibt es zwar die VB Funktion "IsNumeric" mit der ich schon mal testen kann ob der Input überhaupt eine Zahl ist. Leider gibt die Funktion auch für nicht natürliche Zahlen ein True aus. Wie prüfe ich das im Nachgang am besten? Ein Gedanke den ich hatte war zu testen ob die eingegebene Zahl = n*1 ist. Aber der Code dafür wäre IMHO etwas zu umfangreich für solch eine Lapalie. Das muss doch einfacher gehen. Hat jemand einen Tipp für mich? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
matzehahn Mitglied Student

 Beiträge: 19 Registriert: 11.08.2010 CATIAV5 R19 SP03
|
erstellt am: 11. Nov. 2010 11:32 <-- editieren / zitieren --> Unities abgeben:          Nur für Starbirth
Gib doch vorher schon nur die Möglichkeit vor Zahlen einzugeben. Code:
Sub Textbox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)Dim Zugelassen As String Zugelassen = "0123456789" If InStr(1, Zugelassen, Chr$(KeyAscii)) = 0 Then KeyAscii = 0 End If End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Starbirth Mitglied Konstrukteur
 
 Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 11. Nov. 2010 12:54 <-- editieren / zitieren --> Unities abgeben:         
Danke, das klingt sehr gut. Nur ist mir noch unklar wie ich das jetzt so in meinen Code implementieren soll dass es auch funktioniert. Die entsprechende Textbox wird beim öffnen des Forms mit 100 (als Standardwert) initialisiert. Der von dir gepostet Sub müsste ja dann angesprungen werden, wenn der User die Textbox anklickt und den Wert ändern möchte. Oder sehe ich das falsch? Wie steuert man sowas? Ein wenig später getippt:
Habe es jetzt nach ein wenig Googeln so zusammengebaut:
Code: Private Sub BOX_Schnittanzahl_KeyDown(ByVal KeyAscii As MSForms.ReturnInteger) 'BOX_Schnittanzahl ist meine Textbox für die UsereingabeDim Zugelassen As String Zugelassen = "0123456789" If InStr(1, Zugelassen, Chr$(KeyAscii)) = 0 Then KeyAscii = 0 End If End Sub
Das ganze Gebilde läuft direkt in der ersten Zeile (Private Sub...) auf einen Compile Error (procedure declaration does not match description of event or procedure having the same name). Schlau werde ich aus dem Fehler nicht. Was macht man da?Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Ehrenmitglied V.I.P. h.c. Head of CAD, Content & Collaboration / IT-Manager

 Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 11. Nov. 2010 12:56 <-- editieren / zitieren --> Unities abgeben:          Nur für Starbirth
Hallo versuch es mal mit... Code:
Sub CATMain() Dim bspZahl as Double if isNumeric(txtFeld1.text) then if isInteger(txtFeld1.text) = true then bspZahl = txtfeld1.text else msgbox("Sie müssen eine Zahl von 2-999 eingeben!") exit sub end if else msgbox("Sie müssen eine Zahl von 2-999 eingeben!") exit sub end if end Sub Public Function IsInteger (tmpNumber as Double) as Boolean IsInteger = (Int(tmpNumber) = tmpNumber) End Function
Habe ich schnell von Hand getippt und nicht geprüft. Sollte aber funktionieren! Ergänzung: txtFeld1 ist das Feld, in das die Zahl eingegeben wird. Ich habe im Beispiel CATMain verwendet. Der Code gehört natürlich in die wie ich annehme Clickoperation. ------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities [Diese Nachricht wurde von RSchulz am 11. Nov. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Starbirth Mitglied Konstrukteur
 
 Beiträge: 119 Registriert: 22.10.2009
|
erstellt am: 11. Nov. 2010 14:04 <-- editieren / zitieren --> Unities abgeben:         
Besten Dank Rick, habe es jetzt nach deiner Version gemacht. Leicht angepasst macht die genau das, was ich wollte. Sehe ich richtig, dass die eigentlich nur prüfst ob die eingegebene Zahl gleich der eingegebenen Zahl ohne Nachkommastellen ist? Schöner Trick, kurz und krisensicher. Musste lediglich noch ein wenig mit den Variablen und Typen spielen, um IsNumeric den erwarteten String und IsInteger den gewollten Double zukommen zu lassen. Für alle die auch irgendwann mal vor dem Problem stehen, hier noch mein Code:
Code: Private Sub BTN_Makrostart_Click() 'Check Input in Box Schnittezahl. Wenn keine gültige Zahl, Fehler melden und auf Besserung hoffen Dim Testzahl As String Dim TestzahlDBL As Double Testzahl = BOX_Schnittanzahl.Text If IsNumeric(Testzahl) Then 'Check ob String in Eingabefeld numerisch ist TestzahlDBL = CDbl(BOX_Schnittanzahl.Text) 'Umwandlung von String zu Double If isInteger(TestzahlDBL) = True Then 'Check ob natürliche Zahl und im Zahlenbereich, siehe unten Schnittzahl = TestzahlDBL '<------- validierte Zahl, damit gehts weiter Else MsgBox ("Bitte geben Sie eine natürliche Zahl von 2-999 eingeben.") Exit Sub End If Else MsgBox ("Geben Sie die Zahl bitte in Ziffern ein. Buchtaben kann ich nicht lesen.") Exit Sub End If End Sub
Code: Function isInteger(tmpNumber As Double) 'as Boolean isInteger = (Int(tmpNumber) = tmpNumber) 'Vergleicht tmpNumber mit tmpNumber ohne Nachkommastellen. Wenn gleich -> natürliche Zahl -> isInteger=True If tmpNumber < 2 Or tmpNumber > 999 Then 'Gültiger Wertebereich für tmpNumber wird hier gesetzt isInteger = False End If End Function
[Diese Nachricht wurde von Starbirth am 11. Nov. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
matzehahn Mitglied Student

 Beiträge: 19 Registriert: 11.08.2010 CATIAV5 R19 SP03
|
erstellt am: 11. Nov. 2010 14:49 <-- editieren / zitieren --> Unities abgeben:          Nur für Starbirth
Mein Code kommt in die UserForm und wird bei einem KeyPress in die Textbox ausgeführt. Er blockt quasi schon eine falsche Eingabe. Man kann das natürlich noch erweitern mit If Abfragen damit nicht mehr als 3 Stellen eingegebn werden kann etc. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |