Clever-Excel-Forum

Normale Version: Multifunktionsleiste
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Ich habe ein Custom Ribbon erstellt mit 2 Buttons, funktioniert soweit auch wunderbar. Jetzt möchte ich wenn ich auf Button1 ( Import) klicke sich dieser deaktiviert. Wenn ich Button 2 (Export) klicke soll der Button1 wieder aktiviert sein.
Hallo Hubertus,

hier mal eine Idee.

Zunächst einmal musst Du Dir eine Objektvariable für den Ribbon besorgen, um später darauf zugreifen zu können. Hierzu ist im XML-Code die onLoad-Funktionalität einzubauen. s.Beispiel.
Dann sicherstellen, dass ein Getenabled-Event für den Button1 ausgelöst werden kann und eine Callback-Funktion dazu angeben.

Ein (ungetestes) Beispiel für den XML-Code
Code:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="cbRibbonInit">

<button id="btnListe1" onAction="cbBtn_OnAction" label="Labeltext1" imageMso="DataRefreshAll" size="large"  
 getEnabled="cbBtn_enabled" />
<button id="btnListe2" onAction="cbBtn_OnAction" label="Labeltext2" imageMso="DataRefreshAll" size="large" />


Im zugehörigen VBA-Code würde ich mir eine globale Variable zur Aufnahme des gewünschten Buttonzustandes anlegen, diese in der OnAction-Sub der beiden Buttons entsprechend setzen und in der Callback-Funktion für Getenabled zum Setzen des Buttonzustandes Button1 verwenden.

Ein (ungetestetes) Beispiel für den VBA-Code:
Code:

Dim bButton1Enabled As Boolean
Dim myRibbon        As IRibbonUI

Sub cbRibbonInit(Ribbon As IRibbonUI)
'Objektvariable auf das Ribbon-Objekt setzen
 Set myRibbon = Ribbon
End Sub

Sub cbBtn_OnAction(control As IRibbonControl)
  Select Case control.ID
  Case "btnListe1"
       bButton1Enabled = False
       myRibbon.InvalidateControl "btnListe1"
  Case "btnListe2"
       bButton1Enabled = True
       myRibbon.InvalidateControl "btnListe1"
  End Select
End Sub

Sub cbBtn_enabled(control As IRibbonControl, ByRef enabled)
  Select Case control.ID
  Case "btnListe1": enabled = bButton1Enabled
  End Select
End Sub

_________
viele Grüße
Karl-Heinz
Hallo!

Hinweis:
Da "bButton1Enabled" beim Öffnen der Arbeitsmappe False ist, muss man sie beim Öffnen über Workbook_Open erst noch auf True setzen (ist kein Problem, da Ereignis-Makros zuerst abgearbeitet werden).

Gruß, René
Nach vielen Versuchen die Buttons "bButton1Enabled" die beim Öffnen der Arbeitsmappe deaktiviert sind wieder zu aktivieren sind gescheitert.
Wie aktiviere ich die Buttons? Mir fehlen hier einfach die nötigen Kenntnisse.
Für die Hilfe bin ich sehr dankbar.
Hallo Hubertus,

Du solltest hier mal (D)eine Mappe hochladen oder eine Beispielmappe, wo die entsprechenden Komponenten drin sind.

viele Grüße
Karl-Heinz
Hallo Hubertus,

Du hast Dich leider nicht an meine und Rene's Empfehlung gehalten...
Außerdem hast Du auch den zweiten Button mit der Aktiv-Schaltemöglichkeit versehen, ohne die entsprechenden Variablen but1 und but2 beim Öffnen der Mappe auf true zu setzen.
Dadurch waren beide Button inaktiv und eine Einschaltmöglichkeit nicht mehr gegeben.
Die Invalidate-Funktion muss nach jeder but1/2 -Änderung gestartet werden, damit die Callbacks wieder ausgeführt werden und nicht nur beim Starten der Mappe.

Nachfolgend  mal Dein Code für eine Toggleschaltung angepasst (Vorschlag). 
Ich empfehle Dir auch, spätestens beim Wirkbetrieb sprechende Callbackfunktionsnamen zu verwenden. Makro1 und Makro2 fällt sicher nicht darunter.

Hinweis: Wenn beim Aufbau Deiner weiteren Programmierung Deines Tools ein Fehler auftreten sollte, ist auch die Variable gobjRibbon kaputt und kein Zugriff auf die Button mehr möglich. Dann muss ds Tool neu gestartet werden.
Code:

Option Private Module
Option Explicit

Public gobjRibbon As IRibbonUI
Public but1 As Boolean
Public but2 As Boolean

Public Sub OnRibbonLoad(Ribbon As IRibbonUI)
    Set gobjRibbon = Ribbon
End Sub

'Callback for but1 getEnabled
Sub GetEnabled_but1(control As IRibbonControl, ByRef returnedVal)
    returnedVal = but1
End Sub

'Callback for but2 getEnabled
Sub GetEnabled_but2(control As IRibbonControl, ByRef returnedVal)
    returnedVal = but2
End Sub

Sub Makro1(control As IRibbonControl)
    but1 = False
    but2 = True
    gobjRibbon.Invalidate
End Sub

Sub Makro2(control As IRibbonControl)
    but1 = True
    but2 = False
    gobjRibbon.Invalidate
End Sub


Private Sub Workbook_Open()
   but1 = True
   but2 = True
End Sub

_________
viele Grüße
Karl-Heinz