Plan du site  · Français  · English  · Deutsch
Home » Blog » Article
Article

Afficher et masquer des objets en Excel

03.09.2009
Ayant un regard dans le Blog sur Excel de Microsoft, j'avais trouvé un interessant article de Ben Rampson (Program Manager dans l'équipe Excel) montrant comment afficher et masquer des objets en Excel 2007. C'est très simple, il suffit juste de selectionner le point "Volet Sélection" à partir du ruban d'accueil et le bouton "Rechercher et sélectionner".

Objets en Excel

Ensuite s'ouvre un fenêtre listant tous les objets contenu dans la feuille active de votre fichier et vous permettant d'afficher ou bien de masquer les objets en cliquant sur l'oeil à droite du volet.

Objets en Excel

Malheureusement, un volet semblable n'est pas disponible en Excel 2003. Ce n'est cependant pas grave, vu que nous pouvons implémenter notre propre volet en VBA. Nous vous présentons ci-dessous notre Add-In pour Excel qui liste tous les objets d'une feuille en Excel 2003.

Objets en Excel

Afin d'afficher ou bien masquer tous les objets dans une feuille veuillez utliser les bouts avec les "yeux". Au cas où il faudras mettre à jour la liste, appuyez sur le bouton avec les flèches en form de cercle. Un double click sur un élément dans la liste sélectionne l'objet et, au cas où l'object était invisible, l'affiche. Dans le bas de la fenêtre, vous trouverez quelques infos sur l'object sélectionné dans la liste.

Vous pouvez télécharger notre Add-In à la fin de cet article ou bien dans notre section de téléchargement. Au cas où vous voudriez avoir accès au code, le mot de passe du project VBA est "maninweb", sans les ".

Le noyau de l'application est une Listview dans une Userfrom. Celles ci est remplie par la fonction mlfpMainShapes().

  Public Function mlfpMainShapes(Book As String, _
                                 Sheet As String)
    
    Dim c As Long
    Dim n As Long
    
'   Bypass...
    
    On Error Resume Next
    
'   Check...
    
    If Not mlvpHandle Is Nothing Then
      
'     With...
      
      With Application.Workbooks(Book).Worksheets(Sheet)
        
'       Bypass...
        
        mlvpBypass = True
        
'       Clear...
        
        mlvpHandle.Controls("LSV_0001").ListItems.Clear
        
'       Reset...
        
        mlvpHandle.Controls("CHK_0001").Value = False
        mlvpHandle.Controls("CHK_0002").Value = False
        
        mlvpHandle.Controls("EDT_0001").Text = ""
        mlvpHandle.Controls("EDT_0002").Text = ""
        
'       States...
        
        mlvpHandle.Controls("CHK_0001").Enabled = False
        mlvpHandle.Controls("CHK_0002").Enabled = False
        
'       Settings...
        
        mlvpHandle.Controls("LSV_0001").Gridlines = False
        mlvpHandle.Controls("LSV_0001").HideSelection = True
        mlvpHandle.Controls("LSV_0001").View = lvwList
        
'       Events...
        
        DoEvents
        
'       Bypass...
        
        mlvpBypass = False
        
'       Check...
        
        If .Shapes.Count > 0 Then
        
'         Bypass...
          
          mlvpBypass = True
          
'         Settings...
          
          mlvpHandle.Controls("LSV_0001").Gridlines = True
          mlvpHandle.Controls("LSV_0001").HideSelection = False
          mlvpHandle.Controls("LSV_0001").View = lvwReport
          
'         Add...
          
          For n = 1 To .Shapes.Count
            
'           Current...
            
            c = mlvpHandle.Controls("LSV_0001"). _
                  ListItems.Count + 1
            
'           Add...
            
            mlvpHandle.Controls("LSV_0001"). _
            ListItems.Add , , CStr(c)
            
'           Events...
            
            DoEvents
            
'           Data...
            
            mlvpHandle.Controls("LSV_0001").ListItems(c). _
            SubItems(1) = .Shapes(n).Name
            
'           Check...
            
            If .Shapes(n).Visible Then
              
              mlvpHandle.Controls("LSV_0001"). _
              ListItems(c).SubItems(2) = "•"
              
            End If
            
          Next n
          
'         Selection...
          
          mlvpHandle.Controls("LSV_0001"). _
          ListItems(1).SelectedItem = True
          mlvpHandle.Controls("LSV_0001"). _
          ListItems(c).EnsureVisible
          
