Autor
|
Thema: Modul aufrufen funktioniert nur sporadisch (1483 mal gelesen)
|
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 11:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich habe ein eher merkwürdiges Problem. Und zwar habe ich ein VBA Projekt, welches mehrere Makros enthält. Neben den 4 eigentlichen Makros auch eine Modul, welches ein Startmenu für die anderen Makros darstellt. Das funktioniert soweit problemfrei. Um den Komfort etwas zu erhöhen habe ich in die Makros einen Code implementiert, der bei Abbruch des Makros das Startmenu wieder aufruft. Das merkwürdige ist, dass dieser Code mal funktioniert und mal nicht - was für mich extrem unlogisch ist, da er entweder zu funktionieren hat, oder halt gar nicht. Aber nur ab und zu mal kann ich mir schwer erklären. Daher bitte ich um eure Tipps, wo ich den Fehler eingebaut habe. Vielen Dank im Voraus. anbei der Code: Der Code des Startmenu:
Code: Option ExplicitPublic Opt_cancel As Integer Public Sub CATMain()
Load mainmenu mainmenu.StartUpPosition = 1 mainmenu.Show vbModeless End Sub Public Sub Run_CatVBA(strPfad As String, strMakro As String, strMakrostart As String) '***Deklarationen Dim vntParameter() As Variant Dim vntSystemService As Variant '***Makro aufrufen Set vntSystemService = CATIA.SystemService Call vntSystemService.ExecuteScript(strPfad, catScriptLibraryTypeVBAProject, strMakro, strMakrostart, vntParameter) End Sub
Exemplarisch der Aufruf eines Makros aus dem Startmenu:
Code: Private Sub cmd_project_Click() mainmenu.Hide Projektstruktur.CATMain End Sub
im Makro der Befehl, der hinter dem Abbruch-Button steht:
Code: Private Sub CommandButton1_Click()Unload Me Opt_cancel = 1 End Sub
und der dazugehörige Code im Makro "Projektstruktur":
Code: Public Projekt_Art Public Projekt_Nr As String Public Projekt_zNr As String Public InputPraefix Public HauptverzeichnisPublic In_Verz As String Public WORK_Verz As String Public OUT_Verz As String Public Opt_autoSave As Integer Sub CATMain() Opt_cancel = 0 '--------------- User-Form aufrufen Form_Projekt.Show '--------------- Ende User-Form aufrufen Debug.Print "Opt_Cancel Projektstruktur" Debug.Print Opt_cancel '--------------- Abbruch und Hauptmenu aufrufen If Opt_cancel = 1 Then Startmenu.CATMain Exit Sub End If '--------------- Ende Abbruch und Hauptmenu aufrufen
Anmerkung: Der Wert Opt_Cancel wird korrekt auf den Wert 1 geändert, sobald man die Form abbricht. Er beendet das Makro auch korrekt (Exit Sub), jedoch erscheint das Startmenu nicht zuverlässig. [Diese Nachricht wurde von sto.teac am 17. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 13. Jul. 2015 11:31 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Hallo, also ich weis nicht genau, was du da machst, aber wenn du im Code Opt_cancel = 0 verwendest und dieser in einer Schleife aufgerufen wird, ist es doch reiner Zufall, ob das mit Opt_Cancel = 1 funktioniert oder nicht. Wenn nämlich Cancel vorher gedrückt wird, wird es im Code wieder mit 0 überschrieben. Macht an dieser Stelle für mich auch keinen Sinn. Als nächstes sei klar zu sagen, wenn du das Menu mit hide ausblendest, dann musst du entweder per .visible = true oder .show das ding wieder in Show setzen. Das "Load mainmenu" was auch immer da passiert, scheint mir schon zu viel und Startupposition dürfte beim zweiten Aufruf keine Auswirkung haben! Das ist das, was ich unsauber finde. Mehr kann ich erst sagen, wenn es mehr Code gibt ------------------ MFG Rick Schulz Nettiquette (CAD.de) - Was ist die Systeminfo? - Wie man Fragen richtig stellt. - Unities
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 13. Jul. 2015 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
|
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 12:16 <-- editieren / zitieren --> Unities abgeben:
Danke schon mal für das Feedback. Ich versuche die Idee dahinter noch mal logisch zu skizzieren: - das Startmenu wird über einen Button in einer Toolbar aufgerufen - über das Startmenu wird das Makro (als Beispiel) Projektstruktur aufgerufen - in dem Moment wird das Startmenu ausgeblendet und das Makro Projektstruktur gestartet - der User entscheidet sich das Makro Projektstruktur mit dem in dessen Userform enthaltenen Abbruch-Button zu beenden - das Makro wird normal beendet und das Startmenu erneut aufgerufen So ist es gedacht - eventuell wird auch nach erfolgreichen Abschluss des Makros das Startmenu wieder aufgerufen, aber bevor ich mir darüber Gedanken mache muss der Mechanismus erst einmal funktionieren. Ich hoffe das Ziel konnte ich jetzt klar definieren?! Zu den Anmerkungen: Der Wert Opt_Cancel wird bei Start des Makros auf 0 gesetzt, um sicher zu gehen, dass das Makro nicht "aus versehen" durch einen alten Stand der Option abgebrochen wird. Danach wird die Userform des Makros gestartet. Wird hier abgebrochen, wird die Userform geschlossen und der Wert Opt_Cancel auf 1 gesetzt. Damit sollte dann die If-Option aktiv werden und das Makro beenden und das Startmenu aufrufen. Jedoch macht es das nur unregelmäßig - und im Moment finde ich den Grund nicht warum es manchmal klappt und manchmal nicht, obwohl der Wert für Opt_Cancel immer korrekt gesetzt wird.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 12:21 <-- editieren / zitieren --> Unities abgeben:
Update: Aufgrund des Hinweises zu "load mainmenu" habe ich die Zeile durch "mainmenu.show" ersetzt. Damit scheint es ohne Probleme zu funktionieren. Kann mir das ein erklären? Update 2: es liegt an dem vbModeless ... wenn ich das weg lasse, funktioniert es. Ich benötige diesen Modus aber, um weiter auf Catia zugreifen zu können, während das Menu geöffnet ist. Vorschläge? [Diese Nachricht wurde von sto.teac am 13. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 13. Jul. 2015 12:24 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
|
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 13. Jul. 2015 12:25 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
|
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 12:52 <-- editieren / zitieren --> Unities abgeben:
Code: MainMenu.visible = true
das verursacht einen compile error und ob ich "mainmenu.hide" oder "unload me" für das Hauptmenu nehmen macht keinen Unterschied - zumindest tritt das Problem bei beiden Varianten auf. Im Moment glaube ich eher, dass es mit dem vbModeless zusammenhaengt. Soweit mir bekannt, kann man kein modeless benutzen, wenn ein modal aktiv ist. soweit so restriktiv, aber ich schließe ja das modal vorher wieder. von daher sollten diese sich doch eigentlich nicht in die quere kommen oder?! [Diese Nachricht wurde von sto.teac am 13. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 13:54 <-- editieren / zitieren --> Unities abgeben:
eine neue Erkenntnis und noch mehr Unverständnis ich habe in meinem Makro eine Abfrage, ob im Bauteil eine Selektion vorgenommen wurde. Diese Abfrage ist ganz normal im Code implementiert und schaut wie folgt aus:
Code: If Usel.Count > 0 Then first_sel_value = Usel.Item(1).Value.Name Else MsgBox ("Es wurde keine Auswahl getroffen! - Das Makro wird beendet.") Startmenu.CATMain Exit Sub End If
wie der geneigte Leser erkennt, ist im else-Teil der Aufruf des Hauptmenu und die Beendigung des Makros programmiert. Das funktioniert jedes mal! Nun gehen wir davon aus, dass eine Selektion vorhanden ist und der Programmcode läuft weiter, bis die Userform des betreffenden makros aufgerufen wird:
Code: '--------------- User_Form aufrufen batch_rename.Show '--------------- Ende User_Form aufrufen
In der Userform wir Abbrechen gedrückt:
Code: Private Sub Cmd_cancel_Click() Opt_cancel = 1 Unload Me End Sub
und wir springen zurück in den normalen Code des Makros, wo folgende Schleife wartet: Code: '--------------- Abbruch und Hauptmenu aufrufen If Opt_cancel = 1 Then Startmenu.CATMain Exit Sub End If '--------------- Ende Abbruch und Hauptmenu aufrufen
Die Schleife enthält den selben Code, wie weiter oben die Abfrage der Selektion im else-Bereich. Dennoch funktioniert es hier nicht. Das Makro wird beendet, aber das Hauptmenu erscheint nicht, bzw. wird ebenfalls gleich wieder beendet. Das verstehe ich einfach nicht [Diese Nachricht wurde von sto.teac am 13. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Moderator² Head of CAD, Content & Collaboration / IT-Manager
Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 13. Jul. 2015 14:31 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
|
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 14:59 <-- editieren / zitieren --> Unities abgeben:
aber wenn ich das in den CommandButton schreibe kehrt er ja dennoch in das Makro zurück, von dem aus die Form aufgerufen wird. Und wenn ich dort ein Exit Sub integriere scheint er damit auch das Hauptmenu mit zu schließen. Lasse ich es weg will er das Makro weiter führen, was auch nicht zum Ziel führt. Wie kann ich veranlassen, dass nur das Makro geschlossen wird, aber nicht das Hauptmenu. Gibt es einen Befehl mit dem ich nur das explizit benannte Makro beende? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jul. 2015 15:09 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Hallo sto, mal eine gemeine Zwischenfrage: Warum legst Deine Makros nicht auf eine (eigene) Toolbar? Just a thought, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 15:15 <-- editieren / zitieren --> Unities abgeben:
Hallo, mein Chef wünscht sich dieses Menu, damit automatisch alle Aktualisierungen/Erweiterungen/neuen Makros an die User übergeben werden ohne das man sich neue Makros einbinden etc muss. Und dazu kommt, dass ich das hinbekommen will. Kann doch nicht sein, dass ich mich von dem blöden Programm veräppeln lasse [Diese Nachricht wurde von sto.teac am 13. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 13. Jul. 2015 16:47 <-- editieren / zitieren --> Unities abgeben: Nur für sto.teac
Ah, die Eitelkeit! So geht's mir auch immer. :-) Es ist ein wenig schwierig im bisherigen Thread den Faden zu finden. Deshalb kurz, was ich bisher verstanden hab: - es gibt in einer 'catvba' ein 'Hauptmakro', das nie seinen Namen ändert und per Button aus Catia aufrufbar ist; - in derselben catvba sind n(gegenwärtig 4) Kinder-Makros mit eigenem Modul und eventuell eigener Userform. - im Haupt-Makro gibt's eine Auswahlmöglichkeit um ein bestimmtes Kinder-Makro zu starten Was ich jetzt gerne noch anfügen würde, ist, dass nach Beenden des Kindermakros die Kontrolle wieder zur aufrufenden Routine des Hauptmakros zurückkehrt. Das geht automatisch, wenn das Makro noch im Speicher ist. Dazu braucht's kein nochmaliges Starten des Hauptmakros. Deshalb eine Frage und ein Vorschlag: - Schliessen die Kindermakros sauber ab? Auch nach Cancel? - Setz den Start-Code für das Kinder-Makro zwischen ein 'Hide/Show' -Pärchen Pseudo-Code: Hide_MainMakro Start_KinderMakro Show_MainMakro Hope it helps, Joe ------------------ The problem with the world is that the intelligent people are full of doubts, while the stupid ones are full of confidence. ~Charles Bukowski Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sto.teac Mitglied CAD Designer / LV series production
Beiträge: 66 Registriert: 23.07.2010 Catia V5-6 R24 Release 2014 HF20
|
erstellt am: 13. Jul. 2015 17:03 <-- editieren / zitieren --> Unities abgeben:
soho ... ich glaube jetzt habe ich es habe jetzt ein buntes Potpourri aus unseren 3 Ideen gebaut die (scheinbare - muss noch in ein paar Tests endgültig verifiziert werden) Lösung schaut wie folgt aus: Aufruf des KindMakros im Startmenu:
Code: Private Sub cmd_bodies2product_ntool_Click()' Unload Me mainmenu.Hide Opt_NTool = 1 bodies2product.CATMain End Sub
Abbruch des KindMakros in dessen eigener Userform + Aufruf des ParentMakro: Code: Private Sub cmdbtn_cancel_Click() Opt_cancel = 1 Unload Me ' Startmenu.CATMain mainmenu.Show End Sub
Wirkliches beenden im CATMain des KindMakros: Code: If Opt_cancel = 1 Then ' Startmenu.CATMain Debug.Print "Schleife erreicht" Exit SubEnd If
Die Kombination aus den Hinweisen hat zu dieser Lösung geführt und ich bedanke mich freundlichst dafür und hoffe, dass diese wirklich standfest ist Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |