GRATUIT

Vos offres d'emploi informatique

Développeurs, chefs de projets, ingénieurs, informaticiens
Postez gratuitement vos offres d'emploi ici visibles par 4 000 000 de visiteurs uniques par mois

emploi.developpez.com

FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireLes feuilles de calculLes objets type OleObject

Les contrôles sont disponibles dans la barre d'outils "Boîte à outils contrôles" (ou onglet Développeur/groupe "Contrôles"/Insérer/"Contrôles ActiveX", pour Excel2007).
Après avoir ajouté l'objet dans la feuille de calcul, vérifiez que vous êtes bien en mode création.

Image non disponible


Faites un clic droit sur le contrôle que vous venez d'insérer dans la feuille et sélectionnez l'option "Visualiser le code" dans le menu contextuel (ou double cliquez sur le contrôle).
Vous atteignez ainsi le module de la feuille qui contient votre objet.

Image non disponible


Le menu déroulant de droite, en haut de la fenêtre de code, liste les évènements utilisables par cet objet.

Image non disponible


Les contrôles de la feuille de calcul fonctionnent (pratiquement) de la même manière que ceux utilisés dans les UserForm.
Il faut simplement faire précéder l'objet par le nom de la feuille:

Vba
Sélectionnez

Option Explicit
 
'Cet exemple suppose que la feuille nommée "Feuil1" contient:
    'Un CommandButton (CommandButton1)
    'Un TextBox (TextBox1)
 
Private Sub CommandButton1_Click()
    'Insère la valeur 10 dans le TextBox lorsque vous cliquez
    'sur le bouton.
    Worksheets("Feuil1").TextBox1.Value = 10
End Sub
Créé le 2 octobre 2007  par SilkyRoad
Vba
Sélectionnez

Dim Obj As OLEObject
 
Set Obj = Feuil1.OLEObjects.Add("Forms.Label.1")
 
With Obj
    .Top = 140
    .Left = 360
    .Name = "NomLabel"
    .Width = 60
    .Height = 40
    .Object.Caption = "DVP"
    .Object.BackStyle = 0
    .ShapeRange.Fill.Transparency = 1#
End With
Créé le 14 mai 2007  par SilkyRoad

Cette première version boucle sur tous les contrôles de la feuille active et vérifie s'il s'agit d'une case à cocher.

Vba
Sélectionnez

Sub BoucleCheckBox_V01()
    Dim Obj As OLEObject
 
    For Each Obj In ActiveSheet.OLEObjects
        If TypeOf Obj.Object Is MSForms.CheckBox Then _
            MsgBox Obj.Name & ": " & Obj.Object.Value
    Next Obj
End Sub




Vous pouvez aussi utiliser cette deuxième procédure si vous connaissez le nom des CheckBox:
(CheckBox1 à CheckBox3 dans cet exemple)

Vba
Sélectionnez

Sub BoucleCheckBox_V02()
    Dim i As Byte
 
    For i = 1 To 3
        MsgBox ActiveSheet.OLEObjects("CheckBox" & i).Name & ": " & _
            ActiveSheet.OLEObjects("CheckBox" & i).Object.Value
    Next i
End Sub




Vous pouvez bien entendu adapter les procédures pour boucler sur les autres types de contrôles.

Créé le 14 mai 2007  par SilkyRoad

La procédure crée une nouvelle feuille, ajoute une CommandButton et une macro qui permettra de supprimer le contenu des cellules.

Vba
Sélectionnez

Sub AjoutCommandButton_Feuille()
    Dim Ws As Worksheet
    Dim Obj As OLEObject
    Dim laMacro As String
    Dim x As Integer
 
    'Ajout feuille
    Set Ws = Sheets.Add
 
    'Ajout CommandButton dans la feuille
    Set Obj = Ws.OLEObjects.Add("Forms.CommandButton.1")
    With Obj
        .Left = 50 'position horizontale
        .Top = 50 'position verticale
        .Width = 140 'largeur
        .Height = 30 'hauteur
        .Object.BackColor = RGB(235, 235, 200) 'Couleur de fond
        .Object.Caption = "Supprimer données feuille"
    End With
 
    'Paramètres pour la création de la macro:
    '(suppression contenu cellules)
    laMacro = "Sub CommandButton1_Click()" & vbCrLf
    laMacro = laMacro & "Cells.Clear" & vbCrLf
    laMacro = laMacro & "End Sub"
 
    With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
        x = .CountOfLines + 1
        .InsertLines x, laMacro
    End With
End Sub
Créé le 14 mai 2007  par SilkyRoad

La procédure boucle sur les cellules de la plage A1:A20 et alimente la ComboBox de la Feuil1, sans doublon.

Vba
Sélectionnez

Dim Cell As Range
 
'Supprime les données existantes dans le ComboBox
Feuil1.ComboBox1.Clear
 
'Boucle sur les cellules de la plage A1:A20 pour
'alimenter le ComboBox
For Each Cell In Feuil1.Range("A1:A20")
    Feuil1.ComboBox1 = Cell
    'remplissage sans doublon
    If Feuil1.ComboBox1.ListIndex = -1 Then _
        Feuil1.ComboBox1.AddItem Cell
Next Cell
Créé le 10 juin 2007  par SilkyRoad
Vba
Sélectionnez

Sub TriAlpha_ComboBox()
    Dim i As Integer, j As Integer
    Dim strTemp As String
 
    'Supprime le contenu du ComboBox
    Feuil1.ComboBox1.Clear
    'Alimente le ComboBox
    Feuil1.ComboBox1.List() = Array("mimi", "nono", "bibi", "fifi", "lolo")
 
 
    'Tri le contenu du ComboBox par ordre alphabétique
    With Feuil1.ComboBox1
        For i = 0 To .ListCount - 1
            For j = 0 To .ListCount - 1
                If .List(i) < .List(j) Then
                    strTemp = .List(i)
                    .List(i) = .List(j)
                    .List(j) = strTemp
                End If
            Next j
        Next i
    End With
End Sub
Créé le 20 août 2007  par SilkyRoad

La procédure déclenche le code (évènement Click) d'un CommandButton, placé dans la Feuil1.

Vba
Sélectionnez

Application.Run ("Feuil1.CommandButton1_Click")
Créé le 14 mai 2007  par SilkyRoad

La macro cherche un document Word sur le PC, puis l'insère à l'emplacement de la cellule B10 dans la feuille active.

Vba
Sélectionnez

Sub InsertionDocument_Feuille()
    Dim OleObj As OLEObject
    Dim Fichier As Variant
    Dim PosHori As Double, PosVerti As Double, Largeur As Double, Hauteur As Double
 
    Fichier = Application.GetOpenFilename("Documents Word (*.doc), *.doc")
 
    If Fichier <> False Then
        PosHori = Range("B10").Left
        PosVerti = Range("B10").Top
        Largeur = Range("B10").Width
        Hauteur = Range("B10").Height
 
        Set OleObj = ActiveSheet.OLEObjects.Add(Filename:=Fichier, _
            Link:=False, displayAsIcon:=True, iconIndex:=0, iconLabel:=Fichier)
 
        With OleObj
            .Left = PosHori
            .Top = PosVerti
            .Width = Largeur
            .Height = Hauteur
        End With
    End If
End Sub



