Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1752to1756
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
Ribbon Editbox o. Label per VBA ändern
28.04.2020 21:09:56
MLoew
Hallo zusammmen,
zu meiner Person:
Mein tägliches Haupt"werkzeug" ist Excel rauf und runter, auch im Bereich VBA.
Ich habe, seit es Ribbons gibt, mich auch damit anfänglich beschäftigt. Ich bin dann aber relativ schnell auf den IDBE RibbonCreator gestossen, der mir mein tägliches Arbeiten extrem vereinfacht hat.
Quasi alle meine selbstgeschriebenen Subs/Functions liegen in einem eignen Ribbon.
Der RibbonCreator hat zwar extrem viel Möglichkeiten. Doch nun möchte ich in dem Menü ablegen, ob ich beim Start der Exceldatei Online bin (Abfrage über FSO.folderexists ("x:\....") oder ob meine VPN-Verbindung sich gerade mal wieder aufgehängt hat.
Ich hab jetzt zwar eine EditBox oder auch ein Label, deren Inhalt sicherlich ändern kann.
Aber ich hab keine Idee, wie ich das einen String "ONLINE / OFFLINE" über eine normale Sub in die EditBox oder als Text auf das Label schreiben kann.
Würde mich sehr freuen, wenn mir jemand "einen Tritt in die richtige Richtung" geben könnte.
Anbei der XML Code der Exceldatei und der VBA-Code, der durch den RibbonCreator für die Erzeugung der Menüfunktionen erstellt wurde.
Vielen lieben Dank
Markus
Die RibbonXML Daten sehen so aus:




















'# Created with / Erstellt mit: #
'# IDBE Ribbon Creator 2016 #
'# Version: 1.1003b #
Public gobjRibbon As IRibbonUI
Public bolEnabled As Boolean
' Callbacks
Public Sub OnRibbonLoad(ribbon As IRibbonUI)
'Callbackname in XML File "onLoad"
Set gobjRibbon = ribbon
End Sub

Public Sub OnActionButton(control As IRibbonControl)
'Callback in XML File "onAction"
' Callback for event button click
' Callback für Button Click
Select Case control.id
Case Else
MsgBox "Button """ & control.id & """ clicked" & vbCrLf & _
"Es wurde auf Button """ & control.id & """ in Ribbon geklickt", _
vbInformation
End Select
End Sub

'Command Button
Sub OnActionButtonHelp(control As IRibbonControl, ByRef CancelDefault)
' Callbackname in XML File Command "onAction"
MsgBox "Button ""Help"" clicked" & vbCrLf & _
"Es wurde auf Button ""Hilfe"" geklickt", _
vbInformation
CancelDefault = True
End Sub
Sub OnActionCheckBox(control As IRibbonControl, pressed As Boolean)
' Callbackname in XML File "OnActionCheckBox"
' Callback for event checkbox click
' Callback für Checkbox Click
Select Case control.id
Case Else
MsgBox "The Value of the Checkbox """ & control.id & """ is: " & pressed & vbCrLf & _
"Der Wert der Checkbox """ & control.id & """ ist: " & pressed, _
vbInformation
End Select
End Sub
Public Sub GetEnabled(control As IRibbonControl, ByRef enabled)
' Callbackname in XML File "getEnabled"
Select Case control.id
Case "ebx_110"
Enabled = True
Case "tgb_120"
Enabled = True
Case Else
enabled = True
End Select
End Sub

'EditBox
Sub GetTextEditBox(control As IRibbonControl, _
ByRef strText)
' Callbackname in XML File "GetTextEditBox"
' Callback für EditBox welcher Wert in der
Select Case control.id
Case "ebx_110"
' In Tab: tab_2
' In Group: grp_100
strText = getTheValue(control.Tag,"DefaultValue")
Case Else
strText = getTheValue(control.Tag, "DefaultValue")
End Select
End Sub
Sub OnChangeEditBox(control As IRibbonControl, _
strText As String)
' Callbackname in XML File "OnChangeEditBox"
' Callback Editbox: Rückgabewert der Editbox
' Callback Editbox: Return value of the Editbox
Select Case control.id
Case "ebx_110"
' In Tab: tab_2
' In Group: grp_100
MsgBox "The Value of the EditBox """ & control.ID & """ is: " & strText & vbCrLf & _
"Der Wert der EditBox """ & control.ID & """ ist: " & strText, _
vbInformation
Case Else
MsgBox "The Value of the EditBox """ & control.id & """ is: " & strText & vbCrLf & _
"Der Wert der EditBox """ & control.id & """ ist: " & strText, _
vbInformation
End Select
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ribbon Editbox o. Label per VBA ändern
28.04.2020 23:26:12
volti
Hallo Markus,
leider ist Dein XML-Code hier nicht angekommen und auch der VBA-Code schlecht zu sehen.
Es wäre besser, Du würdest mal Deine Datei hier hochladen....
Aber trotzdem, um einen Text in eine Editbox oder in ein Label zur Laufzeit zu bekommen, bedient sich der Ribbon des Callback-Verfahrens.
Über eine "normale SUb", so wie früher mal, geht das nicht.
Hier ein Beispiel für die Editbox im XML, wobei der getText-Term für die Abfrage des aufzunehmenden Textes zuständig ist:
<editBox id="ebx_110" sizeString="123456789" onChange="OnChangeEditBox" getText="GetTextEditBox" />

Dem getText-Term hast Du ja die entsprechende Sub GetTextEditBox mitgegeben. Diese wird vom Ribbon aufgerufen (Callback) und hier übergibst Du Deinen Text.
Wenn mehrere Editboxen die gleiche Sub ansteuern, fischt Du die gewünschte Editbox über die ID raus.
Ich hoffe, ich habe Dich richtig verstanden, denn da steht ja schon einiges drin in Deinem code.

Sub GetTextEditBox(control As IRibbonControl, ByRef strText)
'Editbox mit Wert füllen
 Select Case control.id
 Case "ebx_110"
  strText = "ONLINE / OFFLINE"
 Case Else
'  strText = getTheValue(control.Tag, "DefaultValue")
 End Select
End Sub
viele Grüße
Karl-Heinz

Anzeige
AW: Ribbon Editbox o. Label per VBA ändern
29.04.2020 08:21:03
volti
Moin Markus,
hier noch ein Nachtrag, hatte ich vergessen, war schon spät gestern.
Wenn Du im Betrieb Controls wie z.B. die Editbox erneut bzw. mehrfach mit neuen Texten bestücken willst, musst Du das Control vorher invalidieren, damit es wieder über den Callback die Texte abfragt.
Du kannst das Control selbst oder gleich den ganzen Ribbon refreshen.
gobjRibbon.Invalidate
Da die globale Variable gobjRibbon nach Fehlern gern mal weg ist und damit bis zum nächsten Neustart der Datei die Callbacks nicht mehr funktionieren habe ich mir entsprechende Routinen dafür geschrieben.
Diese habe ich Dir hier mal angehängt, vielleicht hilft Dir dieses weiter.

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

viele Grüße
Karl-Heinz

Anzeige
AW: Ribbon Editbox o. Label per VBA ändern
29.04.2020 09:41:02
MLoew
Hi Karl-Heinz,
erst mal vielen lieben Dank für deine schnelle Antwort.
Hab jetzt erstmal noch die Daten in einer Datei hochgeladen.
https://www.herber.de/bbs/user/137104.txt
In der Voransicht hat das garnicht so schlimm ausgesehen:)
Deinen Code schaue ich mir gleich mal im Detail an.
Zum Hinweis mit den Callbacks:
Callbacks sind aus meinem Verständnis heraus der Aufruf einer Sub (z.B. GetTextEditBox(...)) durch ein RibbonObjekt. Und je nachdem, was "normalerweise" unter ON_Action steht wird dann das Objekt angesprochen und kann dann eine weitere Prozedur aufrufen.
Aber ich kann eben nicht solch ein Callback wie z.B. Sub GetTextEditBox(control As IRibbonControl, ByRef strText) über einen CALL in einer weiteren Sub aufrufen, um entweder den Wert in einer EditBox / Label zu ändern oder auch nur abzurufen.
Wie du selber sagst, es war schon gestern recht spät.
Und da hab ich leider noch einen Punkt vergessen.
Das primäre Ziel ist eigentlich tatsächlich eine Variable während der gesamten Laufzeit des Exceldatei zu speichern.
Und zwar, ob ich Online/Offline bin.
Wenn ich einmal offline bin, sollen die anderen Prozeduren nicht ständig versuchen, auf im Netz liegende Dateien zuzugreifen.
Dazu muss ich aber auch den Status bei jedem Prozessaufruf prüfen.
Somit muss das Editfeld auch auszulesen sein.
Und wenn eine Prozedure erkannt hat, das ich wieder online bin soll diese das Feld wieder auf ONLINE ändern und die Prozeduren sollen wieder im Netz auf Daten zugreifen dürfen.
Danke dir
LG
Markus
Anzeige
AW: Ribbon Editbox o. Label per VBA ändern
29.04.2020 11:21:48
volti
Hallo Markus,
hier einige Gedanken:
In der Voransicht hat das garnicht so schlimm ausgesehen:)
Die Forumssofware unterstützt die XML nicht, vor allem keine < und &GT;-Zeichen.
Aber ich kann eben nicht solch ein Callback wie z.B. Sub GetTextEditBox(control As IRibbonControl, ByRef strText) über einen CALL in einer weiteren Sub aufrufen, um entweder den Wert in einer EditBox / Label zu ändern oder auch nur abzurufen.
Die Callbacks kannst Du nicht aufrufen, sie benötigen ja auch die Übergabe des Ribbonojektes.
Wie schon beschrieben, musst Du das Control invalidieren, dann ruft Ribbon die Callback von sich aus auf und Du kannst den Inhalt ändern.
Somit muss das Editfeld auch auszulesen sein.
M.W. kannst Du den Inhalt so nicht auslesen.
Über die Callback-Function OnChange kannst Du nach einer Änderung den Inhalt ermitteln, den solltest Du für spätere Zwecke in einer Variablen oder sonst wo speichern.
Die Callback-Funktion wird durch die Änderungen via GetTextEditBox nicht getriggert, sondern nur durch manuelle Eingaben.
Wenn ich einmal offline bin, sollen die anderen Prozeduren nicht ständig versuchen, auf im Netz liegende Dateien zuzugreifen.
Dazu muss ich aber auch den Status bei jedem Prozessaufruf prüfen.

M.E: solltest Du den Zustand in einer globalen Variabel, verstecktem Namen oder in einer Zelle an versteckten Blatt speichern.
PS: Waren deshalb Tab und Editbox deaktiviert oder war das noch unvollständig?
In anliegender Datei habe ich mich mal ein bisschen versucht, falls Du es noch nicht selbst geschafft haben solltest. Habe aber 'ne andere Ribbon-Version..
Ribbontest.xlsb
VG KH
Anzeige
AW: Ribbon Editbox o. Label per VBA ändern
29.04.2020 22:36:34
MLoew
Kurze Zwischenmeldung.
Erst mal DANKE an euch beiden.
Schaff das heute wohl nicht mehr durchzuarbeiten.
Melde mich morgen dazu.
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige