- 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 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
#include <Array.au3>
; == Bei geöfnetem Excel ausführen
[/autoit] [autoit][/autoit] [autoit]$aToolBars = _Excel_GetToolBars()
_ArrayDisplay($aToolBars, 'Sichtbare ToolBars')
$aCtrls = _Excel_GetCtrlsFromToolBar('Standard')
_ArrayDisplay($aCtrls, 'Alle Controls der Toolbar')
$oCtrl = _Excel_GetCtrlsFromToolBar('Standard','Funktions-Assistent')
ConsoleWrite('L, T, W, H: ' & $oCtrl.Left & ', ' & $oCtrl.Top & ', ' & $oCtrl.Width & ', ' & $oCtrl.Height & @LF)
;===============================================================================
; 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
;===============================================================================
; 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
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
; == Control-Types
Const $msoControlButton = 1
Const $msoControlEdit = 2
Const $msoControlDropdown = 3
Const $msoControlComboBox = 4
Const $msoControlPopup = 10
; == Button am Ende erstellen (temporär) mit Smiley-Image
$oCtrl = _Excel_ToolBarCtrlAdd('Standard', 'MeinTestButton', 'Test Button', $msoControlButton, 1, '', '', 59, -1, True)
;===============================================================================
; 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