Excel - Toolbars und deren Controls, + eigene Ctrl hinzufügen

    • Offizieller Beitrag

    Hi,
    angeregt durch eine Fragestellung gestern Nacht habe ich mich mal mit den Toolbars und deren Controls etwas näher befaßt.
    Im Allgemeinen können uns die Control fast egal sein, aber wenn man z.B. eine personifizierte Oberfläche auf mehreren PC einrichten möchte/muss :D kommt die Stärke von AutoIt zur Automatisierung zum Tragen. Und dann müssen wir natürlich Zugriff auf diese Objekte erlangen um ihre Eigenschaften nach unserem Bedarf anzupassen.

    Hier die beiden Funktionen, mit denen das sehr praktikabel geht. Voraussetzung ist natürlich ein geöffnetes Excel (Referenz kann, muß aber nicht übergeben werden).

    Und hier die Funktionen
    • _Excel_GetToolBars
    • _Excel_GetCtrlsFromToolBar
    mit einem Mini-Bsp.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; == Bei geöfnetem Excel ausführen

    [/autoit] [autoit][/autoit] [autoit]

    $aToolBars = _Excel_GetToolBars()
    _ArrayDisplay($aToolBars, 'Sichtbare ToolBars')

    [/autoit] [autoit][/autoit] [autoit]

    $aCtrls = _Excel_GetCtrlsFromToolBar('Standard')
    _ArrayDisplay($aCtrls, 'Alle Controls der Toolbar')

    [/autoit] [autoit][/autoit] [autoit]

    $oCtrl = _Excel_GetCtrlsFromToolBar('Standard','Funktions-Assistent')
    ConsoleWrite('L, T, W, H: ' & $oCtrl.Left & ', ' & $oCtrl.Top & ', ' & $oCtrl.Width & ', ' & $oCtrl.Height & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _Excel_GetToolBars
    ; Description......: Ermittelt alle (od. nur sichtbare) Toolbars der Excelanwendung
    ; Parameter(s).....: $_iVisible 1 (Standard) nur sichtbare/ 0 alle Toolbars
    ; .................: $_oExcel Excel-Referenz, -1 (Standard) greift auf offenes Excel zu
    ; Requirement(s)...: MS Excel
    ; Return Value(s)..: Erfolg: 2D-Array, an [0][0] die Anzahl der Toolbars, [[Name,Obj-Referenz,Visible]]
    ; .................: Fehler: -1 set @error = 1 keine Referenz übergeben u. kein Excel offen
    ; .................: = 2 keine Toolbar sichtbar
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _Excel_GetToolBars($_iVisible=1, $_oExcel=-1)
    If $_oExcel = -1 Then
    $_oExcel = ObjGet('', 'Excel.Application')
    If Not IsObj($_oExcel) Then Return SetError(1,0,-1)
    EndIf
    Local $oToolBars = $_oExcel.Application.CommandBars
    Local $aTB[1][3] = [[0]] ; [[Name,Obj-Referenz,Visible]]
    Local $i = 0
    If Not $_iVisible Then
    $aTB[0][0] = $oToolBars.Count
    ReDim $aTB[$aTB[0][0] +1][3]
    EndIf
    With $oToolBars
    For $oTB In $oToolBars
    If $_iVisible Then
    If Not $oTB.Visible Then ContinueLoop
    $i += 1
    $aTB[0][0] = $i
    ReDim $aTB[$i +1][3]
    Else
    $i += 1
    EndIf
    $aTB[$i][0] = $oTB.NameLocal
    $aTB[$i][1] = $oTB
    $aTB[$i][2] = $oTB.Visible
    Next
    EndWith
    If $i > 0 Then Return $aTB
    Return SetError(2,0,-1)
    EndFunc ;==>_Excel_GetToolBars

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _Excel_GetCtrlsFromToolBar
    ; Description......: Ermittelt alle/ein bestimmtes Control(s) einer Toolbar
    ; Parameter(s).....: $_sTB lokaler Name der Toolbar
    ; .................: $_sCtrl Name eines Controls, Leerstring (Standard) gibt alle zurück
    ; .................: $_oExcel Excel-Referenz, -1 (Standard) greift auf offenes Excel zu
    ; Requirement(s)...: MS Excel, _Excel_GetToolBars()
    ; Return Value(s)..: Erfolg: Aufruf mit Controlname - Objektreferenz für dieses Control
    ; .................: Aufruf ohne Controlname - 2D-Array an [0][0] die Anzahl der Controls, [[Name,Obj-Referenz]]
    ; .................: Fehler: -1 set @error = 1 keine Referenz übergeben u. kein Excel offen od. Toolbar nicht sichtbar
    ; .................: = 2 angegebene Toolbar ist nicht vorhanden
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _Excel_GetCtrlsFromToolBar($_sTB, $_sCtrl='', $_oExcel=-1)
    Local $oTB, $n = 0, $aCtrl[1][2] = [[0]] ; [[Name,Obj-Referenz]]
    Local $aTB = _Excel_GetToolBars(1, $_oExcel)
    If @error Then Return SetError(1,0,-1)
    For $i = 1 To $aTB[0][0]
    If $aTB[$i][0] = $_sTB Then
    $oTB = $aTB[$i][1]
    ExitLoop
    EndIf
    Next
    If Not IsObj($oTB) Then Return SetError(2,0,-1)
    If $_sCtrl = '' Then
    $aCtrl[0][0] = $oTB.Controls.Count
    ReDim $aCtrl[$aCtrl[0][0] +1][2]
    EndIf
    For $oControl In $oTB.Controls
    With $oControl
    If $_sCtrl <> '' Then
    If .Caption = $_sCtrl Then Return $oControl
    Else
    $n += 1
    $aCtrl[$n][0] = $oControl.Caption
    $aCtrl[$n][1] = $oControl
    EndIf
    EndWith
    Next
    Return $aCtrl
    EndFunc ;==>_Excel_GetCtrlsFromToolBar

    [/autoit]

    Edit:
    Da kam mir der Gedanke doch auch eigene Controls hinzuzufügen. Das geht mit 5 Controltypen: Button, Edit, DropDown, ComboBox, PopUp.
    Den Button kann man diverse Images(FaceId) zuordnen. Eine Übersicht findet ihr hier.
    Eigene Images lassen sich auch verwenden, ist aber etwas mehr Aufwand. Hatte ich mir noch nicht vorgenommen, zumal die vorhandene Auswahl riesig ist.
    Die Controls lassen sich temporär oder dauerhaft zuordnen. Das ist praktisch, wenn man an einem Fremd-PC sein gewohntes Umfeld herstellen möchte. Beim nächsten Aufruf ist alles wie vorher.

    _Excel_ToolBarCtrlAdd
    [autoit]

    ; == Control-Types
    Const $msoControlButton = 1
    Const $msoControlEdit = 2
    Const $msoControlDropdown = 3
    Const $msoControlComboBox = 4
    Const $msoControlPopup = 10

    [/autoit] [autoit][/autoit] [autoit]

    ; == Button am Ende erstellen (temporär) mit Smiley-Image
    $oCtrl = _Excel_ToolBarCtrlAdd('Standard', 'MeinTestButton', 'Test Button', $msoControlButton, 1, '', '', 59, -1, True)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _Excel_ToolBarCtrlAdd
    ; Description......: Fügt einer Toolbar ein benutzerdefiniertes od. Systeminternes Control hinzu
    ; Parameter(s).....: $_sTB Lokaler Name der Toolbar
    ; .................: $_sTag Tag des neuen Controls
    ; .................: $_sCaption Bezeichnung des neuen Controls, gleichzeitig ControlTip bei Hover
    ; .................: $_iType MsoControlType, möglich sind:
    ; .................: • $msoControlButton
    ; .................: • $msoControlEdit
    ; .................: • $msoControlDropdown
    ; .................: • $msoControlComboBox
    ; .................: • $msoControlPopup
    ; ....optional.....: $_iId ID eines internen Ctrl oder "1" (Standard) für benutzerdefiniertes Ctrl
    ; ....optional.....: $_sParameter Für integrierte Steuerelemente, wird dieses Argument durch die
    ; .................: Container-Anwendung verwendet werden, um den Befehl auszuführen.
    ; .................: Bei benutzerdefinierten Ctrl können hier zusätzliche Werte zur
    ; .................: Interaktion mit VBA oder Eigenschaftswerte gespeichert werden
    ; ....optional.....: $_iBefore Zahlenwert (Index) eines Ctrl vor dem das neue Ctrl eingefügt werden soll.
    ; .................: Ohne Angabe (Leerstring, Standard) wird am Ende angefügt.
    ; ....optional.....: $_iFaceID Image-ID für Button, -1=kein Image (Standard), Übersicht: http://fring.developpez.com/vba/excel/faceid/
    ; ....optional.....: $_oExcel Excel-Referenz, -1 (Standard) greift auf offenes Excel zu
    ; ....optional.....: $_fTemporary Mit "True" existiert das Control nur bis die Anwendung geschlossen wird.
    ; .................: "False" (Standard) integriert das Control dauerhaft.
    ; Requirement(s)...: MS Excel, _Excel_GetToolBars()
    ; Return Value(s)..: Erfolg: Objektreferenz des neuen Controls
    ; .................: Fehler: -1 set @error 1 - keine Referenz übergeben u. kein Excel offen
    ; .................: 2 - keine Toolbar vorhanden
    ; .................: 3 - angegebene Toolbar ist nicht vorhanden od. nicht sichtbar
    ; .................: 4 - $_iBefore-Param <1 oder größer als Anzahl Controls
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _Excel_ToolBarCtrlAdd($_sTB, $_sTag, $_sCaption, $_iType, $_iId=1, $_sParameter='', $_iBefore='', $_iFaceID=-1, $_oExcel=-1, $_fTemporary=False)
    If $_oExcel = -1 Then
    $_oExcel = ObjGet('', 'Excel.Application')
    If Not IsObj($_oExcel) Then Return SetError(1,0,-1)
    EndIf
    Local $oCtrl, $oTB, $aTB = _Excel_GetToolBars(1, $_oExcel)
    If @error Then Return SetError(2,0,-1)
    For $i = 1 To $aTB[0][0]
    If $aTB[$i][0] = $_sTB Then
    $oTB = $aTB[$i][1]
    ExitLoop
    EndIf
    Next
    If Not IsObj($oTB) Then Return SetError(3,0,-1)
    If $_iBefore <> '' Then
    If $_iBefore < 1 Or $_iBefore > $oTB.Controls.Count Then Return SetError(4,0,-1)
    Else
    $_iBefore = Default
    EndIf
    $oCtrl = $oTB.Controls.Add($_iType, $_iId, $_sParameter, $_iBefore, $_fTemporary)
    With $oCtrl
    .Caption = $_sCaption
    .Tag = $_sTag
    If $_iFaceID <> -1 Then .FaceId = $_iFaceID
    EndWith
    Return $oCtrl
    EndFunc ;==>_Excel_ToolBarCtrlAdd

    [/autoit]