| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VBA-Tutorial (1021 mal gelesen)
|
MPeisler Mitglied
Beiträge: 95 Registriert: 31.01.2001
|
erstellt am: 27. Feb. 2003 15:09 <-- editieren / zitieren --> Unities abgeben:
Hallo VBA-Profis, habe das Tutorial von Adesk übers VBA im Inv. abgeschrieben. http://www.autodesk.de/adsk/index/0,,2109384-403786,00.html Leider funktioniert das ganze bei mir nicht so wie es Adesk beschreibt. Gibt es irgendwo eine Liste welche Inv.funktion ich wie im VBA ansprechen muss und was übergeben wird. Private Function ToFourDec(ByVal dblVal As Double) As String ' Erzeugt einen String in den aktuellen Einheiten mit 4 Dezimalstellen Genauigkeit Dim strLocalVal As String Dim strLocalUnits As String Dim dblToFour As Double Dim dblLocalUnits As Double ' Ausgabe des Strings mit in die aktuellen Einheiten konvertierten Wert ' Ein interner Wert von 2.54 cm würde 1.0 in wiedergegeben ' Der Wert wird dann aus dem String mit der Val Funktion extrahiert dblLocalUnits = Val(m_oUOM.GetStringFromValue(dblVal, kDefaultDisplayLengthUnits)) ' Rückgabe des Strings mit den lokalen Längeneinheiten strLocalUnits = m_oUOM.GetStringFromType(kDefaultDisplayLengthUnits) ' Aufrunden des Wertes auf 4 Dezimalstellen dblToFour = Round(dblLocalUnits, 4) ' Formatierung des Wertes auf 4 Dezimalstellen strLocalVal = Format$(CStr(dblToFour), "0.000") ' Erzeugen eines Strings mit Wert und Einheit ToFourDec = strLocalVal & " " & strLocalUnits End Function Woher kommt z.B. der Wert von dblVal? Ich habe die Überwachung einiger Variablen eingeschaltet. Leider bin ich im VBA total Ahnungslos! Verzwifelten Dank im Voraus! Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012 64Bi
|
erstellt am: 27. Feb. 2003 15:27 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
Hi, das ist ein Parameter. ToFourDec ist eine Funktion die als Argument eine Zahl von Typ Double erwartet. Die Funktion wird zB. so aufgerufen:
Code:
Dim Meine_Zahl as String 'Hier wird die Variable für den Rückwert deklariert Meine_Zahl = ToFourDec ( 3.827462 ) ' und hier wird die Funktion aufgerufen
Damit sollte Meine_Zahl einen Wert von 3.8274 bekommen (falls ich die Funktion richtig verstanden habe) Wenn Du es testen möchtest, speichere die Funktion in ein Modul in VisualBasic Editor. Füge noch die Funktion dazu:
Code:
Public Sub test() Dim Meine_Zahl as String Meine_Zahl = ToFourDec ( 3.827462 ) MsgBox Meine_Zahl End Sub
und starte die Funktion test. Vielleicht wird dir dann ein wenig klarer. Bis später... ------------------ Grüße daywa1k3r Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MPeisler Mitglied
Beiträge: 95 Registriert: 31.01.2001
|
erstellt am: 27. Feb. 2003 15:52 <-- editieren / zitieren --> Unities abgeben:
Hallo daywa1k3r, erst mal danke für die schnelle Antwort. Mit der Funktion ToFourDec soll die Schwerpunktslage einer Baugruppe (X,Y,Z) abgefragt werden. Wenn ich das Programm starte und VBA den ersten Wert abfragt steht in dblVal z.B. die Zahl 1.6143. Nachdem die Funktion durchgelaufen ist habe ich einen Wert von 16 mm. Wenn ich die Schwerpunktslage im Inv. rechne gibt mir Inv. 16.143 mm aus. Die Zahlen sind also um Faktor 10 (mm - cm ????) unterschiedlich. Deswegen stelle ich meine Frage etwas präziser: Gibt es eine Liste in der steht welchen Parameter ich im VBA ansprechen muss um im Inv. z.B. die Einheiten von mm auf cm ändern zu können. Mit Hilfe dieser Liste möchte ich Versuchen Licht in mein VBA-Dunkel zu bringen. Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Uwe.Seiler Mitglied Dipl.-Ing.(FH)
Beiträge: 1183 Registriert: 18.04.2002 HP xw6000 - Dual XEON 2,4GHz - 2GB DDRAM - 980 XGL (Treiber 84.26) - XP SP1 - IV11 SP3
|
erstellt am: 27. Feb. 2003 16:10 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
|
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012 64Bi
|
erstellt am: 27. Feb. 2003 16:19 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
Ach so, Inventor / Programmierungshilfe / Suchen. Als Suchbegriff "Units of Measure" eingeben. Lesen. Die "Length" wäre das was Du suchst. Bis dann... Nachtrag: Uwe das stimmt!
Nachtrag 2 :
Tja wenn aber der Wert von "dblLocalUnits" und die Einheit nicht zusammen passen, dann sieht es aus wie wenn das ein Bug ist. Falls das konstant so ist, kannst Du es mit Val(m_oUOM.GetStringFromValue(dblVal, kDefaultDisplayLengthUnits)) / 10 "reparieren". Und wenn Du dich weiter mit VBA befasst, wirst Du sehen dass es viele solche "Sachen" gibt. ------------------ Grüße daywa1k3r
[Diese Nachricht wurde von daywa1k3r am 27. Februar 2003 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012 64Bi
|
erstellt am: 27. Feb. 2003 16:46 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
Zitat:
Mit der Funktion ToFourDec soll die Schwerpunktslage einer Baugruppe (X,Y,Z) abgefragt werden.
Falsch! Kann ich nicht erkennen Den Wert gibt es schon (Schwerpunktslage - > dblVal) und mit der Funktion ToFourDec (wie der Name schon sagt) nimmt dblVal entgegen und holt sich die Einheit, rechnet den Wert in die richtige Einheit um, danach rundet es auf 4 Stellen ab, setzt den Wert und die Einheit zusammen und liefert es in String-Form zurück. Also die Funktion ist nur ein Teil von einem grösseren Makro. Bis dann... ------------------ Grüße daywa1k3r Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MPeisler Mitglied
Beiträge: 95 Registriert: 31.01.2001
|
erstellt am: 28. Feb. 2003 07:45 <-- editieren / zitieren --> Unities abgeben:
|
MPeisler Mitglied
Beiträge: 95 Registriert: 31.01.2001
|
erstellt am: 28. Feb. 2003 13:24 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von daywa1k3r: Falsch! Kann ich nicht erkennen Den Wert gibt es schon (Schwerpunktslage - > dblVal) und mit der Funktion ToFourDec (wie der Name schon sagt) nimmt dblVal entgegen und holt sich die Einheit, rechnet den Wert in die richtige Einheit um, danach rundet es auf 4 Stellen ab, setzt den Wert und die Einheit zusammen und liefert es in String-Form zurück.
Hallo daywa1k3r, das macht das Programm ja auch recht schön. Ich habe nur das Problem, wie bereits beschrieben, das sich das VBA den Wert 1.6143 cm holt und bei der Umwandlung in mm 16 mm daraus macht! Wo bleiben die 0.143 mm??? Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012 64Bi
|
erstellt am: 28. Feb. 2003 13:40 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
Zitat:
Hallo daywa1k3r,das macht das Programm ja auch recht schön. Ich habe nur das Problem, wie bereits beschrieben, das sich das VBA den Wert 1.6143 cm holt und bei der Umwandlung in mm 16 mm daraus macht! Wo bleiben die 0.143 mm??? Martin
Hallo Martin, sobald ich Daheim bin schreib ich dir ein paar Zeilen die funktionieren. Bis dann... ------------------ Grüße daywa1k3r Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Pisarz Mitglied
Beiträge: 280 Registriert: 05.03.2002 AIP2011 Win7x64 HP Z400/W3565(3.2GHz) 12GB RAM 100GB SSD / 1TB Raid1 MSI R5770 Hawk SpacePilot
|
erstellt am: 28. Feb. 2003 20:22 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
Hi, dieses Stück Code ist ein denkbar schlechtes Bispiel für VBA-Programmierung und gehört eigentlich nur in ein Tutorial, wenn man es als abschreckendes Beispiel benutzt. Was der Autor des Programmes übersehen hat, sind zwei Tatsachen: 1. Die Methode "GetStringFromValue" liefert einen Wert in der Genauigkeit zurück, die im Dokument eingestellt ist. Wenn die Genauigkeit unter Extras-Dokumenteinstellungen-Einheiten auf "0,1" steht, dann gibt o.g. Funktion auch nur eine Nachkommastellen raus! 2. Die Methode "GetStringFromValue" liefert das Dezimaltrennzeichen zurück, dass in den Ländereinstellungen von Windows vermerkt ist, bei uns also Komma. Die im Programmbeispiel verwendete val-Funktion ist aber ein pure VBA-Funktion - diese verlangen immer ein Punkt als Dezimaltrenner - egal in welchem Land das Programm läuft. Beispiel: Val("1.234") = 1.234 Val("1,234") = 1.0 - Alles hinter dem Komma wird ignoriert. Zu allem Überfluss wird dann in dem Programm aufwändig (und fehlerhaft) ein vorliegender String, der eine formatierte Zahl mit Einheit enthält, zuerst in eine Zahl gewandelt, dann erneut formatiert, dann mit der Einheit versehen und wieder ausgegeben. Ginge auch knapper, in dem man auf den ganzen Quatsch verzichtet und die Methode "GetStringFromValue" direkt aufruft. In der Luxusvariante kann man vor dem Aufruf die Genauigkeit im UOM-Objekt mainpulieren (hinterher wieder zurückstellen). Etwa so: Private Function ToFourDec(ByVal dblVal As Double) As String 'Speichere aktuelle Genauigkeit Dim OldPrec As Integer OldPrec = m_oUOM.LengthDisplayPrecision
'Setze Genauigkeit auf 4 Stellen nach dem Komma m_oUOM.LengthDisplayPrecision = 4 'rechne den Wert in die aktuelle Einheit um ToFourDec = m_oUOM.GetStringFromValue(dblVal,kDefaultDisplayLengthUnits) 'Stelle alte Genauigkeit wieder her m_oUOM.LengthDisplayPrecision = OldPrec End Function Ein klassisches Beispiel für schlampige Programmierung. Das Programm läuft in den Ländern mit "." als Dezimaltrenner halbwegs, bei uns nicht. So oder ähnlich sind die ganzen Punkt - Komma - Macken im Inventor entstanden!
------------------ Grüße Jörgen P.S. außerdem ist die Verwendung von "globalen" Objekten in Funktionen (hier: m_oUOM) schlechter Programmierstil. [Diese Nachricht wurde von Pisarz am 28. Februar 2003 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Ehrenmitglied V.I.P. h.c. Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Desktop: 3.3GHz;8GB;SSD OCZ Vertex 3;Gainward Phantom GTX570 Laptop: Alienware m17x Win7, Inventor2012 64Bi
|
erstellt am: 28. Feb. 2003 20:53 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
|
MPeisler Mitglied
Beiträge: 95 Registriert: 31.01.2001
|
erstellt am: 04. Mrz. 2003 08:53 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Pisarz: Hi, dieses Stück Code ist ein denkbar schlechtes Bispiel für VBA-Programmierung und gehört eigentlich nur in ein Tutorial, wenn man es als abschreckendes Beispiel benutzt.
Moin Jörgen, bin heute den ersten Tag auf Arbeit. Danke für Deinen Beitrag, er hat mir sehr geholfen. Das Problem kann ich jetzt wohl lösen. Schade das AD nicht mal sowas hinbekommt! Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cagiva Mitglied Maschinenbaukonstrukteur
Beiträge: 491 Registriert: 11.06.2001 AIP2008 SP1/3GB --------------- WIN XP Prof. SP2 AMD Athlon 64X2 DualC. 3800+ 1GHz 4GB RAM ---------------- + SPI Blech 2008 + iProperty Collection V2.4
|
erstellt am: 02. Apr. 2003 21:48 <-- editieren / zitieren --> Unities abgeben: Nur für MPeisler
Hallo, gut das ich mal was gestöbert hab. Ich habe nämlich heute auch dieses Tutoriel von iV ausprobiert und es klappteebenfalls nicht; jetzt weiß ich ja wieso. Nun jetzt zu meiner Frage, da ich auch in VBA einsteigen möchte: Welche Literatur könnt Ihr empfehlen, bzw. wo finde ich noch Übungen für den IV6 zum testen mit VBA. Soll man überhaupt noch VBA6 lernen oder besser direkt VBA7? Läuft IV7 noch mit VBA6? Stimmt es das VBA7 nicht abwertskompatibel ist? ------------------ Danke Mfg Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MPeisler Mitglied
Beiträge: 95 Registriert: 31.01.2001
|
erstellt am: 03. Apr. 2003 09:53 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, ich habe mir einfach ein Buch über VBA im Excel besorgt und mir einige der VBA-Programme aus dem Forum runtergeladen! Der Rest ist "lerning by doing"! Ich habe allerding fest gestellt das es wesentlich einfache wäre VBA im Inv. zu machen wenn man sich den Inv. auf Englisch installiert. Ist zumindest meine persönlich Meinung! VBA im Inv.6 oder Inv.7 wird keinen großen Unterschied machen da es kein Inventor spezifisches VBA gibt! Du kannst mit VBA nur auf die Funktionen vom Inv. zugreifen die er eh schon hat und somit auch nur das nutzen was Inv. eh schon kann. Abwärtskompatibel kann VBA für Inv. 7 also nur so weit sein wie Bauteile vom Inv.7 abwärtskompatibel sind, also wohl eher überhauptnicht! Hoffe nicht zu viel falsche Info gegeben zu haben! Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |