Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
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

Ribbon Hyperlink 'menBtxx_getVisible''

Ribbon Hyperlink 'menBtxx_getVisible''
25.10.2021 17:58:38
MaBo
Habe eine sehr große Exceltabelle, welche schon seit vielen Jahren bisher einwandfrei funktioniert hat.
Darin wird ein extra Ribbon-Blatt eingeblendet (beim Aktivieren der Mappe) bzw. beim Deaktivieren der Mappe dieses wieder ebenfalls deaktiviert wird.
Je nach aktivem Sheet ändert sich das Menü. So weit so gut.
Jetzt plötzlich gibt es nach dem Anklicken eines Hyperlinks (und damit Öffnen der entsprechenden Excel-Datei) die folgende Fehlermeldung:
Das Makro 'menBtDatensatz_einfuegen_getVisible' kann nicht ausgeführt werden.
Für jeden möglichen Ribbon-Befehl (mehr als 30), welche alle eine Prozedur haben der Art:

Sub menBtDatensatz_einfuegen_getVisible(control As IRibbonControl, ByRef returnedVal)
returnedVal = var_menBtDatensatz_loeschen_getVisible
End Sub
kommt nun diese Fehlermeldung!
Wohlgemerkt hat die aufgerufene Mappe gar keine Makros.
Es gab vor kurzem einen Forumsbeitrag vom 19.01.21 (Fehler Ribbon GetVisible), welcher aber nicht weiter bearbeitet wurde.
Es scheint, dass das Ereignis Workbook_Deactivate plötzlich doppelt aufgerufen wird. Wenn die Makros Schritt für Schritt durchläuft kommt aber keine Fehlermeldung.
Hat jemand eine Ahnung wie man das beheben könnte?

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
dazu muß man die Datei sehen owt
25.10.2021 18:51:20
ralf_b
AW: dazu muß man die Datei sehen owt
26.10.2021 09:29:40
MaBo
Die Datei kann ich leider nicht öffentlich stellen.
Hatte deshalb gestern Abend noch versucht das Problem nachzustellen und habe eine neue Datei mit allen Makros komplett neu erstellt um dann das Problem nachzustellen. In der neuen Datei war das Verhalten dann komplett normal! Der Fehler scheint daher zu kommen, dass in der fehlerhaften Datei das Ereignis Workbook_Deactivate 2x durchlaufen wird und davon 1x mit der per Hyperlink geöffneten Datei als ActiveWorkbook. Wenn man im Makro-Code Halte Haltepunkte in den Ereignissen setzt und von Haltepunkt zu Haltepunkt den Code ablaufen lässt, dann erhält man beim 2. Durchlauf von Workbook_Deactivate die Fehlermeldung "Code kann im Haltemodus nicht ausgeführt werden.
Der Ablauf ist so:
1. Klick auf HYPERLINK
2. Aufruf des Ereignisses Workbook_Deactivate mit ThisWorkbook = Quelldatei und ActiveWorkbook = LINKdatei
3. Aufruf des Ereignisses Workbook_Activate mit ThisWorkbook = Quelldatei und ActiveWorkbook = Quelldatei
4. Aufruf des Ereignisses Workbook_Deactivate mit ThisWorkbook = Quelldatei und ActiveWorkbook = LINKdatei
An dieser Stelle kommt es dann zum Fehler.
Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 09:32:28
volti
Hallo MaBo,
vielleicht ist aufgrund eines Fehlers das Ribbon-Objekt verlustig gegangen.
Irgendwo arbeitest Du ja scher mit Ribbon.Invalidate oder Ribbon.InvalidateControl ID
Wenn ja, müsste es ggf. wieder hergestellt werden.
Aber dazu müsste man, wie Ralf schon schrieb, die Datei mal sehen....
Gruß
Karl-Heinz
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 11:30:58
MaBo
Vielen Dank erst einmal!
Ja der Befehl objRibbon.Invalidate kommt mehrfach vor.
Deklaration:
Public objRibbon As IRibbonUI
Sub:

Public Sub onload(ribbon As IRibbonUI)
Set objRibbon = ribbon
End Sub
Aber wie kann das verloren gehen (Datei-Fehler?), vor allem aber: wie kann man das wieder herstellen?
Als Alternative sehen ich ggf. nur noch die Datei komplett neu zu erstellen, was ein sehr großer Aufwand wäre.
Wäre echt Dankbar, wenn mir das erspart bleiben könnte...
Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 11:50:03
volti
Hallo,
ob das jetzt bei Dir ein Grund sein kann, weiß ich nicht.
Hier ein Beispiel, wie man sich den Ribbon-Pointer sichert, um ihn im Bedarfsfall wiederherstellen zu können.
Ich persönlich führe bei meinen Projekten die Ribbon.Invalidates immer über eine einzige Sub aus, in der dann auch gleich geprüft wird, ob der Pointer noch aktiv ist.
Code:

[Cc][+][-]

Option Explicit Dim objRibbon As IRibbonUI Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32" ( _ Destination As Any, Source As Any, ByVal Length As LongPtr) '----- Ribbon initialisieren ----- '------ Diese Funktion ist im Ribbon für OnLoad="RibbonInit" angegeben ----- Private Sub RibbonInit(lpRibbon As IRibbonUI) Set objRibbon = lpRibbon 'globalen Pointer setzen und in einem Namen sichern ThisWorkbook.Names.Add Name:="MyRibbon", _ RefersTo:=CStr(ObjPtr(lpRibbon)), Visible:=False End Sub Sub RefreshRibbon(Optional sID As String) ' Das angegebene Control oder der ganze Ribbon wird neu berechnet Dim lpRibbon As LongPtr If objRibbon Is Nothing Then ' Ribbon-Pointer aus Namen wiederherstellen On Error Resume Next lpRibbon = CLngPtr(Mid$(ThisWorkbook.Names("MyRibbon").RefersTo, 2)) RtlMoveMemory objRibbon, lpRibbon, LenB(lpRibbon) End If If sID <> "" Then objRibbon.InvalidateControl sID Else objRibbon.Invalidate End If End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 14:35:25
MaBo
VIELEN DANK!
Der Ansatz scheint erst einmal weiter zu führen.
Habe mal angefangen das umzusetzen.
Dazu habe ich aber die Ribbon-Definition bei onload belassen und einfach den Inhalt des onload Ereignisses durch dein Beispiel

Private Sub RibbonInit(lpRibbon As IRibbonUI)
Set objRibbon = lpRibbon       'globalen Pointer setzen und in einem Namen sichern
ThisWorkbook.Names.Add Name:="MyRibbon", _
RefersTo:=CStr(ObjPtr(lpRibbon)), Visible:=False
End Sub
ergänzt.
Als ich auch die Ribbon.Invalidate ersetzen wollte durch call RefreshRibbon () ergab sich das Problem, dass die Funktion "RtlMoveMemory" nicht definiert war.
Wie bekomme ich diese eingebunden?
Nochmals vielen Dank für deinen wertvollen Hinweis!
Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 14:46:52
MaBo
Noch eine Ergänzung:
Wenn ich das Ribbon.Invalidate wieder aktiviere und statt dessen call RefreshRibbon () wieder auskommentiere, dann ist zwar das ursprüngliche Problem weg, aber die Befehle im Ribbon werden nicht mehr wie bisher beim Wechsel der Sheets entsprechend angepasst und aktualisiert.
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 15:15:12
volti
Hi,
hier kann ich Dir nicht ganz folgen.
Die Sub Call RefreshRibbon() macht ja auch nichts anderes als objRibbon.Invalidate auszuführen und müsste genauso funktionieren, als wenn Du es an den vielen anderen Stellen einzeln ausführst.
Gruß
KH
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 15:09:27
volti
Hallo MaBo,
die Sub RtlMoveMemory ist in der Windowsbibliothek Kernel32.DLL enthalten und braucht nicht eingebunden zu werden.
Allerdings muss sie deklariert werden. Hattest Du das auch übernommen?
Gerne wird in verschiedenen Anwendungsbeispielen auch ein Alias verwendet, der vielleicht bezeichnender ist.
Zum Beispiel:
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, Source As Any, ByVal Length As LongPtr)

