marcoborn
Goto Top

Checkbox bei Office-Ribbons

Hallo Forum,
ich habe in Excel ein Ribbon mit einer Checkbox angelegt. Jetzt möchte ich durch eine Prozedur oder Funktion den Wert der Checkbox manuell setzen, d.h. die Checkbox auf "checked" oder "nicht checked" setzen. Kann mir jemand ein kurzes Beispiel schicken, wie man das macht?

Vielen Dank,
M. Born

Content-ID: 277556

Url: https://administrator.de/contentid/277556

Ausgedruckt am: 24.11.2024 um 16:11 Uhr

Xolger
Xolger 16.07.2015 um 22:00:18 Uhr
Goto Top
MarcoBorn
MarcoBorn 17.07.2015 um 08:30:02 Uhr
Goto Top
Hallo Xolger,
die Eigenschaften etc. des Ribbon-Objekts kenne ich. Allerdings kann ich z.B. Checked während der Laufzeit nicht setzen. Es soll einen indeirekten Weg über getPressed oder onAction geben, aber das funktioniert bei mir nicht so richtig.

Viele Grüße,
M. Born
Xolger
Xolger 17.07.2015 um 10:28:47 Uhr
Goto Top
Erstellst du das Ribbon zur Laufzeit neu oder versuchst du auf ein vorhandenes zuzugreifen?
Kannst du den abfragen ob Checked true oder flasde ist?
MarcoBorn
MarcoBorn 17.07.2015 um 10:49:02 Uhr
Goto Top
Ich erstelle das Ribbon selbst zur Laufzeit. Den Wert der Checkbox kann ich auslesen, nur das Setzen funktioniert nicht.
Xolger
Xolger 17.07.2015 um 11:20:37 Uhr
Goto Top
MarcoBorn
MarcoBorn 17.07.2015 um 11:28:12 Uhr
Goto Top
Darauf war ich auch schon gestoßen. Aber scheinbar ist die Syntax zwischen VBA und VB.NET nicht einheitlich, weil es bei mir nicht funktioniert.
MarcoBorn
MarcoBorn 17.07.2015 um 11:50:20 Uhr
Goto Top
In dem Beispiel wird auch lediglich das manuelle Setzen der Checkbox ausgewertet und dann anschließend das Label neu gesetzt. Man muss jeweils die Checkbox manuell anklicken, damit etwas passiert. Bei mir muss aber das Setzen der Checkbox per Makro erfolgen, nicht durch Klicken.
colinardo
colinardo 19.07.2015, aktualisiert am 20.07.2015 um 01:33:47 Uhr
Goto Top
Hallo Marco,
womit arbeitest du denn überhaupt, mit Visual Studio (.Net) und VSTO ?
Der nötige Callback für Visual Basic .Net sieht folgendermaßen aus:
Function checkboxGetPressed(control As Office.IRibbonControl) As Boolean
    'Return True to get the Checkbox to be in pressed state, and false for unchecked   
End Function
Die Funktions-Signaturen für die Callbacks aller verfügbaren Steuerelemente findest du alle hier: https://msdn.microsoft.com/en-us/library/ee691833.aspx#odc_Office2010Int ...

Den Namen der Funktion kannst du selbst wählen, er muss aber exakt mit dem Namen im Ribbon XML übereinstimmen.
Beispiel für ein solches Ribbon mit einer Checkbox:
<?xml version="1.0" encoding="UTF-8"?> 
<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui"> 
    <ribbon>
        <tabs>
            <tab id="myTab" label="MyTab"> 
                <group id="myGroup" label="Meine Gruppe"> 
                    <checkBox id="CheckBox1" label="CheckBox1" getPressed="checkboxGetPressed" /> 
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
Du setzt dir dann am einfachsten eine global erreichbare Bool-Variable die du auf True setzt wenn du die Checkbox setzen willst. Diese Variable fragst du in dem Callback dann ab und gibst entweder True oder False zurück, je nachdem ob du die Checkbox aktivieren oder deaktivieren willst.

Wichtig: Um eine Aktualisierung des Checkbox Status zu erreichen muss du dann in deiner Funktion noch die Funktion InvalidateControl("CheckBox1") des IRibbonUI Objekts des Ribbons mit dem exakten Namen der Checkbox aufrufen. Erst dann wird der Status der Checkbox aktualisiert bzw. die Callback-Funktion getriggert.
https://msdn.microsoft.com/en-us/library/aa433553%28v=office.12%29.aspx

