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 :

ComboBox liées & recherche dans une page


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Mai 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 14
    Par défaut ComboBox liées & recherche dans une page
    Bonjour à tous,

    Je me permets de solliciter votre aide et vos avis sur l'utilisation de ComboBox liées.

    Dans les grandes lignes voici le fonctionnement de mon formulaire :
    J'ai 2 ComboBox :
    1) La première invite l'utilisateur à renseigner une AFFECTATION
    2) La deuxième propose les comptes disponibles en fonction de l'affectation précédemment choisie
    Enfin le choix de l'élément selectionné dans la ComboBox2 doit me permettre d'afficher les codes comptables.

    Pour cela :
    1) je récupère le contenu des valeurs de cet onglet répondant à un "code AFFECTATION" précédemment généré par l'utilisation de la ComboBox1 (1-2-3)
    2) je remplie un tableau à deux dimensions avec les éléments répondants au critère du code AFFECTATION
    3) J'affiche les codes comptables dont le numéro de ligne correspond à celui selectionné dans la ComboBox2.

    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
     
    Sub PopulateComboBoxSaisie1()
     
    Dim TabCpt1() As String
    Dim n, i As Integer
     
    Form_Saisie.ComboBox1.Clear
    n = Range("AFFECTATIONS").Rows.Count
    ReDim TabCpt1(n) As String
    For i = 1 To n
        TabCpt1(i) = Range("AFFECTATIONS").Cells(i, 1)
        Form_Saisie.ComboBox1.AddItem TabCpt1(i)
    Next i
    Form_Saisie.ComboBox1.Text = TabCpt1(1)
     
    End Sub
    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
     
    Sub PopulateComboBoxSaisie2()
    Dim NbLigne, NbCol, AffectType, i, j, CompteurOccurance As Integer
     
    Form_Saisie.ComboBox2.Clear
    AffectType = Form_Saisie.ComboBox1.ListIndex + 1
    MsgBox (AffectType)
    NbLigne = Range("PLAN_DE_COMPTES").End(xlDown).Row - 1
    NbCol = 5
    ReDim TabCptFull(NbLigne, NbCol) As Variant
     
    For i = 1 To NbLigne
        If Range("PLAN_DE_COMPTES").Cells(i, 2) = AffectType Then
            For j = 1 To NbCol
                TabCptFull(i, j) = Range("PLAN_DE_COMPTES").Cells(i, j)
            Next j
            Form_Saisie.ComboBox2.AddItem Range("PLAN_DE_COMPTES").Cells(i, 3)
        End If
    Next i
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub RecupCodeComptable()
     
    'Dim NumOccur As Integer -> publiques
    'Dim CompteGen, CompteAux As String -> en variables publiques
     
    NumOccur = Form_Saisie.ComboBox2.ListIndex + 1
    CompteGen = TabCptFull(NumOccur, 4)
    CompteAux = TabCptFull(NumOccur, 5)
    Form_Saisie.Label13.Caption = CompteAux
    Form_Saisie.Label16.Caption = CompteGen
     
    End Sub
    Mes problèmes sont les suivants :
    - Je n'arrive pas à afficher certains résultats (les premiers éléments de la liste fonctionne mais pas les derniers...)
    - J'ai de temps en temps une erreur d'exécution 9 - "l'indice n'appartient pas à la sélection" car j'ai l'impression qu'un listIndex d'une des ComboBox passe à -1 ! ce qui me parait étrange vu qu'il est censé commencer à 0....

    ci-joint le fichier complet le cas échéant

    Merci d'avance pour votre aide ! Cela fait quelques soirs que je patine...

    Bien cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 437
    Par défaut
    Bonjour,

    - Je n'arrive pas à afficher certains résultats (les premiers éléments de la liste fonctionne mais pas les derniers...)
    Cela vient du fait que la table TabCptFull() n'est pas complétée correctement. Une façon de le faire:
    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
    Sub PopulateComboBoxSaisie2()
       Dim NbLigne As Long, NbCol As Long, AffectType As Integer
       Dim i As Long, j As Long, CompteurOccurance As Long
       Form_Saisie.ComboBox2.Clear
       AffectType = Form_Saisie.ComboBox1.ListIndex + 1
       Debug.Print "PopulateComboBoxSaisie2", AffectType
       NbLigne = Range("PLAN_DE_COMPTES").End(xlDown).Row - 1
       NbCol = 5
       '--- calcul taille du tableau
       For i = 1 To NbLigne
          If Range("PLAN_DE_COMPTES").Cells(i, 2) = AffectType Then
             CompteurOccurance = CompteurOccurance + 1
          End If
       Next i
       Debug.Print "CompteurOccurance: "; CompteurOccurance
       ReDim TabCptFull(CompteurOccurance, NbCol)
       '--- remplissage du tableau TabCptFull
       CompteurOccurance = 0
       For i = 1 To NbLigne
          If Range("PLAN_DE_COMPTES").Cells(i, 2) = AffectType Then
             CompteurOccurance = CompteurOccurance + 1
             Debug.Print "CompteurOccurance: "; CompteurOccurance,
             'TabCptFull(i, 1) = CompteurOccurance
             For j = 1 To NbCol
                TabCptFull(CompteurOccurance, j) = Range("PLAN_DE_COMPTES").Cells(i, j)
                Debug.Print TabCptFull(CompteurOccurance, j),
             Next j
             Form_Saisie.ComboBox2.AddItem Range("PLAN_DE_COMPTES").Cells(i, 3)
             Debug.Print
          End If
       Next i
    End Sub
    erreur d'exécution 9 - "l'indice n'appartient pas à la sélection"
    Cela vient du fait que le "Clear" de la combobox envoie ensuite en résultat la valeur -1. Il faut donc traiter ce cas particulier, par exemple ainsi:
    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
    Sub RecupCodeComptable()
       'Dim NumOccur As Long -> publiques
       'Dim CompteGen, CompteAux As String -> en variables publiques
       Dim i As Long, j As Long
       If Form_Saisie.ComboBox2.ListIndex = -1 Then
          '--- -1 si aucun choix (combobox clear)
          Form_Saisie.Label13.Caption = ""
          Form_Saisie.Label16.Caption = ""
       Else
          NumOccur = Form_Saisie.ComboBox2.ListIndex + 1
          Debug.Print "RecupCodeComptable - NumOccur: "; NumOccur
          '--- juste pour débogage ---
          For i = 1 To UBound(TabCptFull, 1)
             Debug.Print "i="; i,
             For j = 1 To 5
                Debug.Print TabCptFull(i, j),
             Next j
             Debug.Print
          Next i
          '--- fin partie débogage ---
          CompteGen = TabCptFull(NumOccur, 4)
          CompteAux = TabCptFull(NumOccur, 5)
          Form_Saisie.Label13.Caption = CompteAux
          Form_Saisie.Label16.Caption = CompteGen
       End If
    End Sub
    Bonne continuation.
    Fichiers attachés Fichiers attachés

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 437
    Par défaut
    et une manière un peu plus élégante de préparer le tableau TabCptFull(), tenant compte du fait que la fonction Redim ne peut concerner que la dernière dimension d'un tableau.
    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
    Sub PopulateComboBoxSaisie2()
       '--- version tenant compte du fait que Redim ne peut se faire que sur la dernière dimension d'un tableau
       '--- --> au départ colonnes feuille Excel mises en lignes dans le tableau
       Dim NbLigne As Long, NbCol As Long, AffectType As Integer
       Dim i As Long, j As Long, CompteurOccurance As Long
       Form_Saisie.ComboBox2.Clear
       AffectType = Form_Saisie.ComboBox1.ListIndex + 1
       Debug.Print "PopulateComboBoxSaisie2", AffectType
       NbLigne = Range("PLAN_DE_COMPTES").End(xlDown).Row - 1
       NbCol = 5
       CompteurOccurance = 0
       For i = 1 To NbLigne
          If Range("PLAN_DE_COMPTES").Cells(i, 2) = AffectType Then
             CompteurOccurance = CompteurOccurance + 1
             Debug.Print "CompteurOccurance: "; CompteurOccurance,
             If CompteurOccurance = 1 Then
                ReDim TabCptFull(NbCol, 1)
             Else
                ReDim Preserve TabCptFull(NbCol, CompteurOccurance)  '--- fait de la place pour l'élément suivant
             End If
             For j = 1 To NbCol
                TabCptFull(j, CompteurOccurance) = Range("PLAN_DE_COMPTES").Cells(i, j)
                Debug.Print TabCptFull(j, CompteurOccurance),
             Next j
             Form_Saisie.ComboBox2.AddItem Range("PLAN_DE_COMPTES").Cells(i, 3)
             Debug.Print
          End If
       Next i
       '--- finalement, transposer le tableau: lignes.colonnes --> colonnes.lignes
       TabCptFull = Application.Transpose(TabCptFull)
    End Sub

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Sauf erreur, notre ami cherche à développer un code relatif à des Combobox en cascades.
    Pour cela, je me permets de reporter cette discussion.

Discussions similaires

  1. Recherche dans une page
    Par flamel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/03/2010, 11h32
  2. champ recherche dans une page Web
    Par ALIAS200 dans le forum Général Conception Web
    Réponses: 7
    Dernier message: 28/01/2008, 16h36
  3. Rechercher dans une page
    Par xvid110 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/11/2007, 17h10
  4. Rechercher dans une page
    Par eric41 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 11/05/2006, 20h34
  5. [PHP-JS] Rechercher dans une page
    Par eric41 dans le forum Langage
    Réponses: 7
    Dernier message: 08/05/2006, 10h05

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