Ist für die Abarbeitung aber egal.
Gruß
Karl-Heinz
Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 15:38:40
MaBo
Hallo Karl-Heinz,
ganz großen Dank an dich. Leider erfolgt er Wechsel der Menü-Optionen damit nicht mehr.
Gerne würde ich dir eine Beispiel-Datei zusammen stellen.
Das dauert aber.
Kann ich dir diese dann ggf. irgendwie separat zukommen lassen?
Aber der Weg zu mehr Robustheit (da tatsächlich manchmal die Ribbons Probleme machen) ist wohl der richtige.
VG
MaBo
AW: Ribbon Hyperlink 'menBtxx_getVisible''
26.10.2021 16:05:15
volti
Hallo MaBo,
das interessiert mich jetzt mal. Schick die Beispielmappe dann bei Gelegenheit an mich
Gruß KH
Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
27.10.2021 08:59:56
volti
Hallo Markus,
hier die Änderungen:
Und natürlich die objRibbon.Invalidate austauschen mit Call RefreshRibbon....
Code:

[Cc][+][-]

' ----- In "DieseArbeitsmappe" ----- Private Sub Workbook_Open() ' KHV: Ist nötig weil zuerst Wb.Open und Wb.Activate abgearbeitet werden ' und dann erst Ribbon.onload ' Hierbei wird der falsche (alte) Ribbonpointer verwendet =>daher Absturzgefahr ThisWorkbook.Names.Add Name:="MyRibbon", RefersTo:=0, Visible:=False End Sub ' ----- Im Modul 1 ----- ' ------------ Ribbon-Aktionen ---------------- Dim objRibbon As IRibbonUI Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ Destination As Any, Source As Any, ByVal Length As LongPtr) Private Sub onload(lpRibbon As IRibbonUI) 'Dieses Sub ist notwendig, damit die Ribbon-Inhalt zur Laufzeit manipuliert werden können Set objRibbon = lpRibbon 'globalen Pointer setzen und in einem Namen sichern ThisWorkbook.Names.Add Name:="MyRibbon", _ RefersTo:=CStr(ObjPtr(lpRibbon)), Visible:=False var_menBtGehe_zu_getVisible = True 'ist IMMER sichtbar var_menFormatieren_getVisible = True 'ist IMMER sichtbar var_menSpezielle_Makros_getVisible = True 'ist IMMER sichtbar End Sub Sub RefreshRibbon(Optional sID As String) ' Das angegebene Control oder der ganze Ribbon wird neu berechnet Dim lpRibbon As LongPtr If objRibbon Is Nothing Then ' Ribbon-Pointer aus Namen wiederherstellen On Error Resume Next lpRibbon = CLngPtr(Mid$(ThisWorkbook.Names("MyRibbon").RefersTo, 2)) If lpRibbon <> 0 Then CopyMemory objRibbon, lpRibbon, LenB(lpRibbon) End If End If If sID <> "" Then objRibbon.InvalidateControl sID Else objRibbon.Invalidate End If End Sub ' ------------ Ende Ribbon-Aktionen ----------------

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Ribbon Hyperlink 'menBtxx_getVisible''
27.10.2021 09:59:16
MaBo
Hallo Karl-Heinz:
dein Code funktioniert! Er tut genau was er soll.
Leider ist das ursprüngliche Problem mit den Fehlermeldungen nach Aufruf von Hyperlinks immer noch nicht behoben :-(.
Es sieht so aus, dass die Datei einfach einen Schuss bekommen hat und ich diese komplett neu aufbauen muss. Jedenfalls bedanke ich mich nochmals ganz herzlich für deine tolle Unterstützung!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige