Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  VBA Quaderauswahl - stehe auf dem Schlauch

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von doubleq23 an!   Senden Sie eine Private Message an doubleq23  Schreiben Sie einen Gästebucheintrag für doubleq23

Beiträge: 6
Registriert: 11.06.2015

Windows 7 prof, AutoCAD 2017

erstellt am: 11. Jun. 2015 19:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von KlaK an!   Senden Sie eine Private Message an KlaK  Schreiben Sie einen Gästebucheintrag für KlaK

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für doubleq23 10 Unities + Antwort hilfreich

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



Anzeige:Infos zum Werbeplatz >>

BlechCAD Verlegeplan CAD APP für AEC - Architektur-, Ingenieur- und Bauwesen, Blechverarbeitung

Metallbau- Fassadenbau- Planer, die aus einer Gebäudedraufsicht (Grundriss) die Flachdachbleche in freien selbst definierten Formen als Plan und Abwicklungen uns Listen erzeugen

doubleq23
Mitglied


Sehen Sie sich das Profil von doubleq23 an!   Senden Sie eine Private Message an doubleq23  Schreiben Sie einen Gästebucheintrag für doubleq23

Beiträge: 6
Registriert: 11.06.2015

Windows 7 prof, AutoCAD 2017

erstellt am: 12. Jun. 2015 13:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz