| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Einfaches(?) If-Problem (686 mal gelesen)
|
incredible_cHiller Mitglied Maschinenbau Student
Beiträge: 8 Registriert: 13.06.2006
|
erstellt am: 07. Jul. 2006 14:35 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich schreibe mir gerade ein Makro, um aus einer Parameterliste automatisch Bohrungen auf einem Bauteil erstellen zu lassen. Das klappt soweit ganz gut, die Bohrungen werden wie sie sein sollen an den richtigen Ort gesetzt. Jedoch hat leider jede Bohrung eine verschiedene Tiefe und die hängt "quasi" vom Durchmesser ab. Ich sage "quasi" weil kein direkter Zusammenhang über eine Funktion besteht. Die jeweilige Tiefe liest man über eine Tabelle ab. (30 verschiedene Durchmesser/Tiefen) Testweise habe ich ein Makro für eine Bohrung erstellt, eine Schleife werde ich später noch hinzufügen. Nun ist mein Problem recht einfach (glaub ich zumindest) jedoch finde ich den Fehler nicht. Es geht um ein simple "If-Then-Funktion" kurz: Ich lasse den Durchmesser aus der Parameterliste auslesen und mir zur Kontrolle anzeigen. (Durchmesser = 62 kommt dann) Dann kommt die Bedingung: If Durchmesser = 62 Then Tiefe = 57 Else Tiefe = 47 Nun lass ich mir den "Tiefe"-Wert zur Kontrolle anzeigen und er ist immer 47! (Vielleicht anbei den Quellcode anschauen, Problem im letzten drittel) Womöglich ist es ein Problem mit den Einheiten?!? Wenn ich den Durchmesser nicht auslese sonder = 62 setze, funktioniert alles. Mein Parameter-Wert ist 6,2mm in der Tabelle, wenn ich ihn mir durch eine Msgbox anzeigen lasse ist er 0,62. Da ich ein Problem mit den verschiedenen Trennzeichen vermute (Punkt/Komma) umgehe ich dieses in dem ich den Parameter Wert mit 100 multipliziere. (0,62 -> 62) Jedoch habe ich es auch schon ohne oder mit anderen Faktoren testweise probiert. Oh ja, fast vergessen: der Eintrag Tiefe = 20 über den ganzen If-Bedingungen ist nur damit das Programm nicht direkt abbricht. Eigentlich müsste der Wert ja direkt überschrieben werden... Sieht vielleicht jemand ein Problem was ich einfach nicht erkenne? Über jede Hilfe wäre ich sehr dankbar, Gruß Michael [Diese Nachricht wurde von incredible_cHiller am 07. Jul. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Jul. 2006 17:10 <-- editieren / zitieren -->
Hallo, ich bin zwar auch nicht der VBA Freak, aber müsste diene If anweisung nicht so aussehen: If Durchmesser = 62 Then Tiefe = 57 Else Tiefe = 47 End if MsgBox (Tiefe) Da kann ich mich jetzt aber auch irren. Ich bin mir nicht sicher, ob man das alles so hintereinander schreiben darf. Denn der Code sieht soweit ja richtig aus. Aber du hast das End if am Ende deiner If Anweisung vergessen. Vielleicht liegt es daran. mfg, heiner
|
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück. -------------- SWX 2005/2006 SE 14-17 AIP 9-11 WinXP+ SP2 --------------
|
erstellt am: 11. Jul. 2006 08:26 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Hi Heiner, Ein end if braucht man nicht wenn man alles in einer Zeile schreibt, aber bleib lieber bei dem end if (kann man besser lesen). und @ Micha versuch mal: Durchmesser = cLng((oParams.Item(7).Value * 100)) Gruß Micha
------------------ http://classicvb.org/petition/ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 11. Jul. 2006 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Hallo VBSpawn, wenn du Recht hast, wo von ich ausgehe, und Long * 100 kein Long mehr ist und muss in Long wieder gecastet werden, dann ist das traurig genug. Aber welcher Typ entsteht denn dann draus, wenn Code:
If Durchmesser = 62 Then Tiefe = 57 Else Tiefe = 47
nicht funktioniert? Denn egal was für numerischer Typ das wird, 62 = 62 muss auf jeden Fall Wahr sein. Oder wird vielleicht ein String draus Typsicherheit ist schon ein guter Grund in Richtung .NET zu schauen…
------------------ Grüße daywa1k3r FX64 Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück. -------------- SWX 2005/2006 SE 14-17 AIP 9-11 WinXP+ SP2 --------------
|
erstellt am: 11. Jul. 2006 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Hi , Ich denke mal das im double noch Nachkommastellen sind (62,000000005)... und mit einem einfachen cLng werden diese weggemacht ... (Ansonsten müsste es ja Funktionieren ... jedenfalls sehe ich keine sonstige Fehler Quellen) <SCHERZ> Typsicherheit kann ein Fluch oder ein Segen sein .... ich verwende nur 2... Object oder Variant damit der Variant auch mal ein Object werden kann <SCHERZ>
Gruß Micha
------------------ http://classicvb.org/petition/ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 11. Jul. 2006 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Zitat:
Ich denke mal das im double noch Nachkommastellen sind (62,000000005)... und mit einem einfachen cLng werden diese weggemacht ...
Würde dann die MsgBox nicht 0,62000000005 ausgeben? Zitat:
Mein Parameter-Wert ist 6,2mm in der Tabelle, wenn ich ihn mir durch eine Msgbox anzeigen lasse ist er 0,62.
<scherz>Oder wird das vielleicht automatisch gecastet um den Benutzer nicht mit den unnötigen Informationen zu verwirren? </scherz> ------------------ Grüße daywa1k3r FX64 Software Solutions Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mranderson Mitglied Entwicklungsingenieur Robotik
Beiträge: 70 Registriert: 25.04.2006 IV: Autodesk Inventor 9 VB: Visual Basic 6.0 OS: Microsoft Windows 2000 Professional SP 4 CPU: Intel Xeon 1,7 GHz Arbeitsspeicher: 1 GB
|
erstellt am: 11. Jul. 2006 14:14 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Ich hatte genau das gleiche Problem!!! Ich habe auch über eine If-Schleife zwei Zahlen vergleichen, das eine war ein Double, das andere ein Long. Ich habe sogar ein Debug.Print beider Zahlen gemacht und waren laut dem Debugfenster, ich glaube, bis auf 14 stellen nach dem Komma identisch. Aber trotzdem ging er nicht in die Schleife hinein. Daraus schließe ich, dass aus irgendeinem Grund die 15. Nachkommastelle oder so nicht identisch ist, jedoch nicht mehr angezeigt wird. Ich habe einfach den Datentyp von Double in Long gewechselt und es gab keinerlei Probleme mehr. Grüße MrAnderson alias René Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück. -------------- SWX 2005/2006 SE 14-17 AIP 9-11 WinXP+ SP2 --------------
|
erstellt am: 11. Jul. 2006 14:22 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Zitat: Original erstellt von daywa1k3r: Würde dann die MsgBox nicht 0,62000000005 ausgeben?
Sollte die MsgBox zumindest, allerdings lt ObjectExplorer erwartet die Box keinen bestimmten Prompt Parameter (Function MsgBox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Title], [HelpFile], [Context]) As VbMsgBoxResult) <kein Scherz> d.h. aber auch das die MsgBox Typeumwandeln kann !<kein Scherz> ansonsten muss die 62 eine 62 sein (bei mir funzt sein bsp. code) Ich glaube nur was anderes kommt als Ursache nicht in Betracht. Gruß Micha ------------------ http://classicvb.org/petition/ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 11. Jul. 2006 17:09 <-- editieren / zitieren -->
Hallo VBSpawn, ich muß da mal nachhaken, was deine Aussage betrifft. Zitat: Ein end if braucht man nicht wenn man alles in einer Zeile schreibt
Wenn ich bei ner If-Schleife alles hintereinander schreibe, dann gibt es mir sofort einen Fehler aus. Wieso denn das? mfg, Heiner |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück. -------------- SWX 2005/2006 SE 14-17 AIP 9-11 WinXP+ SP2 --------------
|
erstellt am: 11. Jul. 2006 17:41 <-- editieren / zitieren --> Unities abgeben: Nur für incredible_cHiller
Zitat: Original erstellt von CADHeiner: Hallo VBSpawn,ich muß da mal nachhaken, was deine Aussage betrifft. Wenn ich bei ner If-Schleife alles hintereinander schreibe, dann gibt es mir sofort einen Fehler aus. Wieso denn das? mfg, Heiner
Hallo Heiner, Wenn der If Block mehr als einen Befehl beinhaltet muss man um bei einer Zeile zu bleiben die Befhle mit einem ':' Trennen z.b.: If a = b Then Debug.Print "A=B": Debug.Print "FALL A" Else Debug.Print "A<>B": Debug.Print "FALL B" ich nehme jetzt mal an das du mehrere Befehle hast und dort klappt das nur mit dem ':' ... aber mach es bitte so wie bisher ... damit es nicht allzu unübersichtlich wird... If a = b Then Debug.Print "A=B": Debug.Print "FALL A" Else Debug.Print "A<>B": Debug.Print "FALL B" If a = b then Debug.Print "A=B" Debug.Print "FALL A" else Debug.Print "A<>B" Debug.Print "FALL B" end if Generell kannst du fast alles in einer Zeile Schreiben ....wenn der doppelpunkt dazwischen steht ... kopiere das mal in eine sub und führe die mit F8 Schrittweise aus .. Debug.Print e = 10: f = 20: g = e + f: aw = MsgBox("Hallo " & g, 4): If aw = vbYes Then MsgBox "ja" Else MsgBox "Nein" ------------------ http://classicvb.org/petition/ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 11. Jul. 2006 20:21 <-- editieren / zitieren -->
Hallo, das werde ich morgen gleich mal probieren. Das wusste ich noch nicht. Man lernt ja nie aus...10 Punkte für dich. mfg, Heiner |