Hot News:
   

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Makro über Icon beenden und neues Makro starten

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

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
  
PNY gibt strategische Partnerschaft mit F5 bekannt, um die Implementierung sicherer High-Performance Infrastrukturen in der EMEA-Region voranzutreiben, eine Pressemitteilung
Autor Thema:  Makro über Icon beenden und neues Makro starten (155 mal gelesen)
otm
Mitglied
Bauingenieur


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

Beiträge: 196
Registriert: 26.08.2009

MS Win 11
AutoCAD Civil 3D 2026
VBA Enabler 2019
MS Access Database Engine X64
MSO 365 (64bit)

erstellt am: 17. Mrz. 2026 12:44    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

Liebes Forum,

wie kann man in AutoCAD ein laufendes VBA Makro, das auf eine Usereingabe wartet,
über einen Icon in der Werkzeugleiste beenden und ein neues Makro starten?

Die Usereingabe ("Block auswählen) ist so programmiert, dass Fehler, wie z.B. "Drücken der Taste ESC" in der Eingabe abgefangen werden.

Das Problem ist, wenn bei laufendem Makro ein neues Makro über einen Icon in der Werkzeugleiste (^c^c-vbarun NeuesMakro gestartet werden soll, reagiert die Fehlerabfangroutine und das laufende Programm wird nicht beendet, sondern läuft weiter.

Wie kann man das lösen?

------------------
Grüße aus München
Christian

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



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

Beiträge: 22811
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 17. Mrz. 2026 12:55    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 otm 10 Unities + Antwort hilfreich

Drücken der ESC-Taste ist kein Fehler, sondern ein Befehl an das Programm den aktuellen Vorgang abzubrechen.

Wer auch immer also  "Drücken der Taste ESC" in der Eingabe abgefangen werden" programmiert hat,
hat einen Fehler gemacht (es wurde gegen die gängige Syntax des Programm programmiert).

Korrigiert den Fehler und die Frage wäre nicht aufgetaucht.

Da dies auf der Hand liegt, du aber nicht angesprochen hast: Warum?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

fred_tomke
Mitglied
Applikationsingenieur


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

Beiträge: 157
Registriert: 14.06.2004

Map 2015 x64
Win7 x64
12 GB RAM
ADN
OpenDCL

erstellt am: 17. Mrz. 2026 12:59    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 otm 10 Unities + Antwort hilfreich

Hallo, das geht so nicht, wenn Du im laufenden Makro über die Fehlerbehandlung ESC abfängst und nicht ordnungsgemäß beenden kannst.
Du könntest über die USERI...-Systemvariablen einen Flag setzen, der dem laufenden Makro das Signal gibt: Hey, bei ESC brich nicht ab, außer es ist der Flag gesetzt. Das bedeutet aber, Du musst auch den anderen Code anpassen.
VG, Fred

------------------
Fred Tomke
Dipl.-Ing. (FH) Landespflege

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

otm
Mitglied
Bauingenieur


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

Beiträge: 196
Registriert: 26.08.2009

MS Win 11
AutoCAD Civil 3D 2026
VBA Enabler 2019
MS Access Database Engine X64
MSO 365 (64bit)

erstellt am: 18. Mrz. 2026 09:58    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 zusammen,

ich habe das so programmiert.
Weil ich nicht weiß, wie man auf das Ereignis drücken der Taste ESC, wenn eine Usereingabe gefordert ist, abfangen soll.

Der User soll einen Block anklicken.
Er hat die Möglichkeit an dieser Stelle Verschiedene Eingaben zu tätigen.
Strg+LM, Shift+LM, nur RM und eben auch auf ESC.
Bei Esc wird die Eingabe in der Zeichnung beendet und das Programm springt zu eine Eingabeformular zurück.

Wenn ich Eure Antworten richtig verstehe, sollte ich auf die Tastatureingabe ESC gar nicht reagieren. Richtig?
Unten mal der gekürzte Code.

Code:

....
    On Error Resume Next
    ThisDrawing.Utility.GetEntity objH1, basePt1, "EINEN Block auswählen: "
        iKeyCode = GetAsyncKeyState(&H1B)  ' abfragen, ob ESC noch gedrückt ist
        iMouseCode = GetAsyncKeyState(&H2)  ' abfragen, ob rechte MouseTaste gedrückt ist
        iStrgCode = GetAsyncKeyState(&H11)  ' abfragen, ob Strg gedrückt gehalten wird
...
    If Err <> 0 Then
        MsgBox Err.Number & vbCrLf & Err.Description
        Err.Clear
        If CBool(iShiftCode And &H8000) And CBool(iKeyCode And &H1B) Then
            'MsgBox "Shift+[ESC]"
...
           
        ElseIf CBool(iKeyCode And &H1B) Then  'Abbruch mit Taste "Esc"
            'MsgBox "[ESC]"
            'Programm beenden
            GoTo Exit_Sub
               
        ElseIf CBool(iMouseCode And &H1) Then  'rechte Moustaste wurde gedrückt
            'MsgBox "RM"
...
            GoTo Exit_Sub
           
           
        Else 'Bei Blockeingabe ins Leere geklickt
           
            If CBool(iStrgCode And &H8000) Then
                'MsgBox "[Strg] + LM, Ins Leere geklickt"
                ...

            ElseIf CBool(iShiftCode And &H8000) Then
                'MsgBox "[Shift] + LM, Ins Leere geklickt"
...
               
            Else
                'MsgBox "LM, Ins Leere geklickt"
...
               
            End If
           
        End If
    Else

    Endif


Wenn das Makro auf die Eingabe eines Blocks wartet und ich ein neues Makro über die Werkzeugleiste starte entsteht ein Fehler.

Deshalb die Frage: Wie breche ich eine Usereingabe durch anklicken eines Icons in der Werkzeugleiste ab?

------------------
Grüße aus München
Christian

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



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

Beiträge: 22811
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 20. Mrz. 2026 10:33    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 otm 10 Unities + Antwort hilfreich

Hi,

ganz klar komme ich mit deiner Antwort nicht, aber ich antworte dennoch
und hoffe hier meldet sich für dich bald mal ein VBA Geschulter, HALLO?!?

>"Weil ich nicht weiß, wie man auf das Ereignis drücken der Taste ESC, wenn eine Usereingabe gefordert ist, abfangen soll"
Dein Code sieht mir aber ganz so aus als würdest du das bereits machen!?
Abfangen bedeutet doch das man die Aktion unterbindet, oder verarbeitet (statt den natürlichen Lauf der Dinge zu gewähren)

>"Strg+LM, Shift+LM, nur RM und eben auch auf ESC."
>"Bei Esc wird die Eingabe in der Zeichnung beendet und das Programm springt zu eine Eingabeformular zurück"


Okay, ich hoffe ich kann jetzt für dich die Situation 'für alle' klar darlegen, aber womöglich hast du noch nicht alle Infos gegeben:

Level 0, kein Befehl aktiv
Level 1, man startete einen Befehl (hier ist noch nicht klar ob man direkt in dem Eingabeformular ist, oder ob das Eingabeformular eine Folge irgendeiner Aktion ist)
Level 2, im Eingabeformular wurde irgendwas gewählt und man wird zur Objektwahl aufgerufen
<<Dann klickt der USer auf eine ACAD Standard-Schaltfläche wie zB. "Kopieren">>

Soweit richtig?
Das Eingabeformular sollte man, wenn es das nicht ohnehin ist, dem oldschool Windows-Dialogfenster gleichsetzen können, richtig?
In dem Fall wird das in AutoCAD selbst auch nicht sauber gehandhabt:
Ein [ESC] würde die Objektwahl abbrechen, jedoch nicht den Befehl
man landet wird im Windows-Dialogfenster
wird dieses dann geschlossen, verarbeitet Acad das zweite [ESC] aus dem Menümakro
und bricht damit den laufenden Befehl ab, oder wenn kein Befehl läuft - dann ist es halt ein sinnloses[ESC] ohne jegliche Wirkung.
Danach wird der Befehl, wie zB. Kopieren, gestartet.

Menümakro können nicht auf Dialogfenster wirken.
Wenn du dein Tool anders arbeiten lassen möchtest, also nicht entsprechend dme acad Standard, dann
liegt das in deiner Hand.
Wenn bei der Objektwahl ESC gedrückt wird, dann setze ein Flag "ESC=Ja" und zurück im Eingabeformular ist deinem
dir/deinem Programm dann bekannt das es schließen muss.


>"Wenn ich Eure Antworten richtig verstehe, sollte ich auf die Tastatureingabe ESC gar nicht reagieren. Richtig?"
ESC bricht den aktuellen Level ab, du mußt also reagieren - aber das machst du ja auch schon!

Beispiel


>"entsteht ein Fehler"
Zweit schlechteste und am häufigsten verwendete Formulierung im Supportdienst 
Acad-Fehler? VBA-Fehler? Fehlermeldung? -> da ich mich aber aktuell nicht näher mit VBA beschäftige, wäre das nur für andere Interessant

>"Deshalb die Frage: Wie breche ich eine Usereingabe durch anklicken eines Icons in der Werkzeugleiste ab?"
Du brichst doch schon ab und landest im Eingabeformular (was hoffentlich ein oldschool Windowsdialog Fenster ist, nur dann stimmt es was ich schreibe)

Das Problem in AutoCAD ist: Ein AutoCAD-Menümakro wirkt nicht auf ein Windowsdialog Fenster, niemals.
Daher wird deine Benutzereingabe abgebrochen, du landest im  Windowsdialog Fenster,
schließt du dieses
folgt das zweite ESC aus dem Menümakro *Abbruch* und das restliche Makro sollte durchlaufen.


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP



Anzeige:Infos zum Werbeplatz >>

Qarb CAD APP für Landschaft, Landschaftsarchitektur

Tree survey CAD software. Draw BS5837 compliant arboricultural constraints and protection plans. Highly flexible and easy to use.

otm
Mitglied
Bauingenieur


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

Beiträge: 196
Registriert: 26.08.2009

MS Win 11
AutoCAD Civil 3D 2026
VBA Enabler 2019
MS Access Database Engine X64
MSO 365 (64bit)

erstellt am: 21. Mrz. 2026 16:15    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

Hi cadffm,

danke für die Denkanstöße.

Ich habe meinen Code mal verschlankt und hänge an folgender Stelle.
Der User wird zur Eingabe eines Blocks aufgefordert.
Statt eines Objekts klickt der User:
A) ins Leere
B) auf den Icon einer Werkzeugleiste mit dem Befehlen "^c^cNeuesMakro"
C) auf ESC

