|
03.06.2004, 17:23 | #1 |
MOF Profi |
isSingle(), isInteger(), isLong()
Hi Forum,
wer hat eine einleuchtende Idee für die Umsetzung obiger Funktionen? analog isDate, etc....? Gruz SiS __________________ Win, Off, SQL-Server - alles MS 2000 |
04.06.2004, 05:44 | #2 |
MOF Meister |
Schau dir mal den VarType()-Befehl an:
Code:
HTH __________________ Stefan |
04.06.2004, 08:51 | #3 |
Threadstarter
MOF Profi |
So Simple.....
ich verrat jetz besser nicht, was ich für 3 funktions-Bodies erstellt habe..... :P Hey Danke HTH??? Gruz SiS __________________ Win, Off, SQL-Server - alles MS 2000 |
08.06.2004, 13:50 | #5 |
Threadstarter
MOF Profi |
Ganz so simpel dann doch wieder nicht....
Code: Public Function isDouble(var As Variant) As Boolean If IsNull(var) Then isDouble = False Else isDouble = ((VBA.VarType(Val(var)) = vbDouble) Or isSingle(var)) End If End Function Public Function isSingle(var As Variant) As Boolean If IsNull(var) Then isSingle = False Else isSingle = ((VBA.VarType(Val(var)) = vbSingle) Or isLong(var)) End If End Function Public Function isLong(var As Variant) As Boolean If IsNull(var) Then isLong = False Else isLong = ((VBA.VarType(Val(var)) = vbLong) Or isInteger(var)) End If End Function Public Function isInteger(var As Variant) As Boolean If IsNull(var) Then isInteger = False Else isInteger = (VBA.VarType(Val(var)) = vbInteger Or isByte(var)) End If End Function Public Function isByte(var As Variant) As Boolean If IsNull(var) Then isByte = False Else isByte = ((VBA.VarType(Val(var)) = vbByte)) End If End Function isSingle(2) -> True hingegen: a = cDbl(2) isSingle(a) -> False thx SiS (Akronym für StehtimSchilf ) Super.... jetz gerade bemerkt, dass dies auch nicht tut! für isInteger("20") erhalte ich false! den nach einem Val("20") erhalte ich den Typ Double.... kann doch nicht so schwierig sein?????? Also wie nun? __________________ Win, Off, SQL-Server - alles MS 2000Geändert von StehtimSchilf (08.06.2004 um 14:03 Uhr). |
08.06.2004, 15:28 | #6 |
MOF Meister |
Die Funktion VarType() gibt den Type der Variablen zurück (wie der Name schon sagt) und betrachtet nicht den Wert. Daher muss man hier "typ-sicher" mit entsprechend deklarierten Variablen arbeiten.
Um die Größe eines Wertes zu kategorisieren, benötigt man den Variablentyp nur zweitrangig - aber das Ergebnis ist u.U. falsch. Der Wert 20 kann fast alles sein bzw. in fast allen Variablentypen gespeichert werden: Byte, Integer und Long. Als 20.0 kämen noch alle Fließkommatypen hinzu. Also, die Aussage 20 ist Integer ist de facto falsch. Die Aussage "... da Long eine echte Obermenge der Integers ist, ..." ist ebenfalls falsch. Mir ist allerdings nicht ganz klar, was das Ergebnis sein soll. Wenn du den kleinsten, passenden Variablentypen möchtest, käme bei dem Wert 20 Byte heraus (0-255). Dabei muss man jedoch explizit die Fließkommatypen ausschließen... Du solltest also mit deklarierten Variablen arbeiten, sonst kommst du zu keinem gescheiten Ergebnis. Gruß __________________ Stefan |
10.06.2004, 16:14 | #7 |
Threadstarter
MOF Profi |
Hi Stefan,
wieso die Aussage falsch sein sollte, versteh ich jetz nicht! Denn jede Integer-Zahl kann in einem Long gespeichert werden. Also kann jeder Int ein Long sein. Aber nicht umgekehrt.... Aber eigentlich geht es mir hier nicht um den Typ. Evtl. liegts daran, sondern nur um den Bereich! Mit den Funktionen will ich nur Prüfen ob eine angegebene Zahl im angegebenen Typ gespeichert werden kann: isDouble(20) -> True isDouble(20.2) -> True isDouble(10E7000) -> False (OverFlow) isDouble("hallo") -> False (string) isInteger(20.2) -> False (Ints sind ganzzahlig) isInteger(10E6) -> False ( nur bis 32786) isLong(20.2) -> False isLong(20) -> True isLong(10E6) -> True Ich will weder den grössten noch den kleinsten passenden Variablen Typ, sondern nur, ob die angegebene Variable in dem zu prüfenden Variablentyp gespeichert werden kann! Wofür? mit den InputBox() kann man ja Eingaben abfragen. Nun möchte ich eben mit diesen Funktionen prüfen, ob die Eingabe für meinen Bereich stimmt. Will ich nur ganze Zahlen ---> if isLong(strEingabe) then .... jetz bischen klarer? Gruz SiS __________________ Win, Off, SQL-Server - alles MS 2000 |
10.06.2004, 19:35 | #8 |
MOF Meister |
Zitat: wieso die Aussage falsch sein sollte, versteh ich jetz nicht! Deine Routinen können grundsätzlich nicht funktionieren, da du immer Varianten übergibst. Indem du dann explizit in Double konvertierst (Val), kommt da nicht das gewünscht Ergebnis heraus. Eine Inputbox gibt grundsätzlich einen String zurück (und niemals Null) - also hast du schon mal keinen nummerischen Ansatz. Konvertieren mit Val() fällt auch flach, da du dann immer einen Double-Wert hast! Zitat: ob die Eingabe für meinen Bereich stimmt Eine konkretes Code-Beispiel wäre hilfreich zu verstehen, was du genau vor hast. Gruß __________________ Stefan |
10.06.2004, 20:32 | #9 |
Threadstarter
MOF Profi |
hmmm...
Aber mir geht es um den Wert! Es geht um den Wert in der Variable 'var' und nicht um den Typ, denn die Variable 'var' enthält! Code: Dim x As KrasserVariblenTyp x = 20 Code: isLong(x) = True Ebenso ist Code: isInteger(x) = True Auf dieser Basis beruhnend will ich eben nun diese Funktionen schreiben! Jeder Wert der Menge Integer ist in der Menge der Longs enthalten, oder etwa nicht? Aber das ist hier nicht das Thema... wie gieng das Akronym? OT? Es geht um folgendes: Code: strEingabe = InputBox(....) von 20 bis 1000 (ganzzahlig) von -1000.000 bis 1000 (dezimalzahlen) von 1.1.2000 bis 22.3.2005 von 'Access' bis 'Word' Im normalen Fall müsste ich nun für jede Art immer ein folgendes Konstrukt schreiben: Code: Do strEingabe = InputBox(...) Loop Until isValidInput Code: Loop Until strEingabe = "" or cdate(strEingabe) >= cdate("1.1.2000") and <= cdate("22.3.2005") Code: loop Until strEingabe = "" or ..... or .... or also habe ich eine Funktion Code: Public Function InputBoxX(.... die selben Parameter, intType as Integer, varFrom as variant, varTo as variant, boolForceInput as Boolean) as String nun rufe ich jeweils nur Code: strEingabe = InputBoxX(...., "1.1.2000", "22.3.2005", vbDate, False) Kein Do, kein Loop gar nichts! Eine Zeile! Und jetzt kommts: Unsere Datenbank enhält MitgliederNummern (Longs). Also ich geschrieben: Code: strEingabe = InputBoxX((...., 0, 99999, vbLong, True) Damit dies eben nicht möglich ist (Dezimalzahlen) muss der Parameter vom "Typ" Long sein! Integer geht nicht, weil wir MitgliederNr > 32786 haben. Ich gebe zu, für diese Beispiele sind isInteger(), isByte() und isSingle() nicht nötig! denn mit isLong() und den angegebenen Grenzen lässt sich auch nur Ints erfassen! Und Singles und Doubles? Wer gibt von Hand schon eine Zahl ein, welche effektiv von Double nd Single unterscheidet? Daher würde für 20.1 eine Funktion isDouble() reichen. Aber, prévoir c'est pouvoir, wie die Franzosen ja sagen........ also wünsche ich eben die anderen Funktionen auch noch! Gruz SiS Geändert von StehtimSchilf (10.06.2004 um 20:35 Uhr). |
11.06.2004, 06:19 | #10 |
MOF Meister |
Offensichtlich hast du deine Lösung in der anonymen Funktion InputBoxX gefunden?
Zitat: also wünsche ich eben die anderen Funktionen auch noch! Ich kann mich nur wiederholen; um eine "saubere" Abgrenzung der Werte zu erhalten, muss man die Gültigkeitsbereiche abprüfen. Selbst dabei muss man einen Kompromiss formulieren (der kleinste/größte Wert zieht). Problematisch dabei sind die Fließkommazahlen (Single und Double - von Currency und Date mal abgesehen). Wenn's denn eine Inputbox sein soll, würde ich mir eine eigene Inputbox schreiben, die einen maskierten Eingabebereich besitzt (nur Ganzzahlen oder Fließkommazahlen bzw. Datum). Die "Grenzwertberechnung" wäre dann IMHO etwas schlanker. Gruß __________________ Stefan |
20.08.2004, 16:23 | #11 |
Threadstarter
MOF Profi |
So gehts
Code: Public Function isInteger(var As Variant) As Boolean Dim tmpInteger As Integer On Error GoTo FEHLER If IsNumeric(var) Then var = Val(var) tmpInteger = var isInteger = (tmpInteger = var) EXIT_FUNCTION: Exit Function FEHLER: isInteger = False Resume EXIT_FUNCTION End Function auf jeden Fall funktioniert diese Funktion und für alle anderen Standard-Datentypen analog! cheerioh SiS __________________ Win, Off, SQL-Server - alles MS 2000 |
25.08.2004, 16:42 | #12 |
MOF Guru |
Nenne diese Funktion am besten IsVT4. Das ist der OLE-Typ und trifft es am ehesten.
Ciao, Sascha __________________ Microsoft Access MVPO2k bis O2010, VB6, VS2008, Delphi7, ... Bitte keine ungefragten E-Mails. Probleme werden hier gelöst. Bitte beachten: Grundlegendes zum Access-Forum Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de |
25.08.2004, 16:46 | #13 |
Threadstarter
MOF Profi |
hä?
wofür steht VT4? Und was hat jetz OLE hier zu suchen? :P OLE mag ich diesen Monat gar nicht! Deine Meinung zur Funktion? cheerioh SiS __________________ Win, Off, SQL-Server - alles MS 2000 |
25.08.2004, 20:45 | #14 |
MOF Guru |
Es gibt in OLE verschiedene Integertypen. Der, den du mit deiner Funktion ermitteln willst ist ein VT4. Es gibt z.B. auch einen VT8. Fast alles unter VB hat (intern) mit OLE zu tun. Aber das erläutere ich hier nicht weiter.
Es war auch eher ein Scherz. Zur Funktion selbst kann ich nur sagen: Wenn sie funktioniert, dann prima! Aber verstanden hab ich den Thread wohl ebensowenig wie Stefan. Ciao, Sascha __________________ Microsoft Access MVPO2k bis O2010, VB6, VS2008, Delphi7, ... Bitte keine ungefragten E-Mails. Probleme werden hier gelöst. Bitte beachten: Grundlegendes zum Access-Forum Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de |
25.08.2004, 21:11 | #15 |
Threadstarter
MOF Profi |
liegt wohl daran, dass Hochdeutsch nîcht meine Muttersprache ist! Viu lieber würi ja so schriibe, aber da hätti wohl niä Ussicht uf Hiuf Es ist geht ums Thema User-Eingaben: Wie löst Du das Problem wenn der User nur ganze Zahlen von 5-300 Eingeben darf? anschliessend nur ganze Zahlen von -234234 bis < MAX_LONG? anschliessend nur Dezimalzahlen zw. - 2 PI und 2 PI, anschliessend einen 6 Zeichen langen String, der nur aus Grossbuchstaben bestehen darf und mit "N" beginnt und "R" endet? mit der Bedingung 5-300 weiss ich, dass jetz nur Zahlen im - verzeih mir den evtl. Missbrauch des folgendes Wortes - "Integer-Bereich" gültig sind! also reicht die Bedingung: "'isInteger(input)' and intput >=2 and input <= 300" Daher jetz meine adaptierte InputBoxX-Funktion! Ich muss mich jetz nicht mehr mühsam mit Gültigkeitstests nach einem Input herumschlagen! Es wundert mîch jetz schon, wie ihr sowas löst, wenn der User z.B. 10 Eingaben machen muss (ob via Textfeld oder Input-Box spielt keine Rolle) und ihr diese Eingaben auf Gültigkeit prüfen müsst? Der DAU ist auch bei uns vertreten und gibt für ein vierstellige Jahreszahl trotzdem '4' ein.... Gruess SiS __________________ Win, Off, SQL-Server - alles MS 2000 |