'         States...
          
          mlvpHandle.Controls("CHK_0001").Enabled = _
          Not .ProtectDrawingObjects
          
          mlvpHandle.Controls("CHK_0002").Enabled = _
          Not .ProtectDrawingObjects
          
'         Events...
          
          DoEvents
          
'         Bypass...
          
          mlvpBypass = False
          
'         Update...
          
          mlfpMainShapesItem
          
        End If
        
'       Visibility...
        
        mlvpHandle.Controls("BTN_0007").Visible = True
        mlvpHandle.Controls("BTN_0008").Visible = _
        CBool(.Shapes.Count > 0)
        mlvpHandle.Controls("BTN_0009").Visible = _
        CBool(.Shapes.Count > 0)
        
      End With
      
    End If
    
  End Function
Cette fonction attend deux paramètres, le premier étant le nom du fichier et le deuxième étant le nom de la feuille. En plus, la fonction utilise la variable globale mlvpHandle pour accèder à la Userfom pendant que cell-ci est chargée. La boucle remplit la Listview avec les nom d'objecs contenus dans la feuille. Finalement, la fonction mlfpMainShapesItem() est appelée pour initialiser les contrôles.

Que faisons nous maintenant pour nous appercevoir que l'utilisateur a sélectionné und autre feuille du fichier? Pour cela, il suffit d'implémenter une petite classe qui intercepte les événements correspondant dans Excel.

' Application...
  
  Public WithEvents App                       As Application
  
'
' Events
'
' ..............................................................
  
  Private Sub App_SheetActivate(ByVal Sh As Object)
    
    mlfpMainShapes Sh.Parent.Name, Sh.Name
    
  End Sub
  
  Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
    
    mlfpMainShapes Wb.Name, Wb.ActiveSheet.Name
    
  End Sub
Vous voyez, il suffit de juste définir deux fonctions ci-dessus. Nous créons une instance de la classe dans le code de notre Userfom.

' Userform...
  
  Private Sub UserForm_Initialize()
    
'   Bypass...
    
    On Error Resume Next
    
'   Api...
    
    mlfpApiMenueRemove Me.Caption, True, True
    
'   Create...
    
    Set mlvhInstance = New MLC_Application
    
'   Handles...
    
    Set mlvpHandle = Me
    Set mlvhInstance.App = Application
    
'   Fill...
    
    LSV_0001.ListItems.Clear
    
'   Columns...
    
    LSV_0001.ColumnHeaders.Add , "Number", "Number", 0
    LSV_0001.ColumnHeaders.Add , "Name", "Name"
    LSV_0001.ColumnHeaders.Add , "State", "State", 16
    
'   Widths...
    
    LSV_0001.ColumnHeaders(2).Width = _
    LSV_0001.Width - 16 - _
    LSV_0001.ColumnHeaders(3).Width - _
    LSV_0001.ColumnHeaders(1).Width
    
'   Settings...
    
    LSV_0001.AllowColumnReorder = False
    LSV_0001.FullRowSelect = True
    LSV_0001.Gridlines = False
    LSV_0001.HideColumnHeaders = True
    LSV_0001.HideSelection = True
    LSV_0001.LabelEdit = lvwManual
    LSV_0001.View = lvwList
    
'   States...
    
    CHK_0001.Enabled = False
    CHK_0002.Enabled = False
    
    EDT_0001.Enabled = False
    EDT_0002.Enabled = False
    
'   Visibility...
    
    BTN_0007.Visible = False
    BTN_0008.Visible = False
    BTN_0009.Visible = False
    
  End Sub
Comme déjà mentionné plus haut, un bouton permet d'actualisier la liste d'objets. En effet, Excel VBA nous permet pas de détecter la suppression ou l'insertion d'objets.

Vous pouvez télécharger l'Add-In ici Afficher et masquer des objets en Excel et personaliser le code comme vous désirez. Nous apprécierions un message au cas où vous améliorez notre code. Veuiller prendre note, que les grafiques inclues dans le projet ne sont pas prévu pour être utilisés dans d'autres projects. En aucun cas, nous saurons être tenu responsable pour une utilisation incorrecte du logiciel ou des erreurs dans le code. Nous avons testé le logiciel en Excel 2003 sur Windows XP Allemand et Windows Serveur 2008 Allemand.