Indiquez la valeur True pour l'argument Link afin que le document ne soit pas physiquement inséré dans la feuille.
L'icône pointera vers le fichier du disque, sous forme de lien, ce qui limitera la taille de votre classeur.

Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub Verifier_Si_DocumentWord_Vide() 
    Dim WordApp As Object 
    Dim WordObj As Shape 
 
    'Dans cet exemple l'objet Word et le 1er objet dans la Feuille 1 
    Set WordObj = Worksheets(1).Shapes(1) 
    WordObj.OLEFormat.Activate 
    Set WordApp = WordObj.OLEFormat.Object.Object.Application 
    WordApp.Visible = False 
 
    If WordApp.Selection.Document.Words.Count = 1 Then 
        'Renvoie 1 si vide 
        MsgBox "Vide" 
        Else 
        MsgBox "Non vide" & vbCrLf & vbCrLf & _ 
            WordApp.Selection.Document.Content 
    End If 
 
    Range("A1").Select 
End Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub LancePresentation_Feuille() 
    Dim appPPT As Object 
    Dim Obj As Shape 
 
    'Représente le premier objet dans la Feuil11 
    Set Obj = Worksheets("Feuil1").Shapes(1) 
    Obj.OLEFormat.Activate 
 
    Set appPPT = Obj.OLEFormat.Object.Object.Application 
    appPPT.ActivePresentation.SlideShowSettings.Run 
End Sub
Créé le 14 mai 2007  par SilkyRoad

Utilisez le menu Insertion/Objet/Onglet "Nouvel objet".
Sélectionnez "Son wave" dans la liste des types d'objets.
Cliquez sur le bouton OK pour valider.

