mercredi 30 mai 2012

Customisez vos boutons

N'est-il pas désolant de voir MS Office évoluer esthétiquement tandis que les contrôles ActiveX restent fidèles à leur look rétro ? Prenez les boutons de formulaire par exemple : uniformément gris et stricts.

Contrôle ActiveX "CommandButton" basique

Mettez un peu d'originalité dans vos formulaires en personnalisant les boutons ... sans utiliser de contrôle CommandButton !

Sachant que pour le même volume en KiloOctets, vous pouvez indifféremment utiliser un contrôle CommandButton, Label ou Image, profitons-en pour étudier les possibilités de personnalisation.

Pour cela, créez sous MS Powerpoint un rectangle sans contour, rempli avec un dégradé de couleur comme dans les exemples ci-dessous. Avec MS Powerpoint 2007 ou 2010, vous pouvez régler précisément la position de chaque couleur du dégradé pour un meilleur rendu de reflet lumineux. Sauvegardez ce rectangle comme une image au format BMP.


Rendez-vous sur Excel et créez trois controles ActiveX de mêmes dimensions : un CommandButton, un Label et une Image. Les dimensions sont réglables dans les champs Height et Width de la fenêtre de Propriétés des contrôles.
Configurez le paramètre Picture de chacun des contrôles en sélectionnant l'image BMP que vous venez de sauvegarder. Précisez dans le paramètre PicturePosition que l'image doit être centrée dans le contrôle : saisissez la valeur 12 - fmPicturePositionCenter. Cette valeur de paramètre signifie que que si vous ajoutez du texte à votre contrôles, celui-ci apparaîtra centré devant l'image.


Pour les contrôles Label et Image, précisez la valeur du paramètre SpecialEffect permettant d'obtenir un effet bouton : saisissez la valeur 1 - fmSpecialEffectRaised.

Pour les contrôles Label et CommandButton, renseignez le paramètre Caption en saisissant le texte que vous souhaitez faire apparaître sur le bouton. Vous constaterez que le contrôle Image ne permet pas de saisir de texte. Pour l'utiliser comme bouton, il vous faudra donc penser à intégrer le texte dans l'image de fond et à régler le paramètre PictureSizeMode à la valeur 1 - fmPictureSizeModeStretch afin d'étirer l'image aux dimensions du contrôle, comme dans l'exemple ci-dessous.


D'expérience, j'ai une préférence pour le contrôle Label car il permet d'avoir un meilleur rendu.
Pour utiliser un Label comme bouton, il faut le rendre cliquable. Pour cela, vous devrez définir son apparence lorsque le bouton de souris est en appui dessus, et lorsque le bouton de souris est relevé. Nous allons donc devoir rédiger quelques lignes de code VBA pour les évènements MouseDown() et MouseUp() du Label. Ces lignes de code ne sont absolument pas volumineuses en termes d'espace disque, ce qui rend l'usage du Label d'autant plus intéressant. Rendez-vous dans l'éditeur de code, à la feuille correspondant à l'onglet actuel et saisissez le code suivant (le Label s'appelle Label1) :

Private Sub Label1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label1.SpecialEffect = fmSpecialEffectSunken
End Sub

Private Sub Label1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Label1.SpecialEffect = fmSpecialEffectEtched
End Sub

Voici l'effet obtenu : un bouton moderne, plat, à reflets, qui s'enfonce et se relève lorsque l'on clique dessus !


Il ne reste alors plus qu'à coder l'action à réaliser lorsque le bouton est cliqué dans la procédure Label1_Click().

Private Sub Label1_Click()
    MsgBox "Smart XL !"
End Sub

N'hésitez pas à abuser de cette méthode qui rendra vos interfaces graphiques beaucoup plus attractives !

mardi 29 mai 2012

Oubliez les remplissages en aplats : privilégiez les dégradés !

Afin d'éviter la morosité et la platitude des cellules remplies en aplats de couleurs, privilégiez des remplissages en dégradés linéraires. Effet garanti !
Tableau avec cellules de titre en aplat (cliquez pour agrandir)

Tableau avec cellules de titre en dégradé linéaire (cliquez pour agrandir)
Pour cela, ne chercher pas dans l'onglet Accueil du ruban. Même en allant dans le sous-menu "Autres couleurs", Excel ne vous proposera que des aplats de couleurs.
 (cliquez pour agrandir)
Pour obtenir l'effet dégradé, sélectionnez vos cellules, puis faites un clic droit. Aller dans le sous-menu "Format de Cellule".

 (cliquez pour agrandir)
Rendez-vous à l'onglet "Remplissage" : vous pourrez alors définir des "Motifs et Textures" ce qui vous amène inexorablement à la fenêtre de définition des dégradés de couleurs.

 (cliquez pour agrandir)
Il ne vous reste plus qu'à trouver la couleur de texte la plus lisible sur votre fond dégradé, et régler la hauteur des lignes à votre convenance selon l'effet souhaité.

Prenez le contrôle de la zone d'affichage

Contrôlez l'apparence d'une feuille par le biais d'un code VBA s'exécutant dès l'activation de la feuille ou dès l'ouverture du classeur :
  • Cacher les barres d'outils (propriétés de l'objet Application)
  • Cacher la grille (propriété de l'objet ActiveWindow)
  • Supprimez l'affichage des en-têtes de lignes et de colonnes (propriété de l'objet ActiveWindow)
  • Lancez l'affichage en plein écran

Apparence initiale du classeur Excel (cliquez pour agrandir)
Apparence neutre du classeur Excel après application de la procédure Workbook_Open()  (cliquez pour agrandir)