Ist die Fehlerabfangroutine mit "On Error Goto 0" ausgeschaltet dann entsteht der Fehler -2147352567 und das Programm hält an "Debuggen oder beenden".

Setze ich "On Error Resume Next" vor die Objektwahl, läuft das Programm  weiter und geht in die If-Abfragen. Es läuft aber in allen drei Fällen einfach durch.

Mein Problem ist, dass die Aktion "mit LM ins Leere geklickt" sich nicht von der Eingabe ESC unterscheiden lässt, da immer die gleiche Fehlernummer ausgegeben wird.

Wie kann ich die beiden Fälle unterscheiden? 

Hier mal mein Testcode:

Code:

Sub Main()
    Dim boL As Boolean
    'Formular laden
    Load UserForm1
A:
    'Formular anzeigen
    UserForm1.show
    'Unterprogramm aufrufen
    Test1 boL
    If boL = True Then GoTo A
    'Formular entladen
    Unload UserForm1

End Sub

Sub Test1(Optional boL As Boolean = False)
    Dim iKeyCode, iMouseCode, iStrgCode, iShiftCode
    Dim objH1 As AcadBlockReference
    Dim basePt1 As Variant
   
A: 'Blockwahl durch Anklicken
    On Error Resume Next
    iKeyCode = 0
    iMouseCode = 0
    iStrgCode = 0
    iShiftCode = 0
   
    'Block anklicken
    ThisDrawing.Utility.GetEntity objH1, basePt1, "EINEN Block auswählen: "
        'Mögliche Eingaben:
        'LM ... Block anklicken (Standard). Nicht fehlerauslösend.
        'Esc ... Escape.                    Fehlerauslösend
        'RM ... Keine Blockreferenz wählen, sondern vorher ausgewählte Blockreferenz erneut verwenden
        'Strg + LM auf Block ... Aktion A  Nicht fehlerauslösend.
        'Strg + LM ins Leere ... Aktion B  Nicht fehlerauslösend.
        'Shift + LM auf Block ... Aktion C  Nicht fehlerauslösend.
        'Shift + LM ins Leere ... Aktion D  Nicht fehlerauslösend.
        'LM ins Leere ... Block nicht getroffen

        iKeyCode = GetAsyncKeyState(&H1B)  ' abfragen, ob ESC gedrückt wurde
        iMouseCode = GetAsyncKeyState(&H2)  ' abfragen, ob RM gedrückt wurde
        iStrgCode = GetAsyncKeyState(&H11)  ' abfragen, ob Strg gedrückt wurde
        iShiftCode = GetAsyncKeyState(&H10)  ' abfragen, ob Shift gedrückt wurde
       
    If CBool(iStrgCode And &H8000) Then
        'Strg wird gedrückt gehalten
        '...
        Stop

    ElseIf CBool(iShiftCode And &H8000) Then
        'Shift wird gedrückt gehalten
        '...
        Stop

  Else
        'Nichts zusätzlich machen.
        '...
        Stop

    End If

    If Err <> 0 Then
        MsgBox Err.Number & vbCrLf & Err.Description, vbInformation, "LÖSCHEN"

        If CBool(iKeyCode And &H1B) Then  'Abbruch mit Taste "Esc"
            'MsgBox "[ESC]"
            'Programm beenden
            boL = False 'Rückgabewert für "Ende des aufrufenden Makros" setzen
            Stop
            GoTo Exit_Sub
       
        ElseIf CBool(iShiftCode And &H8000) And CBool(iKeyCode And &H1B) Then
            'MsgBox "Shift+[ESC]"
            'Zurück zum Formular (aus aufrufendem Sub)
            boL = True 'Rückgabewert für Loop im aufrufenden Programm setzen
            Stop
            GoTo Exit_Sub

        ElseIf CBool(iMouseCode And &H1) Then  'rechte Moustaste wurde gedrückt
            'MsgBox "RM"
            'Keine Blockreferenz wählen, sondern vorher ausgewählte Blockreferenz erneut verwenden
            'Zurück zum Formular (aus aufrufendem Sub)
            Stop
            boL = True 'Rückgabewert für Loop im aufrufenden Programm setzen
            GoTo Exit_Sub

        Else 'Bei Blockeingabe ins Leere geklickt

            If CBool(iStrgCode And &H8000) Then
                'MsgBox "[Strg] + LM, Ins Leere geklickt"
                'Zurück zum Formular
                Stop
                boL = True
                GoTo Exit_Sub

            ElseIf CBool(iShiftCode And &H8000) Then
                'MsgBox "[Shift] + LM, Ins Leere geklickt"
                'Zurück zum Formular
                Stop
                boL = True
                GoTo Exit_Sub

            ElseIf Err.Number = -2147352567 Then
                'Ausnahmefehler
                'MsgBox "LM, Ins Leere geklickt" oder "Esc"
                Stop
                Err.Clear
                GoTo A

            Else
                'MsgBox "sonstiger Fehler"
                'Erneuter Versuch
                Stop
                Err.Clear
                GoTo A

            End If

        End If

        Err.Clear

    Else 'kein Fehler
        '... Programmteil
        MsgBox "Programm läuft ab"
        Stop
       
    End If

Exit_Sub:
    Exit Sub

Err_Sub:
    GoTo Exit_Sub
   
End Sub


Danke nochmal für's Mitdenken.

------------------
Grüße aus München
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

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

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

(c)2026 CAD.de | Impressum | Datenschutz