Wenn du willst kann ich dir gerne das VSTO Projekt (Visual Studio 2010 Format) mit einem Beispiel zukommen lassen.

Wenn du das ganze mal ausprobieren willst hier ein angepasstes *.xlsm Dokument mit einem implantierten CustomXML
Trigger_Checkbox_277556.xlsm (In diesem Fall sind die Callbacks im Dokument als VBA enthalten)
Ein Click auf den Button triggert die Checkbox auf dem Tab MyTab

Grüße Uwe


-edit- Als VSTO VB.Net Dokument sieht das dann so aus:
back-to-topRibbon.xml
<?xml version="1.0" encoding="UTF-8"?> 
<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui"> 
    <ribbon>
        <tabs>
            <tab id="myTab" label="MyTab" > 
                <group id="myGroup" label="Meine Gruppe"> 
                    <checkBox id="CheckBox1" label="CheckBox1" getPressed="checkboxGetPressed" /> 
                </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>
back-to-topRibbon.vb
<Runtime.InteropServices.ComVisible(True)> _
    Public Class Ribbon
    Implements Office.IRibbonExtensibility

    Public ribbon As Office.IRibbonUI

    Public Sub New()
    End Sub

    Public Function GetCustomUI(ByVal ribbonID As String) As String Implements Office.IRibbonExtensibility.GetCustomUI
        Return GetResourceText("WorkbookTriggerCheckbox.Ribbon.xml")  
    End Function

#Region "Ribbon Callbacks" 
    'Create callback methods here. For more information about adding callback methods, select the Ribbon XML item in Solution Explorer and then press F1.  
    Public Sub Ribbon_Load(ByVal ribbonUI As Office.IRibbonUI)
        Me.ribbon = ribbonUI
        Globals.ThisWorkbook.rib = ribbonUI
    End Sub

    Function checkboxGetPressed(control As Office.IRibbonControl) As Boolean
        If Globals.ThisWorkbook.enableCheckbox Then
            Return True
        Else
            Return False
        End If
    End Function
#End Region

#Region "Helpers" 

    Private Shared Function GetResourceText(ByVal resourceName As String) As String
        Dim asm As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly()
        Dim resourceNames() As String = asm.GetManifestResourceNames()
        For i As Integer = 0 To resourceNames.Length - 1
            If String.Compare(resourceName, resourceNames(i), StringComparison.OrdinalIgnoreCase) = 0 Then
                Using resourceReader As IO.StreamReader = New IO.StreamReader(asm.GetManifestResourceStream(resourceNames(i)))
                    If resourceReader IsNot Nothing Then
                        Return resourceReader.ReadToEnd()
                    End If
                End Using
            End If
        Next
        Return Nothing
    End Function

#End Region

End Class
back-to-topThisWorkbook.vb
Im Beispiel wird die Checkbox getriggert wenn sich der Wert in Zelle A1 ändert (bei 1 = an bei 0 = aus
Public Class ThisWorkbook
    Public enableCheckbox As Boolean = False
    Public rib As Office.IRibbonUI

    Private Sub ThisWorkbook_SheetChange(Sh As Object, Target As Microsoft.Office.Interop.Excel.Range) Handles Me.SheetChange
        If Sh.Name = "Tabelle1" And Not ThisApplication.Intersect(Sh.Range("A1"), Target) Is Nothing Then  
            If Target.Value = 1 Then
                enableCheckbox = True
            Else
                enableCheckbox = False
            End If
            rib.InvalidateControl("CheckBox1")  
        End If
    End Sub

    Private Sub ThisWorkbook_Shutdown() Handles Me.Shutdown
    End Sub

    Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
        Return New Ribbon()
    End Function
End Class
MarcoBorn
MarcoBorn 20.07.2015 um 08:36:08 Uhr
Goto Top
Hallo Uwe,
vielen Dank für den ausführlichen Code. Ich arbeite mit SharpDevelop und setze statt VSTO NetOffice ein. Das hat den Vorteil, dass es Versions-unabhängig arbeiten kann und mit beliebigen Excel-Versionen klarkommt, ohne dass ich die PIAs anpassen muss. Ich werde Deinen Code im Laufe des Tages mal testen.

Vielen Dank,
Marco