IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E] Vider une combobox sur une feuille


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut [VBA-E] Vider une combobox sur une feuille
    Bonjour à tous,

    Je cherche à "vider" une combobox sur une feuille de ses valeurs.
    Je connais la méthode Clear mais elle ne marche apparemment que lorsque la combobox est sur un userform.
    En gros, je cherche le contraire de "ListFillRange", moyen par lequel j'ai rempli ma combobox.
    A noter que j'ai plusieurs contrôles sur ma feuille "Tableau" et de différents types (TextBox, ComboBox, Checkbox et CommandButton). Mes 3 combobox se nomment :
    Liste_Suff_Voie (index 13)
    Liste_Type_Voie (index 14)
    Liste_Libl_Voie (index 15)

    Voilà comment je reinitialise ces trois combobox (sans les vider, bien sur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            If TypeName(Obj.Object) = "ComboBox" Then
                If Left(Obj.Name, 5) = "Liste" And Right(Obj.Name, 4) = "Voie" Then
                    A = Mid(Obj.Name, 7, 4)
                    With Worksheets("Tableau").OLEObjects("Liste_" & A & "_Voie").Object
                        .Value = ""
                        '.Clear
                        .Enabled = False
                    End With
                End If
            End If


    Merci de vos suggestions.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    Normalement la méthode Clear fonctionne aussi dans la feuille de calcul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim i As Integer
    Dim Tableau()
     
    Tableau = Array("Liste_Suff_Voie", "Liste_Type_Voie", "Liste_Libl_Voie")
     
    For i = 0 To UBound(Tableau)
    Worksheets("Feuil1").OLEObjects(Tableau(i)).Object.Clear
    Next


    bon week end
    michel

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour SilkyRoad,

    J'espère que le week-end a été bon, la semaine commence juste et je remets ça !
    Je viens d'essayer la solution mais j'ai un message d'erreur "L'indice n'appartient pas à la sélection"

    Voici comment je l'ai intégrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim Obj as Object        
    Dim Tableau()
    Dim i as Integer
     
        For Each Obj In Feuil1.OLEObjects
            If TypeName(Obj.Object) = "ComboBox" Then
                With Worksheets("Feuil1").OLEObjects(Tableau(i)).Object
                    .Clear
                    .Enabled = False
                End With
                i = i + 1
            End If
        Next Obj
    A noter aussi, la méthode Clear ne passe pas non plus lorsque je fais directement appel à ma combobox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Tableau").Liste_Suff_Voie.Clear
    J'ai le même message d'erreur "L'indice n'appartient pas à la sélection"

    Que se passe-t-il ?

    Merci de votre réponse

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Il est où ton tableau de contrôles ? Si tu n'as rien dans ton tableau, il est normal qu'avec l'indice i qui ne correspond à rien lui non plus, tu aies une erreur...
    Relis le code de Silky et mets les noms de tes contrôles à la place des siens, incrémente i dans ta boucle, en partant de 0 pour ton premier contrôle et refais l'essai.
    A+

    Edir
    J'ajoute que Silky a mis
    For i = 0 To UBound(Tableau)
    et non
    For each... etc

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour Ouskelnor,

    Bien, j'ai oublié copier coller la ligne qui rempli mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau = Array("Liste_Suff_Voie", "Liste_Type_Voie", "Liste_Libl_Voie")
    Mea culpa.

    Sinon, comme je le disais dans mon premier post, j'ai plusieurs contrôles sur ma feuille et de différents types. Le but de ma routine étant de réinitialiser tous ces contrôles, j'utilise donc une boucle For Each ... Logique, non ?
    Ce qui fait que si j'inclus une boucle For dans cette boucle For Each, je réinitialiserai trois fois mes combobox, vu qu'il y en a trois (Lire le premier post : il explique mon problème)!
    En gros, voici ce que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Dim Fin As String, Ligne_Fin As String, Idx_CB As String, A As String
        Dim i As Integer, J As Integer, K As Integer, L As Integer
        Dim Obj As Object
        Dim Tableau()
     
        J = 1
        K = 1
        Tableau = Array("Liste_Suff_Voie", "Liste_Type_Voie", "Liste_Libl_Voie")
     
        For Each Obj In Feuil1.OLEObjects
            If TypeName(Obj.Object) = "CheckBox" Then
                Idx_CB = Obj.Index
                If Idx_CB >= 1 And Idx_CB <= 12 Then
                    Worksheets("Tableau").OLEObjects("CheckBox" & Idx_CB).Object.Value = False
                End If
            End If
            If TypeName(Obj.Object) = "ComboBox" Then
                With Worksheets("Feuil1").OLEObjects(Tableau(i)).Object
                    .Clear
                    .Enabled = False
                End With
                i = i + 1 
            End If
            If TypeName(Obj.Object) = "TextBox" Then
                If Left(Obj.Name, 6) = "ZT_Tel" Then
                    Worksheets("Tableau").OLEObjects("ZT_Tel_" & J).Object.Value = ""
                    Worksheets("Tableau").OLEObjects("ZT_Tel_" & J).Object.Enabled = False
                    J = J + 1
                End If
                If Left(Obj.Name, 6) = "ZT_Fax" Then
                    Worksheets("Tableau").OLEObjects("ZT_Fax_" & K).Object.Value = ""
                    Worksheets("Tableau").OLEObjects("ZT_Fax_" & K).Object.Enabled = False
                    K = K + 1
                End If
            End If
        Next Obj
    Et avec ce code, j'ai le message d'erreur "L'indice n'appartient pas à la sélection", malgré que la valeur de Tableau(0) soit correcte : "Liste_Suff_Voie" !

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Si tu utilises le code de Silky, alors utilise-le complètement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sa boucle "for i  = 0 to Ubound(LeTableau)"
    ne te dit rien ?
    A quoi te sert ton tableau si tu ne l'utilises pas.
    Un code qui fonctionne t'a été donné et tu copies une partie par-ci par-là et tu t'étonnes que ça ne fonctionne pas.
    Que veux-tu de plus ? un code qui ne fonctionne pas ? Pour ça tu as le tien.
    Commence par essayer de comprendre.

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Comprendre, j'aimerai bien! Le jour où je comprendrai tout, je ne poserai plus de question, j'y répondrai.

    Je viens toutefois de comprendre une chose : j'ai bêtement copié-collé son code en oubliant de mettre le nom de ma feuille

    Mais je n'en suis pas pour autant sorti d'affaire. Même avec le code texto de SilkyRoad, j'ai une erreur d'execution : Erreur Automation, Erreur non spécifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            If TypeName(Obj.Object) = "ComboBox" Then
                For i = 0 To UBound(Tableau)
                    Worksheets("Tableau").OLEObjects(Tableau(i)).Object.Clear
                Next i
            End If
    Je me permets d'insister car le code fourni ne semble pas fonctionner dans mon cas.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tes combos sont où ? Ils sont bien dans une feuille de calculs ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Oui, mais je n'ai pas que cela comme contrôles sur le feuille.
    J'ai 12 checkboxs, 3 combobox, 10 textbox et 1 commandButton.
    Je veux décocher les checkboxs, vider, effacer la valeur et inactiver les combobox et effacer la valeur des textbox dès l'ouverture de mon classeur.
    Le code que j'ai joins tout à l'heure est dans un module Workbook_Open().

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Donc tu as des objets de plusieurs types
    Certains n'acceptent pas Clear (commandButton, checkbox... etc)
    Tu dois donc les identifier par leurs type et selon, leur affecter le code qui convient : Clear, false ou rien (commandButton)
    Je n'ai pas en tête le type des contrôles d'une feuille de calculs mais l'aide devrait pouvoir te renseigner
    Ensuite, un select case sur le type te permettra de faire ce qu'il faut pour le type de contrôle que la boucle identifie
    A+

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu places quelque contrôles sur une feuille vierge d'un classeur vierge et tu testes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Sub OLEObjectsViderLesControlesDeTouteSubstance()
    Dim Obj As Object
    Set lf = Worksheets("Feuil1")
    With lf
        For Each Obj In lf.OLEObjects
            Select Case LCase(Obj.Name)
                Case "textbox1"
                    Obj.Activate
                    .OLEObjects(Obj.Name).Object.Text = ""
                Case "commandbutton1"
                    .OLEObjects(Obj.Name).Object.Caption = ""
                Case "checkbox1"
                    .OLEObjects(Obj.Name).Object.Value = False
                Case Else
            End Select
        Next
    End With
    End Sub
    A+

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    Je viens d'essayer la solution mais j'ai un message d'erreur "L'indice n'appartient pas à la sélection"

    Est ce que tu as simplement testé la procédure?


    michel

  13. #13
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour Ouskel'n'or,
    Bonjour SilkyRoad,

    Merci de vous pencher sur mon problème.

    Ouskel'n'or : La routine fournie fonctionne bien. J'ai placé une textbox (avec un texte dedans), un commandButton et une checkbox (que j'ai cochée) sur une feuille vierge. Le résultat est bien la textbox vide et activée (curseur qui clignote dedans), un commandbutton sans nom et la checkbox décochée. Merci pour la boucle Select Case, je ne la connaissais pas et ça me permettra d'alléger mon code. Je planche pour le réécrire
    Je me suis ensuite permis d'ajouter une combobox que j'ai remplie grâce à la propriété ListFillRange (directement à parir de la fenêtre Propriété). J'ai ensuite rajouté deux lignes de code pour vider la combobox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Sub OLEObjectsViderLesControlesDeTouteSubstance()
    Dim Obj As Object
    Set lf = Worksheets("Feuil1")
    With lf
        For Each Obj In lf.OLEObjects
            Select Case LCase(Obj.Name)
                Case "textbox1"
                    Obj.Activate
                    .OLEObjects(Obj.Name).Object.Text = ""
                Case "commandbutton1"
                    .OLEObjects(Obj.Name).Object.Caption = ""
                Case "checkbox1"
                    .OLEObjects(Obj.Name).Object.Value = False
                Case "combobox1"
                    .OLEObjects(Obj.Name).Object.Clear
                Case Else
            End Select
        Next
    End With
    End Sub
    Mais encore une erreur non répertoriée sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .OLEObjects(Obj.Name).Object.Clear
    SilkyRoad : je pense que ce message d'erreur était tout simplement dû à une mauvaise utilisation du nom de ma feuille, j'ai bêtement recopié le code Worksheets("Feuil1") alors que ma feuille s'appelle "Tableau". Du coup, il ne trouvait pas le tableau. Depuis cette correction, lorsque je teste la procédure, j'ai une erreur non spécifiée.

    Quoi qu'il en soit, je réécris mon code et je vous le soumettrai dès que ce sera fait.

    Merci à vous

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    erreur non répértoriée sur
    .OLEObjects(Obj.Name).Object.Clear
    Justement ce que je n'avais pas testé (un combo, faut le renseigner... )
    Bref, j'ai fais l'effort et je confirme, Clear fonctionne très bien. J'ai repris le code tel qu'il est dans ton dernier message. Je ne l'avais plus, j'ai fait un copier/coller : Aucune erreur !
    Ensuite j'ai mis le code suivant dans la feuille de code de la feuille de calculs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Worksheet_Activate()
    ComboBox1.Clear
    For i = 1 To 10
     ComboBox1.AddItem Cells(i, 1)
    Next
    End Sub
    Aucune erreur, le clear fonctionne correctement (nettoyage des anciennes valeurs et insersion des nouvelles).
    Conclusion : Je pense que tu as une crotte ailleurs dans ton code.
    Pour tester, sur une feuil1 toute neuve dans un classeur tout neuf, insère un combo, mets quelques lignes de données dans la colonne A et teste les deux versions.
    Pour renseigner le combo, et comme j'ai utilisé Worksheet_Activate, change de feuille et reviens sur la feuil1
    Tu verras que le combo est bien "nettoyé" avant d'être renseigné (méthode ci-dessus) ou qu'il est bien nettoyé par macro (le code que tu mets dans ta dernière réponse)
    A+

  15. #15
    Futur Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Ma réponse est tardive mais la discussion n'était close.
    Ouskelnor, j'ai essayé ce que tu me proposais et en effet, ca marche très bien.
    Comme tu le disais, je dois avoir un "crotte" ailleurs dans mon code, mais je n'ai rien trouvé (avec mon petit niveau en vba) qui ferait que ca ne fonctionne pas. Bref, j'ai contourné ce problème en utilisant : C'est pas très propre ma ca marche !

    Merci pour le Select Case, je ne connaissais pas mais ca a considérablement réduis mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Public Sub Init()
     
        Dim Obj As Object
     
        Application.ScreenUpdating = False
        ThisWorkbook.Worksheets("Recap").Visible = True
     
        'Initialisation des cases sur feuille Tableau
        Sheets("Tableau").Select
        Range("E6:E21,F8:F12,F15:F17,F20,F21").Select
        Selection.ClearContents
        Selection.Interior.Color = &HFFFFFF
     
        'Initialisation des controles sur feuille Tableau
        Set lf = Worksheets("Tableau")
        With lf
            For Each Obj In lf.OLEObjects
                Select Case LCase(TypeName(Obj.Object))
                    Case "checkbox"
                        .OLEObjects(Obj.Name).Object.Value = False
                    Case "combobox"
                        .OLEObjects(Obj.Name).Object.Value = ""
                        .OLEObjects(Obj.Name).ListFillRange = ""
                        .OLEObjects(Obj.Name).Object.BackColor = &H80000005
                        .OLEObjects(Obj.Name).Visible = True
                        .OLEObjects(Obj.Name).Object.Enabled = False
                    Case "textbox"
                        .OLEObjects(Obj.Name).Object.Value = ""
                        .OLEObjects(Obj.Name).Object.BackColor = &H80000005
                Case Else
                End Select
            Next
        End With
     
        'On efface les données dans la feuille Recap
        Worksheets("Recap").Select
        Rows("2:2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.ClearContents
     
        'On règle le zoom pour les différentes résolutions d'écran
        Sheets("Tableau").Select
        Range("A1:G22").Select
        ActiveWindow.Zoom = True
     
        'Initialisations spéciales
        Adresse_Spe = False
        Bdd_Suite.B_spe.Enabled = True
     
     
        ThisWorkbook.Worksheets("Recap").Visible = False
        Application.ScreenUpdating = True
     
    End Sub
    NB pour Ouskelnor : je viens de faire un tour sur le forum pour chercher des infos et je sens un certain ras le bol des modérateurs à répondre à certains messages. Notre échange a été un peu tendu et j'en suis navré. Je mesure maintenant tout le boulot que vous fournissez pour répondre au mieux à toutes les questions et je ne peux que vous dire que merci et bravo. Mais contrairement à ce que pense ThierryAIM, les forums et particulièrement le votre sont la seule solution pour répondre à des questions qui semblent naturelles aux développeurs accomplis mais pas forcément aux novices. Je suis d'accord en revanche que faire appel à vous directement et sans recherches personnelles antérieures vous mets certainement dans une position peu valorisante (les autres récoltent les fleurs à votre place). Il serait cependant dommage de fermer l'accès du forum aux novices, vu la mine d'informations qu'il représente.
    Je ne peux donc que vous encourager à continuer sur cette voie et vous remercier de nous faire partager vos connaissances.

    A+

    Y

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. Valeur Par défaut sur une Combobox attaché à une collection
    Par olufade dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 26/08/2009, 17h47
  3. Détecter le click sur une combobox d'une datagridview
    Par Delphi-ne dans le forum Windows Forms
    Réponses: 11
    Dernier message: 21/04/2009, 11h22
  4. Réponses: 2
    Dernier message: 30/10/2008, 13h28
  5. [VBA Excel] Appliquer une macro sur une celulle contenant une valeur
    Par tchauviere dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/01/2008, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo