| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | NVIDIA GTC Paris und ISC High Performance-Konferenz 2025, eine Pressemitteilung
|
Autor
|
Thema: VBA Quaderauswahl - stehe auf dem Schlauch (1043 mal gelesen)
|
doubleq23 Mitglied
 Beiträge: 6 Registriert: 11.06.2015 Windows 7 prof, AutoCAD 2017
|
erstellt am: 11. Jun. 2015 19:27 <-- editieren / zitieren --> Unities abgeben:         
Hallo liebe VBA-Profis, ich beschäftige mich hauptsächlich nicht mit VBA, deshalb sind meine Makros eher in Holzfäller-Art geschrieben, was für meine Anforderungen aber immer mehr als ausreichend war. Nun bin ich aber nach dem Wechsel von ACAD 2010 auf 2015 in eine Falle getappt: Der Quellcode unten zum Auswählen von Quadern im Modellbereich lief unter 2010 problemlos, während unter 2015 beim zweiten Aufruf stets eine Unhandled Exception ausgelöst wird - allerdings nur im Programmablauf, nicht wenn ich das Programm im Einzelschrittmodus debugge. Das kommt mir sehr seltsam vor, weshalb ich vermute, dass ich irgendeinen basalen Fehler im Code habe, der auf mangelndes tieferes Verständnis zurückzuführen ist. Kann mir jemand einen Tipp geben, wie ich diesen Code so schreibe, dass er sicher und stabil läuft? Ich möchte zur weiteren Verwendung einfach ein SelectionSet mit ausgewählten Quadern. Beste Grüße Christian Code:
Sub Auswahl_Quader(ByRef Sset As AcadSelectionSet) On Error Resume Next 'Auswahlsatz löschen, falls vorhanden For Each Sset In ThisDrawing.SelectionSets If Sset.Name = "NeuerAuswahlsatz" Then Sset.Delete End If Next ThisDrawing.Utility.Prompt (vbCr & "Wählen sie Quader aus, die die gewünschten Sargmaße repräsentieren:") Set Sset = ThisDrawing.SelectionSets.Add("NeuerAuswahlsatz") Sset.SelectOnScreen Dim t, b, h As Double Dim Obj As AcadEntity Dim Obj3d As Acad3DSolid Dim Auswahl As VbMsgBoxResult For Each Obj In Sset If Obj.ObjectName = "AcDb3dSolid" Then Set Obj3d = Obj If Obj3d.SolidType <> "Quader" Then Obj3d.Delete End If Else Obj3d.Delete End If Next End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin

 Beiträge: 2855 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2025 Plateia, Canalis Visual Basic
|
erstellt am: 11. Jun. 2015 22:42 <-- editieren / zitieren --> Unities abgeben:          Nur für doubleq23
Hallo Christian, Willkommen im Forum Solche Quick-and-dirty Programme hat wohl jeder der neben seinen Projekten sich kleine Hilfsanwendungen schreibt. Habe da auch so einige Testprojekte von denen die restlichen Mitarbeiter nichts wissen  Zu Deinem Programm: - Was mir als erstes aufgefallen ist, Du hast fast keine (sichtbaren) Variablendefinitionen, können natürlich auch woanders global definiert sein. Gerade unter VBA7 sollte man da vorsichtig sein und alle Programme mit Option Explicit laufen lassen. - On Error Resume Next Auch eine gefährliche Anweisung, die Fehler vertuscht. Sollte nur in wenigen Fällen verwendet werden. Besser ist hier eine Abfangroutine, die in jede Procedur eingebaut wird. Standardgerüst:
Code: Sub Mein_Prog()On Error GoTo Err_Handler ' Hier Programmcode ' Programmende und Unterroutinen GoTo Exit_Sub ' oder bereits hier Exit Sub Err_Handler: MsgBox "Fehler " & Err.Number & " : " & Err.Description Stop Resume Next Exit_Sub: End Sub
Vorteil dieser Variante ist, man weiß sofort welcher Fehler auftritt und wenn man mit F8 weitergeht findet man sofort die Zeile. Eine Variante zum Verwenden Deiner Version wäre temporär:
Code: Dim mySSet As AcadSelectionSet On Error Resume Next ' Neuen SS anlegen Set mySSet = ThisDrawing.SelectionSets.Add("NeuerAuswahlsatz") If Err Then ' SS gibt es schon, zuordnen Set mySSet = ThisDrawing.SelectionSets("NeuerAuswahlsatz") ' und bestehenden löschen mySSet.Clear Err.Clear End If ' Err Handler wieder aktivieren On Error GoTo Err_Handler
Ohne tiefer hineinzugehen:
Code:
For Each Obj In Sset If Obj.ObjectName = "AcDb3dSolid" Then Set Obj3d = Obj If Obj3d.SolidType <> "Quader" Then Obj3d.Delete End If Else Obj3d.Delete 'Sollte hier nicht Obj.delete stehen? Evtl. ist ja noch gar kein Obj3d definiert End If Next
Hoffe es hilft ein wenig Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
doubleq23 Mitglied
 Beiträge: 6 Registriert: 11.06.2015 Windows 7 prof, AutoCAD 2017
|
erstellt am: 12. Jun. 2015 13:56 <-- editieren / zitieren --> Unities abgeben:         
Hallo Klaus, vielen Dank für Deine schnelle Antwort! Option Explicit ist bei mir Standard - das war eines der ersten Dinge, die mir beim Einstieg in damals noch VisualBasic eingetrichtert wurde. Der Hinweis mit dem Resume Next ist absolut richtig - Danke für den Code-Schnipsel! Mittlerweile läuft es - ich habe da vor allem dafür gesorgt, dass nicht ein leerer Zeiger übergeben wird, der dann von der geposteten Funktion mit einem Objekt versorgt wird. Jetzt erstelle ich das SelectionSet schon in meiner aufrufenden Funktion und es läuft. Besten Dank! Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |