Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1052to1056
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

OnLoad - Ribbonobjekt Verweis neu setzen

OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 20:06:02
Nepumuk
Hallo,
aus der XML-Datei, erstellt mit dem CostumUI-Editor, in dem sich der XML-Code für die Ribbons befindet wird das Ribbon-Objekt in einer Excelmappe per OnLoad initialisiert.
In einem zentralen Errorhandler einer umfangreichen Mappe laufe ich bei eine Fehler auf eine End-Anweisung, um aus allen Ebenen von Routinen auszusteigen. Das hat allerdings zur Folge, dass natürlich auch das Ribbon-Objekt auf Nothing gesetzt wird.
Da ich die Ribbons aber dynamisch steuere (Buttons und Tabs werden bei Bedarf bzw. je nach Zugriffsberechtigung ein- / ausgeblendet) benötige ich für die Invalidate- / InvalidateControl-Methode natürlich das Ribbon-Objekt.
Ich hab zwar schon viel im Netz gelesen und auch die Hilfe des Objektmodells studiert, aber ich finde keine Methode das Objekt neu zu initialisieren.
Hast du eine Ahnung ob das geht und wenn wie?
Danke schon mal für's lesen meines Anliegens.
Gruß
Nepumuk

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 20:23:54
mumpel
Hallo!
Ein Beispielcode wäre hilfreich (meine Emailadresse müsstest Du ja noch haben). So genau habe ich nicht verstanden, wo Dein Problem liegt. Aber vielleicht genügt es, objRibbon.Invalidate auch in die End-Anweisung (Fehlerblock) einzubauen. Mache ich auch so, steige aber vor der End-Anweisung mit Exit Subcolor> aus. Es handelt sich doch bestimmt um das Projekt von Deinem Arbeitgeber, über welches wir uns schon einmal unterhalten haben? Da darfst Du verständlicher Weise keine Details nennen.
Gruß, René
AW: OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 20:48:50
Nepumuk
Hallo René,
ich muss auf eine End-Anweisung laufen. Wenn der Fehler in eine Routine der ersten Ebene passiert, wäre es ja kein Problem, aber was, wenn der Fehler in der zweiten, dritten oder noch tieferen Ebene auftritt? Da käme ich ja trotz Errorhandlers wieder eine Ebene zurück und der Code würde mit eventuell falschen oder fehlenden Werten weitermachen und neue Fehler produzieren. Ansonsten müsste ich nach jedem Aufruf einer Unterroutine eine Abfrage machen, ob diese fehlerfrei durchgelaufen ist. Es ist zwar geplant, das ganze umzubauen, aber bei fast 100.000 Zeilen Code wird das wohl noch einige Zeit in Anspruch nehmen.
Darum meine Frage, gibt es eine Möglichkeit das Ribbonobjekt neu zu initialisieren?
Gruß
Nepumuk
Anzeige
AW: OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 21:05:59
mumpel
Das geht nur mit Invalidate und/oder InvalidateControl. Eine andere Möglichkeit gibt es nicht. Wo im Code Du das einbaust, ist egal. Du kannst es auch im Fehlerblock machen. Oder vor dem Beenden des Fehlerblocks ein separates Makro aufrufen. In diesem separaten Makro kannst Du dann (nur) Invalidate und/oder InvalidateControl aufrufen, also das Ribbon neu initialisieren. Das dürfte fehlerfrei funktionieren und Du dürftest auch nicht eine Ebene zurückspringen. Das Ribbon-Objekt darf dabei natürlich nicht beendet (Nothing) werden. Also eventuell vorher das Ribbon-Objekt neu setzen und anschließend wieder beenden (Nothing).

Zitat:
Das hat allerdings zur Folge, dass natürlich auch das Ribbon-Objekt auf Nothing gesetzt wird.

Wie genau machst Du das?
Anzeige
AW: OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 21:42:23
Nepumuk
Hallo René,
also nochmal. In der OnLoad-Routine
Public objRibbon As IRibbonUI

Public Sub onLoad(Ribbon As IRibbonUI)
    Set objRibbon = Ribbon
End Sub

wird das Ribbon-Objekt (objRibbon) initialisiert.
Wenn ich im Errorhandler auf die End-Anweisung laufe, ist natürlich das Ribbon-Objekt auf Nothing gesetzt. Die Mappe wird nach der End-Anweisung neu initialisiert (ein paar öffentliche Variablen gesetz, ein paar Klassen neu instanziert usw.).
Nur für das Ribbon-Objekt habe ich noch keinen Weg gefunden es neu zu initialisieren.
Wenn nun der User etwas macht, wobei ein Ribbon-Button oder ein Ribbon-Tab ein- / ausgeblendet werden muss, wozu ich die Invalidate- / InvalidateControl-Methode benötige,
'//create menu new
#If EXCEL_VERSION > 11 Then
Call MENU_Generate_Menu_Permission
objRibbon.Invalidate
#Else
Call MENU_Main_Create
#End If

laufe ich natürlich auf einen Fehler, da die Objektvariable nun ja keinen gültigen Verweis mehr enthält.
Im Moment gebe ich eine Meldung aus, dass ein "interner Fehler" das aktualisieren der Ribbons verhindert und seine Änderung erst nach einem Neustart der Mappe angezeigt werden kann, aber das ist natürlich nur eine Krücke. Lieber wäre es mir, wenn ich das Objekt irgendwie neu initialisieren könnte.
Jetzt klarer?
Gruß
Nepumuk
Anzeige
AW: OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 22:14:36
Gerd
Hallo Nepumuk,
könnte man dies in/über eine/r xla(m) steuern ?
Gruß Gerd
AW: OnLoad - Ribbonobjekt Verweis neu setzen
22.02.2009 22:53:30
Nepumuk
Hallo Gerd,
theoretisch ja, wenn das Addin selbst der Träger der Ribbons wäre. Dann müsste ich nur das Addin schließen und wieder öffnen. Damit wurde das Objekt neu geladen. Aber dazu müsste ich ziemlich viel ändern und es ist ja mehr oder weniger "nur" ein Schönheitsfehler. Die Ribbons werden nur in zwei Fällen dynamisch geändert. 1. Der User mit Adminrechten ändert seine Berechtigungsstufe. 2. Der User richtet sich selbst eine Ansicht (sichtbare Spalten) einer ziemlich breiten Tabelle ein. Und das Problem entsteht ja nur, wenn vor einer dieser Änderungen ein Programmfehler in Excel ausgelöst wurde.
Aber trotzdem Danke für deinen Beitrag.
Gruß
Nepumuk
Anzeige
AW: OnLoad - Ribbonobjekt Verweis neu setzen
23.02.2009 09:11:33
mumpel
Hallo!
Ich verstehe immer noch nicht, wie Du objRibbon auf Nothing setzt (objRibbon = Nothing ?). Wenn Du das nicht per Code machst, ist Invalidate immer möglich. Egal wo im Projekt Du bist. Du kannst Invalidate in jedem Makro nutzen. Dafür musst Du kein Element des Ribbon auslösen.
Beispiel:
Ich habe es nicht getestet aber vielleicht kannst Du das Objekt neu setzen: Dim Ribbon As IRibbonUIcolor>. Oder verstehe ich irgendwas nicht?
Ich sehe auc, dass Du eine Raute vor If setzt. Wozu?
Gruß, René
AW: OnLoad - Ribbonobjekt Verweis neu setzen
23.02.2009 10:19:10
Nepumuk
Hallo René,
das Ribbonobjekt wird automatisch auf Nothing gesetzt, wenn ich die End-Anweisung ausführe.
Das Hash vor dem If / Else / End If ist bedingte Kompilierung. Damit werden die Zeilen just in time kompiliert. Da es das Ribbon-Objekt in den Vorgängerversionen noch nicht gab, laufe ich dadurch auf keinen Fehler. Ich muss zwar das Modul mit dem VBA-Code in dem die Ribbon-Attribute gesetzt werden komplett auskommentieren, aber ich muss nicht den Code durchsuchen, ob das Objekt sonst noch irgendwo angesprochen wird.
Gruß
Nepumuk
Anzeige
AW: OnLoad - Ribbonobjekt Verweis neu setzen
23.02.2009 10:23:59
mumpel
Dann hast Du schlechte Karten. Nur mit Invalidate/InvalidateControl in Verbindung mit dem Ribbon-Objekt (IRibbonUI) kann man das Ribbon neu initialisieren.
AW: OnLoad - Ribbonobjekt Verweis neu setzen
23.02.2009 10:54:34
Nepumuk
Hallo René,
hab ich befürchtet. Naja, dann muss der User damit leben.
Trotzdem DANKE für dein Engagement. :-)
Gruß
Nepumuk
Zeichentools
22.02.2009 22:09:12
Nepumuk
Hallo René,
nochwas. Weißt du wie ich das Tab Zeichentools in meine CustomUI bringe?
Userbild
Die benötige ich bedarfsweise in einer Tabelle (Bauskizze erstellen) und möchte sie beim aktivieren der Tabelle einblenden und beim verlassen wieder ausblenden. Das ein- / ausblenden ist kein Problem, nur den XML-Code für ein "vorhandenes Tab" von Excel kenne ich noch nicht bzw. weiß deren Namen nicht.
Gruß
Nepumuk
Anzeige
Hab's selbst gefunden
22.02.2009 22:28:01
Nepumuk
Hallo,
das Ding hat den Namen "TabDrawingToolsFormat".
Gruß
Nepumuk

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige