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 :

Problème d'affection de bouton pour deux Listbox [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Problème d'affection de bouton pour deux Listbox
    Bonjour à tous !
    J'ai un problème assez spécial. J'ai créé une macro qui me permet d'archiver certains fichiers. Grâce à ces archives, je peux retrouver un ancien fichier en effectuant une recherche : je recherche une lettre et un numéro associé et ma macro trouve le fichier associé. J'ai donc, sur un UserForm, créé deux listbox et je suis arrivé à les configurer de manière à ce que lorsque je sélectionne une lettre dans la première ListBox, la seconde n'affiche que les chiffres associés. Cette macro marche très bien.
    Cependant, par soucis de facilité, je souhaite réduire l'UserForm et placer le bouton qui lance la recherche sur une feuille Excel.
    Je vais tenter de vous expliquer en détail mon problème. A défaut, je transfèrerai le fichier simplifié sans données confidentielles.

    Mon classeur se compose de trois feuilles : une où est placée le bouton lançant la recherche (nommée "Accoglienza" (oui, je travaille pour des italiens :D ), la seconde, "Archivio", comme son nom l'indique elle contient les archives (une ligne correspond à un fichier) et la troisième feuille "Variables" est la feuille qui me permet d'avoir mes lettres de base qui caractéristiques mes fichiers à Archiver.
    Par exemple : la lettre V en feuille 3 correspond à tous mes fichiers qui ont pour caractéristique : V+ un nombre. Ce nombre s'incrémente à chaque nouvelle entrée dans les archives de manière à ce qu'il n'est aucun doublon.

    Etant débutant sous VBA, j'ai simplement retranscrit mon code qui fonctionne dans l'UserForm associé au bouton recherche, dans un nouveau bouton que j'ai placé en feuille 1. En débuggant, je me suis retrouvé bloqué par une erreur et j'ai petit à petit simplifié mon programme pour n'arriver qu'à avoir l'essentiel.
    Mes deux boutons ont un code identique.
    Cependant, on en vient enfin au problème, c'est que l'un des boutons (celui de l'UserForm) marche parfaitement, mais celui du classeur Excel ne marche pas. J'arrive à recréer la liste mais lorsque je clique sur une lettre, j'ai le message d'Erreur : "Incompatibilité de type". C'est très bizarre car le même programme fonctionne avec l'autre bouton !

    Enfin, j'ai oublié de vous dire : lorsque j'appuie sur le bouton, je crée une nouvelle feuille où je viens copier les données qui m'intéressent des archives. J'ai donc dans cette nouvelle feuille ("Adresses") uniquement les données qui m'intéressent.
    Lorsque la recherche est effectuée, je supprime avec ma macro cette feuille.

    Ci-joint mon programme associé au bouton :


    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    'Declaration of variables for sheets
    Public WS2 As Worksheet
    Public WS3 As Worksheet
    Public WS4 As Worksheet
     
    'Déclaration des variables pour la création des listes
    Public tab_famille As Variant
    Public tab_sous_famille As Variant
     
    Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean
    Dim Feuille As Excel.Worksheet
      On Error GoTo Feuille_Absente_Error
        Set Feuille = ActiveWorkbook.Worksheets(Nom_Feuille)
      On Error GoTo 0
      Feuille_Existe = True
    Exit Function
     
    Feuille_Absente_Error:
      Feuille_Existe = False
    End Function
     
    'Programme qui associe à une lettre les numéros associés
    Public Sub Letter_change()
    For i = 0 To Letter.ListCount
        If Me.Letter.Selected(i) = True Then
            ma_selection = i
            famille_selectionnee = Me.Letter.List(ma_selection)
            Exit For
        End If
    Next i
     
     
    'research of index
    For i = 1 To UBound(tab_famille, 1)
        If famille_selectionnee = tab_famille(i, 1) Then
            famille_selectionnee_index = tab_famille(i, 2)
     
            Exit For
        End If
    Next i
     
     
    'fill in lists
    Accueil.Number.Clear
    For i = 1 To UBound(tab_sous_famille, 1)
        If tab_sous_famille(i, 2) = famille_selectionnee_index Then
            Accueil.Number.AddItem tab_sous_famille(i, 1)
        End If
    Next i
     
    End Sub
     
    'Programme de mon bouton "Nuovo_esistente"
    Private Sub Nuovo_esistente_Click()
    Set WS2 = Worksheets("Archivio")
    Set WS3 = Worksheets("Variables")
     
    WS2.Unprotect
    WS3.Unprotect
     
    'begin of the research
    Accueil.Label1.Visible = True
    Accueil.Letter.Visible = True
    Accueil.Number.Visible = True
     
    'Add page 4 for creation of table
    Sheets.Add.Move After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = "Adresses"
    Set WS4 = Worksheets("Adresses")
    WS4.Unprotect
     
    'Copy of titles
    WS4.Range("A1").Value = "Familles"
    WS4.Range("B1").Value = "N°"
     
    'Copy of types
    WS3.Activate
    WS3.Range("E2:E10").Select
    selection.Copy
     
    WS4.Activate
    WS4.Range("A2:A10").Select
    selection.PasteSpecial
     
    WS4.Activate
    WS4.Range("B2:B10").Select
    selection.PasteSpecial
     
    'Copy of values
    WS2.Activate
    Columns("C").Select
    selection.Copy
     
    WS4.Activate
    Columns("D").Select
    selection.PasteSpecial
     
    WS2.Activate
    Columns("D").Select
    selection.Copy
     
    WS4.Activate
    Columns("C").Select
    selection.PasteSpecial
     
    With Sheets("Adresses")
     
    'creation of table for letters
    tab_famille = .Range("A2:B" & .Range("B65000").End(xlUp).Row).Value
     
    'creation of table for numbers
    tab_sous_famille = .Range("C2:D" & .Range("D65000").End(xlUp).Row).Value
     
    End With
     
    'fill in the lists
    Accueil.Letter.Clear
    For i = 1 To UBound(tab_famille, 1)
        Accueil.Letter.AddItem tab_famille(i, 1)
    Next i
     
    'fill in the lists
    Accueil.Number.Clear
    For i = 1 To UBound(tab_sous_famille, 1)
        Accueil.Number.AddItem tab_sous_famille(i, 1)
    Next i
    WS2.Activate
    'Delete the sheet WS4
    Application.DisplayAlerts = False
    Worksheets("Adresses").Delete
    Application.DisplayAlerts = True
     
    End Sub
    Je sais que mon programme n'est vraiment pas idéal et que je pourrai grandement le simplifier, pour l'instant je me concentre sur la partie fonctionnelle (par manque de temps, c'est pour ça que je viens vers vous !)

    En espérant avoir été compréhensible et dans l'attente de vos réponses et questions.
    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Points : 412
    Points
    412
    Par défaut
    Salut à toi,

    Désolé, je n'ai pas encore la réponse, mais ton code est illisible comme ça, peux-tu reprendre ton message en y incluant les balises de code (à l'aide du bouton # dans l'éditeur de messages ou en écrivant [ CODE] ici ton code [ /CODE] (sans les espaces).

    Je pense que beaucoup plus de gens s'y intéresseront si tu fais ça

    À plus tard !

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    C'est vrai que c'est mieux comme ça ! Merci du conseil

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut En attente...
    Bonjour,
    Vu le nombre de sujets comportant des réponses (plus d'une 15aine par jour), je suis étonné que personne ne veuille participer à celui-ci. Si quelqu'un a une piste, une idée, envie de dire quelque chose, je me sens un peu seul...
    Je peux fournir le fichier sans problème.
    Je vous remercie.

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    A quelle ligne de ton code tu as cette incompatibilité de type ?

    Hervé.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Merci de votre réponse !
    L'incompatibilité est à la ligne 34 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 1 To UBound(tab_famille, 1)
    L'erreur d'exécution est l'erreur '13'

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Ton tableau n'est tout simplement pas initialisé au moment où tu cherche à en connaitre la dimension !
    Comme il est déclaré "Variant", le compilateur ne sait pas que c'est un tableau ! Et si tu le déclare en tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public tab_famille() As Variant
    tu as bien l'erreur 9 "L'indice n'appartient pas à la sélection"
    Donc, tu doit d'abord initialiser ta variable en tableau avant d'y faire référence
    Dans ton code il est initialisé ici dans la proc "Nuovo_esistente_Click" à priori :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab_famille = .Range("A2:B" & .Range("B65000").End(xlUp).Row).Value
    Attention, un code issu d'un formulaire ne fonctionnera pas tel quel en le collant dans le module d'une feuille ! Surtout si tu fais référence à des objets de ce formulaire qui n'existe pas dans la feuille.

    Hervé.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui, je me suis rendu compte que les types "Variants" n'étaient pas les bons, mais comment expliquer que mon programme fonctionne parfaitement dans l'UserForm?

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Solution
    Edit : Après avoir encore simplifié mes deux instructions identiques, j'ai enfin découvert pourquoi. En fait, je déclare deux fois mes tableaux "tab_famille" et "tab_sous_famille". Or, dans le deuxième cas, le tableau est re-déclaré à l'ouverture de l'userForm ! C'est pour ça qu'il ne comprenait pas !

    Au final, je me suis dit : comment deux choses parfaitement identiques peuvent être différentes dans un UserForm et sur un classeur ? Justement car elles se déclarent à différents moments.
    Merci Hervé

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

Discussions similaires

  1. Problème d'affectations de boutons
    Par kennyflorian dans le forum Flash
    Réponses: 3
    Dernier message: 28/11/2008, 20h04
  2. Problème d'affectations de boutons
    Par kennyflorian dans le forum Flash
    Réponses: 6
    Dernier message: 27/11/2008, 18h23
  3. Probléme de gestion des evenements pour deux JComboBox
    Par cestsourire dans le forum Composants
    Réponses: 1
    Dernier message: 30/04/2008, 16h15
  4. [Macro] Problème d'affectation à un bouton
    Par aigleborgne dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/06/2007, 09h18
  5. un bouton pour deux résultats
    Par lanfeust42 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/08/2006, 09h31

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