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 :

Pblm d'erreur d'execution 91 sur listbox à choix multiple conditionnée par une combobox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant SAP
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant SAP
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Par défaut Pblm d'erreur d'execution 91 sur listbox à choix multiple conditionnée par une combobox
    Bonjour,
    Vous êtes mon dernier recours pour arriver à mes fins donc je me lance:

    -Mon userform dispose d'une combobox et d'une listBox
    -La combobox alimente les données de la liste box à partir du choix qui a été fait:
    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
    'Determination des valeurs de la combobox'
     
    Private Sub UserForm_Initialize()
     
    ComboBox1.AddItem "0 - Tomate"
    ComboBox1.AddItem "1 -Choux"
    ComboBox1.AddItem "2 - Bettrave"
    ComboBox1.AddItem "3 - Salade"
    ComboBox1.AddItem "4 - Pizza"
    ComboBox1.AddItem "5 - Fromage"
    ComboBox1.AddItem "6 - Tout"
     
    End Sub
     
    'Ici, j'alimente la listbox à partir du choix de la combobox'
     
     
     Private Sub ComboBox1_Change()
     
        If ComboBox1.Value = "0 - tomate" Then
            ListBox1.RowSource = ("Feuil1!C26:C35")
        ElseIf ComboBox1.Value = "1 - choux" Then
            ListBox1.RowSource = ("Feuil1!F26:F32")
        ElseIf ComboBox1.Value = "2 - bettrave" Then
            ListBox1.RowSource = ("Feuil1!I26:I32")
        ElseIf ComboBox1.Value = "3 - salade" Then
            ListBox1.RowSource = ("Feuil1!M26:M32")
        ElseIf ComboBox1.Value = "4 - pizza" Then
            ListBox1.RowSource = ("Feuil1!R26:R32")
        ElseIf ComboBox1.Value = ("5 - Fromage") Then
            ListBox1.RowSource = ("Feuil1!V26:V30")
        ElseIf ComboBox1.Value = "" Then
            ListBox1.RowSource = ""
        ElseIf ComboBox1.Value = "6 - Tout" Then
            ListBox1.RowSource = ("")
        End If
     
        End Sub

    -Ensuite je voudrais que pour chaque choix de la listbox, une action s'execute: voici donc ce que j ai écris:

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Sub perimetre()
     
    Dim ListBox1 As ListBox
     
     
     
     
     
     
     
       If ListBox1.Value = ("APPUI ET EXPERTISE") Then
              Call EtatmajAPPUIETEXPERTISE
     
     
     
       End If
       If ListBox1.Value = ("AQHSE") Then
              Call EtatmajAQHSE
     
     
        End If
        If ListBox1.Value = ("COMMUNICATION") Then
              Call EtatmajCOMMUNICATION
     
     
          End If
          If ListBox1.Value = ("DETACHES SYNDICAUX ET SOCIAUX") Then
              Call Etatmajdetachesyndic
     
     
        End If
        If ListBox1.Value = ("DIRECTION") Then
              Call EtatmajDirection
     
     
        End If
        If ListBox1.Value = ("ETAT MAJOR") Then
              Call Etatmaj
     
     
        End If
        If ListBox1.Value = ("GESTION") Then
             Call EtatmajGESTION
     
     
       End If
       If ListBox1.Value = ("LOGISTIQUE SECRETARIAT ASSISTANCE") Then
             Call EtatmajLOGISTIQUESECRETARIATASSISTANCE
     
     
        End If
        If ListBox1.Value = ("Nouveau groupe") Then
             Call EtatmajNouveaugroupe
     
        End If
     
        If ListBox1.Value = ("RESSOURCES HUMAINES") Then
             Call EtatmajRESSOURCESHUMAINES
     
        End If
        If ListBox1.Value = ("CALVADOS") Then
             Call OPEcalvados
     
       End If
     
       If ListBox1.Value = ("EURE") Then
            Call OPEEure
      End If
     
        If ListBox1.Value = ("ORNE") Then
            Call OPEOrne
     
       End If
     
       If ListBox1.Value = ("SEINE MARITIME") Then
            Call OPEseinemaritime
     End If
     
     
    'etc(il y en a 20)'
     
     
     
    End Sub

    Bien évidemment, le code ne marche pas et VBA surligne la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ListBox1.Value = ("APPUI ET EXPERTISE") Then
    et me renvoit l'erreur dexecution 91, en précisant que la variable objet ou variable de bloc with est non-definit

    J'ai essayé avec des ifelse à la place des if ( sauf le premier en enlevant les end if intermédiaires), avec des select cases (mais même probleme à la ligne "selct case listbox1.value", en introduisant des variables intermédiaires , en changeant le LIstBox1.value en selected, rien n'y fait. Il semble que le programme ne trouve pas la valeur sélectionnée de ma listbox...

    J'ai donc un grand besoin d'aide

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour benjam',

    Tout d'abord, quelque chose me choque dans ton premier code : tes String ne sont pas identiques...
    Tu as des espaces / des majuscules, etc... rien de bien joli...

    Je te propose de passer par un tableau de variables, beaucoup plus safe !

    Ensuite, tu as 7 If / ElseIf... Cela signifie que la méthode Select Case est parfaitement adaptée !

    Voici un exemple.
    Sub de départ :
    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
    Option Explicit
     
    Public Table() As String
     
    Sub benjam()
    ReDim Table(6) As String
     
    Table(0) = "0 - Tomate"
    Table(1) = "1 - Choux"
    Table(2) = "2 - Bettrave"
    Table(3) = "3 - Salade"
    Table(4) = "4 - Pizza"
    Table(5) = "5 - Fromage"
    Table(6) = "6 - Tout"
     
    UserForm1.Show
     
    End Sub
    Ton code pour alimenter ta ListBox en fonction de ta 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    'Determination des valeurs de la combobox'
     
    Private Sub UserForm_Initialize()
     
    Me.ComboBox1.List = Table
     
    End Sub
     
    'Ici, j'alimente la listbox à partir du choix de la combobox'
     
     
    Private Sub ComboBox1_Change()
     
    Me.ListBox1.Clear
     
    Select Case ComboBox1.Value
        Case Table(0)
            Me.ListBox1.List() = Worksheets("Feuil1").Range("C26:C35").Value
     
        Case Table(1)
            Me.ListBox1.List() = Worksheets("Feuil1").Range("F26:F32").Value
     
        Case Table(2)
            Me.ListBox1.List() = Worksheets("Feuil1").Range("I26:I32").Value
     
        Case Table(3)
            Me.ListBox1.List() = Worksheets("Feuil1").Range("CM26:M32").Value
     
        Case Table(4)
            Me.ListBox1.List() = Worksheets("Feuil1").Range("R26:R32").Value
     
        Case Table(5)
            Me.ListBox1.List() = Worksheets("Feuil1").Range("V26:V30").Value
     
        Case Table(6)
            'Me.ListBox1.List() = ""
     
        Case Else
            'Me.ListBox1.List() = ""
    End Select
     
    End Sub
    Enfin, pour répondre vraiment à ton problème, tu es dans une Sub indépendante.
    Tu dois donc faire référence à la ListBox de ton UserForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Userform1.ListBox1.Value = "Ma valeur"
    Avec ce que je t'ai donné, tu peux donc passer par les variables de ton tableau !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Userform1.ListBox1.Value = Table(4) Then
        Call Ma_macro
    End If
    Dernier point, tes parenthèses ne servent à rien !

    Cordialement,
    Kimy

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant SAP
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant SAP
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Par défaut Merci ;)
    Un grand merci à toi pour cette réponse aussi rapide.

    Ensuite, mes String ne sont effectivement pas identiques car je les ai changés (à la va-vite, j'en convient) pour des raisons de confidentialité.
    J'ai tout de même changé ma méthode en suivant tes suggestions et je passe par la table qui marche très bien.


    Seulement, les données sur lesquelles portent le dernier code sont celle de la listbox alimenté par la combobox (la table) et non la table elle-meme.
    J'ai néanmoins suivi ton résonnement en mentionant le userform1 avant le ".ListBox1.value".


    Mais je ne peux même pas verifier si ça marche car j'ai un nouveau type d'erreur sur une ligne de code qu'appelle le programme apres la selection de la valeur de la listbox J'obtiens donc :Erreur d'exécution '1004': Impossible de lire la propriété PivotTables de la classe Worksheet

    et le programme me surligne cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ActiveWorkbook.ShowPivotTableFieldList = True
    If ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Pér"). _
            Orientation = xlHidden Then
     
    Else: ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotField("Pér").Orientation = xlHidden
     
    End If

    J'ai d'abord pensé que l'erreur venait du fait que je n'avais pas précisé l'onglet, j'ai donc réécrit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ActiveWorkbook.ShowPivotTableFieldList = True
    If Worksheets("TCD").ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Pér"). _
            Orientation = xlHidden Then
     
    Else: Worksheets("TCD").ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotField("Pér").Orientation = xlHidden
     
    End If
    Et là, le programme me dit: "erreur d'execution 438, propriété ou méthode non géré par cet objet"


    Je ne sais pas quoi faire et je te volerai bien un autre de tes précieux conseils, si je peux me permettre d'abuser.


    Merci d'avance

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Rooooooh !

    C'est pourtant évident !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ActiveWorkbook.ShowPivotTableFieldList = True
    If Worksheets("TCD").ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Pér"). _
            Orientation = xlHidden Then
     
    Else: Worksheets("TCD").ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotField("Pér").Orientation = xlHidden
     
    End If
    Bref, voici qui est beaucoup mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Workbooks("Mon classeur").ShowPivotTableFieldList = True
    If Worksheets("TCD").PivotTables("Tableau croisé dynamique1").PivotFields("Pér"). _
            Orientation = xlHidden Then
     
    Else: Worksheets("TCD").PivotTables("Tableau croisé dynamique1").PivotField("Pér").Orientation = xlHidden
     
    End If


    N'hésite pas à revenir vers moi !

    Cordialement,
    Kimy

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant SAP
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant SAP
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Par défaut oui mais non
    ...effectivement, ce n'est pas très compliqué.
    Par ailleurs, cela m'a permis de voir que...le programme ne marchait pas
    Donc je reviens à mon problème initial:
    Dans le code qui suit, VBA ne reconnait pas la valeur de la liste (UserForm1.ListBox1.Value)
    et ce, même en précisant le form:
    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
    Sub perimetre()
     
     
    Dim Value As Variant
     
     
      If UserForm1.ListBox1.Value = ("APPUI ET EXPERTISE") Then
              Call EtatmajAPPUIETEXPERTISE
                                   End If
       If UserForm1.ListBox1.Value = ("AQHSE") Then
              Call EtatmajAQHSE
                End If
        If UserForm1.ListBox1.Value = ("COMMUNICATION") Then
              Call EtatmajCOMMUNICATION
                   End If
          If UserForm1.ListBox1.Value = ("DETACHES SYNDICAUX ET SOCIAUX") Then
              Call Etatmajdetachesyndic
                   End If
        If UserForm1.ListBox1.Value = ("DIRECTION") Then
              Call EtatmajDirection
                End If
        If UserForm1.ListBox1.Value = ("ETAT MAJOR") Then
              Call Etatmaj
     
        End If
        If UserForm1.ListBox1.Value = ("GESTION") Then
             Call EtatmajGESTION
     
       End If
       If UserForm1.ListBox1.Value = ("LOGISTIQUE SECRETARIAT ASSISTANCE") Then
             Call EtatmajLOGISTIQUESECRETARIATASSISTANCE
                  End If
        If UserForm1.ListBox1.Value = ("Nouveau groupe") Then
             Call EtatmajNouveaugroupe
              Worksheets("TCD").ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
                          "2- Libellé Domaine 2014 niveau 2").CurrentPage = "(All)"
                            End If
        If UserForm1.ListBox1.Value = ("RESSOURCES HUMAINES") Then
             Call EtatmajRESSOURCESHUMAINES
                                    End With
    Du coup, je suis re-coincé.
    Quand je presse F8, le programme passe les alternatives comme si aucune n'était la bonne, et quand j'appuye sur F1, en cliquant sur ListBox1 ou UserForm1, VBA me dit que le mot-clé est introuvable.

    Une dernière idée et je ne t'embête plus, promis!

  6. #6
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour benjam',

    J'ai un peu (beaucoup) du mal à comprendre ton code...
    1. Tu es ici dans une procédure. Quel est l'intérêt ?
      Tu ne souhaites pas utiliser l'événement Private Sub ComboBox1_Change() ?
      Ou tout simplement un autre événement lié, par exemple, à un CommandButton : Private Sub CommandButton1_Click() ?
    2. A quoi sert cette déclaration : Dim Value As Variant ?
      Le .Value des ListBox est une propriété et pas une variable.
    3. Pourquoi gardes-tu tes If dans tous les sens ? Je t'ai proposé un Select Case sur la variable ComboBox1.Value, bien plus adapté.
      Tu as juste à l'adapter.
    4. Je t'ai déjà dis que les parenthèses autour de tes String ne servent à rien.
    5. Tu as encore un Worksheets("TCD").ActiveSheet...
    6. Tu as un End With sans With 'quelquechose...
    7. Tes indentations sont juste horribles... Elles ne te permettent pas de voir clairement ton code et ce que tu fais...

    Il te faut d'avantage de rigueur !
    En bref... à adapter :
    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
    Private Sub CommandButton1_Click()
     
    Select Case UserForm1.ListBox1.Value
     
        Case "APPUI ET EXPERTISE"
            Call EtatmajAPPUIETEXPERTISE
     
        Case "AQHSE"
            Call EtatmajAQHSE
     
        Case "COMMUNICATION"
            Call EtatmajCOMMUNICATION
     
        Case "DETACHES SYNDICAUX ET SOCIAUX"
            Call Etatmajdetachesyndic
     
        Case "DIRECTION"
            Call EtatmajDirection
     
        Case "ETAT MAJOR"
            Call Etatmaj
     
        Case "GESTION"
            Call EtatmajGESTION
     
        Case "LOGISTIQUE SECRETARIAT ASSISTANCE"
            Call EtatmajLOGISTIQUESECRETARIATASSISTANCE
     
        Case "Nouveau groupe"
            Call EtatmajNouveaugroupe
            Worksheets("TCD").PivotTables("Tableau croisé dynamique1").PivotFields( _
            "2- Libellé Domaine 2014 niveau 2").CurrentPage = "(All)"
     
        Case "RESSOURCES HUMAINES"
            Call EtatmajRESSOURCESHUMAINES
     
    End Select
     
    End Sub
    N'hésite pas à revenir vers moi !

    Cordialement,
    Kimy

Discussions similaires

  1. erreur d'execution 3061 sur recordset
    Par moicats dans le forum VBA Access
    Réponses: 6
    Dernier message: 16/09/2008, 16h38
  2. erreur d'execution 3075 sur une fonction
    Par maximus_yassine dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/05/2008, 16h41
  3. [access 2003/VBA/SQL] Erreur d'execution 3201 sur une requête.
    Par Milyshyn76 dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/05/2008, 09h04
  4. Réponses: 8
    Dernier message: 19/04/2007, 15h03
  5. [VBA-E] erreur d'execution '1004' sur masquage feuille
    Par Cupoftea dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 18h34

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