Et surtout, empêchez l'utilisateur d'aller dans le menu d'options d'affichage pour réactiver ces éléments :  
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    ' Empêcher l'affichage des en-têtes de lignes / colonnes
   If ActiveWindow.DisplayHeadings = True Then
        ActiveWindow.DisplayHeadings = False
        Dim Reponse As Integer
        Reponse = MsgBox("Veuillez ne pas modifier l'apparence de cette page", vbCritical, "Attention")
    End If
   
    'Empêcher la sélection d'une cellule pour la modifier
    ActiveSheet.Range("A65535").Select
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
End Sub

Empêchez également l'utilisateur d'effectuer des actions de mise en forme en désactivant le clic droit sur la feuille :
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
End Sub
Bien entendu, tout cela peut être appliqué à l'ensemble des feuilles du classeur en appliquant la procédure suivante à l'évènement Open du Workbook :
Private Sub Workbook_Open()

    With ActiveWindow
        .DisplayGridlines = False
        .DisplayHeadings = False
        .DisplayWorkbookTabs = False
    End With
       
    With Application
        .ShowStartupDialog = False
        .DisplayFormulaBar = False
    End With
   
    Application.CommandBars("worksheet menu bar").Enabled = False
   
    If Application.CommandBars("Standard").Visible = True Then
    Application.CommandBars("Standard").Visible = False
    End If
   
    If Application.CommandBars("Formatting").Visible = True Then
    Application.CommandBars("Formatting").Visible = False
    End If
   
    If Application.CommandBars("Borders").Visible = True Then
    Application.CommandBars("Borders").Visible = False
    End If
   
    If Application.CommandBars("Chart").Visible = True Then
    Application.CommandBars("Chart").Visible = False
    End If
   
    If Application.CommandBars("Control Toolbox").Visible = True Then
    Application.CommandBars("Control Toolbox").Visible = False
    End If
   
    If Application.CommandBars("Drawing").Visible = True Then
    Application.CommandBars("Drawing").Visible = False
    End If
   
    If Application.CommandBars("External Data").Visible = True Then
    Application.CommandBars("External Data").Visible = False
    End If
   
    If Application.CommandBars("Forms").Visible = True Then
    Application.CommandBars("Forms").Visible = False
    End If
   
    If Application.CommandBars("Formula Auditing").Visible = True Then
    Application.CommandBars("Formula Auditing").Visible = False
    End If
   
    If Application.CommandBars("List").Visible = True Then
    Application.CommandBars("List").Visible = False
    End If
   
    If Application.CommandBars("Picture").Visible = True Then
    Application.CommandBars("Picture").Visible = False
    End If
   
    If Application.CommandBars("PivotTable").Visible = True Then
    Application.CommandBars("PivotTable").Visible = False
    End If
   
    If Application.CommandBars("Protection").Visible = True Then
    Application.CommandBars("Protection").Visible = False
    End If
   
    If Application.CommandBars("Reviewing").Visible = True Then
    Application.CommandBars("Reviewing").Visible = False
    End If
   
    If Application.CommandBars("Task Pane").Visible = True Then
    Application.CommandBars("Task Pane").Visible = False
    End If
   
    If Application.CommandBars("Text To Speech").Visible = True Then
    Application.CommandBars("Text To Speech").Visible = False
    End If
   
    If Application.CommandBars("Visual Basic").Visible = True Then
    Application.CommandBars("Visual Basic").Visible = False
    End If
   
    If Application.CommandBars("Watch Window").Visible = True Then
    Application.CommandBars("Watch Window").Visible = False
    End If
   
    If Application.CommandBars("Web").Visible = True Then
    Application.CommandBars("Web").Visible = False
    End If
   
    If Application.CommandBars("WordArt").Visible = True Then
    Application.CommandBars("WordArt").Visible = False
    End If
   
    If Application.CommandBars("Exit Design Mode").Visible = True Then
    Application.CommandBars("Exit Design Mode").Visible = False
    End If
   
    If Application.CommandBars("Full Screen").Visible = True Then
    Application.CommandBars("Full Screen").Visible = False
    End If
   
    If Application.CommandBars("Organization Chart").Visible = True Then
    Application.CommandBars("Organization Chart").Visible = False
    End If
   
    If Application.CommandBars("Shadow Settings").Visible = True Then
    Application.CommandBars("Shadow Settings").Visible = False
    End If
   
    If Application.CommandBars("Drawing Canvas").Visible = True Then
    Application.CommandBars("Drawing Canvas").Visible = False
    End If
   
    If Application.CommandBars("Diagram").Visible = True Then
    Application.CommandBars("Diagram").Visible = False
    End If
   
    If Application.CommandBars("Compare Side by Side").Visible = True Then
    Application.CommandBars("Compare Side by Side").Visible = False
    End If
   
    If Application.CommandBars("Circular Reference").Visible = True Then
    Application.CommandBars("Circular Reference").Visible = False
    End If
   
    If Application.CommandBars("Chart Menu Bar").Visible = True Then
    Application.CommandBars("Chart Menu Bar").Visible = False
    End If
   
    If Application.CommandBars("3-D Settings").Visible = True Then
    Application.CommandBars("3-D Settings").Visible = False
    End If
   
End Sub

Seul petit bémol : un développeur aguerri saura activer le mode "Création" dans l'onglet "Visual Basic" (MS 2003) / "Développeur" (MS 2007/2010) pour accéder au contenu des cellules. Il ne pourra cependant pas modifier durablement l'apparence de la feuille car celle-ci reviendra automatiquement à l'apparence que vous lui avez fixée dès qu'elle sera ré-activée.