Effectuez un clic droit sur le nouvel objet inséré.
Sélectionnez l'option "Objet Document Magnétophone".
Puis Ouvrir.
Dans la fenêtre qui s'affiche, utilisez le menu Edition/Insérer un fichier.
Choisissez le fichier wave à insérer dans la feuille.
(Attention à la taille du fichier qui risque d'alourdir votre classeur)
Refermez les boîtes de dialogue.


Un exemple de macro pour déclencher l'objet inséré dans la feuille de calcul.

Vba
Sélectionnez

Sub DeclencheSonWave () 
Worksheets("Feuil1").OLEObjects("objet 1").Verb 
End Sub
Créé le 14 mai 2007  par SilkyRoad

Lorsque vous avez plusieurs contrôles de même type dans une feuille, et qui effectuent la même opération, il est possible d'écrire une seule procédure qui va gérer toutes les actions.
Les modules de classes permettent de gérer les groupes de contrôles et d'identifier les évènements qui sont appliqués sur ces objets.

Cet exemple gère les CheckBox placées dans la feuille de calcul "Feuil1".
Une action est déclenchée dès que l'utilisateur clique sur une des cases à cocher.

Vba
Sélectionnez

'--------------------------------------
'à placer dans le module objet ThisWorbook pour que la classe
'soit initialisée lors de l'ouverture du classeur.
 
Option Explicit
 
Private Sub Workbook_Open()
Dim Obj As OLEObject
Dim Cl As Classe1
 
Set Collect = New Collection
 
'boucle sur les objets de la Feuil1
For Each Obj In Feuil1.OLEObjects
    'verifie s'il s'agit d'un Checkbox
    If TypeOf Obj.Object Is MSForms.CheckBox Then
 
        Set Cl = New Classe1
        Set Cl.CheckBoxGroup = Obj.Object
        Collect.Add Cl
    End If
Next Obj
 
End Sub
'--------------------------------------
Vba
Sélectionnez

'--------------------------------------
'dans un module standard
Option Explicit
 
Public Collect As Collection
'--------------------------------------
Vba
Sélectionnez

'--------------------------------------
'Dans un module de classe nommé "Classe1"
'
Option Explicit
 
Public WithEvents CheckBoxGroup As MSForms.CheckBox
 
 
'Evenement Click sur les CheckBox de la feuille de calcul.
Private Sub CheckBoxGroup_Click()
 
    'Renvoie le nom et la valeur de la CheckBox cliquée
    MsgBox CheckBoxGroup.Name & ": " & CheckBoxGroup.Value
 
    'Exemple qui renvoie dans la colonne A, la valeur de CheckBox
    Cells(CheckBoxGroup.TopLeftCell.Row, 1) = CheckBoxGroup.Value
End Sub
 
'--------------------------------------
Créé le 10 juin 2007  par SilkyRoad

Vous pouvez intégrer un module de classe qui va prendre en charge le transfert du curseur vers la TextBox suivante, lors de l'utilisation des tabulations:

Vba
Sélectionnez

'--------------------------------------
'à placer dans le module objet ThisWorbook pour que la classe
'soit initialisée lors de l'ouverture du classeur.
 
Option Explicit
 
Private Sub Workbook_Open()
Dim Obj As OLEObject
Dim Cl As Classe1
 
Set Collect = New Collection
 
'boucle sur les objets de la Feuil1
For Each Obj In Feuil1.OLEObjects
    'verifie s'il s'agit d'un Textbox
    If TypeOf Obj.Object Is MSForms.TextBox Then
 
        Set Cl = New Classe1
        Set Cl.TexteGroup = Obj.Object
        Collect.Add Cl
    End If
Next Obj
 
End Sub
'--------------------------------------
Vba
Sélectionnez

'--------------------------------------
'dans un module standard
Option Explicit
 
Public Collect As Collection
'--------------------------------------
Vba
Sélectionnez

'dans un module de classe nommé "Classe1"
'
Option Explicit
 
Public WithEvents TexteGroup As MSForms.TextBox
 
 
Private Sub TexteGroup_KeyUp(ByVal KeyCode As _
        MSForms.ReturnInteger, ByVal Shift As Integer)
 
    Dim Valeur As Byte
 
    Valeur = TexteGroup.Index
 
    If KeyCode = 9 Then
        If Valeur <> Collect.Count Then
            With Collect(Valeur + 1).TexteGroup
                .Activate
            End With
 
        Else
            With Collect(1).TexteGroup
                .Activate
            End With
        End If
    End If
End Sub
 
'--------------------------------------
Créé le 5 décembre 2007  par SilkyRoad

Les contrôles Optionbutton (Boutons d'option) permettent de faire un choix parmi plusieurs options. Lorsqu'une des options est sélectionnée, les autres sont toutes désactivées.
Utilisez la propriété GroupName pour gérer un groupe d'OptionButton, en Attribuant la même chaine (par exemple "GR1") à tous les contrôles que vous souhaitez regrouper. Par défaut, la propriété GroupName prend comme valeur le nom de la feuille de calcul.

Cet exemple permet ensuite de retrouver l'OptionButton sélectionné.

Vba
Sélectionnez

Private Sub CommandButton1_Click()
    Dim Ctrl As OLEObject
 
    'Boucle sur tous les contrôles de la feuille active
    For Each Ctrl In ActiveSheet.OLEObjects
        'Vérifie qu'il s'agit d'un OptionButton
        If TypeOf Ctrl.Object Is MSForms.OptionButton Then
            'Véfifie si l'OptionButton fait partie d'un groupe nommé "GR1"
             If Ctrl.Object.GroupName = "GR1" Then
                'Affiche le Caption de l'optionButton qui a la valeur True
                If Ctrl.Object.Value = True Then
                    MsgBox Ctrl.Object.Caption
                    'Sort de la boucle (Il ne peut y a voir qu'une
                    'réponse à True)
                    Exit For
                End If
            End If
        End If
    Next
End Sub
Créé le 20 septembre 2008  par SilkyRoad

Lorsque vous écrivez :

Vba
Sélectionnez
 
'Modifie le texte sur le bouton "Btn1" de la Feuil1
ThisWorkbook.Worksheets("feuil1").Btn1.Caption = "X" 



Vous faites référence au codeName de la feuille de calcul.
c'est l'équivalent de :

Vba
Sélectionnez

Feuil1.Btn1.Caption = "X" 




Lorsque vous écrivez :

Vba
Sélectionnez

Dim wsht As Worksheet 
 
Set wsht = ThisWorkbook.Worksheets("feuil1") 
wsht.Btn1.Caption = "X" 



Votre déclaration de variable fait référence à la feuille de calcul (Dim wsht As Worksheet) et cela provoque une erreur.
Pour faire fonctionner la procédure dans le deuxième exemple, utilisez :

Vba
Sélectionnez
 
Dim wsht As Object 
 
Set wsht = ThisWorkbook.Worksheets("feuil1") 
wsht.Btn1.Caption = "X"
Créé le 20 septembre 2008  par SilkyRoad

Il s'agit d'un problème de paramétrage dans les options du format de contrôle.

Passez en mode création.
Sélectionnez tous les boutons incriminés.
Clic droit sur les contrôles.
Sélectionnez "Format de contrôle" dans le sous menu.
Onglet "Propriétés".
Sélectionnez l'option "Déplacer et dimensionner avec les cellules".
Cliquez sur le bouton OK pour valider.

Créé le 18 novembre 2008  par SilkyRoad

Passez en mode création (onglet Développeur / groupe Contrôles / bouton "Mode création").
Appuyez sur la touche CTRL puis cliquez sur les différents contrôles.
La multi sélection est ainsi appliquée aux objets cliqués.


Pour effectuer la même opération par macro :

Vba
Sélectionnez

Dim Tableau() As Variant
 
'Définit les contrôles à modifier
Tableau = Array("CommandButton1", "CommandButton2", "CommandButton3")
 
'La sélection
Worksheets("Feuil3").Shapes.Range(Tableau).Select
 
'La modification des éléments sélectionnés
With Selection
    'Déplace et dimensionne avec les cellules
    .Placement = xlMoveAndSize
    'Imprimer l 'objet
    .PrintObject = True
End With
Créé le 18 novembre 2008  par SilkyRoad

Il est possible de rédiger des formules contenant des symboles complexes grâce à l'éditeur d'équations Microsoft.

Dans Excel 2007 :
Sélectionnez l'onglet "Insertion" dans le ruban.
Cliquez sur le bouton "Objet" dans le groupe "Texte".
Dans l'onglet "Nouvel objet", sélectionnez la ligne "Microsoft Editeur d'équations 3.0."
Cliquez sur le bouton OK pour valider.

Insérez l'objet dans la feuille de calcul puis rédigez votre équation à l'aide des symboles disponibles dans la barre d'outils.
Sélectionnez n'importe quelle cellule pour sortir de l'éditeur.

Pour modifier une équation existante, double cliquez sur l'objet afin d'ouvrir l'éditeur.

Créé le 18 novembre 2008  par SilkyRoad
Vba
Sélectionnez

Dim Ws As Object 
 
'Définit la feuille contenant le contrôle Textbox
Set Ws = ActiveSheet 
 
With Ws 
    .TextBox1.Activate 
    .TextBox1.SelStart = 0 
    .TextBox1.SelLength = Len(.TextBox1) 
End With
Créé le 19 février 2009  par SilkyRoad

Vous disposez de données en A1:A20 et en B1:B20.
Lorsqu'une donnée de la colonne A est saisie dans une zone de texte nommée TextBox1, vous souhaitez que la donnée de la colonne B s'affiche dans la zone de texte TextBox2 :

Pour réaliser cela, spécifiez une cellule liée dans les propriétés du contrôle TextBox1 (par exemple : C1).

Dans la cellule D1, ajoutez cette formule :
=RECHERCHEV($C$1;A1:B20;2)

Ensuite, spécifiez une cellule liée dans textBox2, vers la cellule D1.
(vous pourrez ultérieurement masquer les colonnes C et D, si besoin).

Maintenant, quand vous renseignez une donnée de la colonne A dans le contrôle TextBox1, la donnée de la colonne B apparait dans le contrôle TextBox2.

Créé le 22 mars 2009  par SilkyRoad
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.