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 :

récupérer chaine de caractère en plusieurs étapes dans une combobox via variable


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut récupérer chaine de caractère en plusieurs étapes dans une combobox via variable
    Bonjour,

    Donc voilà travaillant sur un projet en vba excel , je recherche comment faire pour pouvoir récupérer des noms de clients ainsi que les machines qui leur sont assignées à partir de plusieurs feuilles , tout cela avec un UserForm multipage !

    J'ai créer un UserForm qui en première page me demande de renseigner un nom de client dans une combobox.
    Je récupère ainsi une variable qui me servira par la suite pour cela c'est bon j'ai réussi à faire !

    Une fois le client saisie , il faudrait que je puisse avoir dans une autre combobox qui est en page deux toutes les machines que se client à en sa possession.
    C'est la que sa se complique pour moi

    En sachant que via la variable récupérer lors du renseignement du nom de client je peux ainsi retrouver si le client possède ou non une machine.
    Dans le cas ou il en possède une ou plusieurs elle(s) devrai(en)t s'afficher dans la combobox et dans le cas ou il n'en possède pas une MsgBox " pas de machine chez ce client" devrait s'afficher .

    J’envoie un fichier test qui reprend la manipulation souhaitée.


    J'espère m'être bien exprimer

    Bonne journée!
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,

    Voici le code pour alimenter la combobox Nmarque :

    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
    Private Sub NcRecherche_Change()
        Dim AdresseID As Integer, EquipmentID As Integer, C As Range, Ctr As Boolean
        With Sheets("table adresse")
            AdresseID = Application.Index(.[A:A], Application.Match(Me.NcRecherche.Value, .[B:B], 0))
        End With
        With Sheets("table equipement adresse")
            Me.Nmarque.Clear
            For Each C In .Range(.[C2], .Cells(.Rows.Count, 3).End(xlUp))
                If C.Value = AdresseID Then
                    Me.Nmarque.AddItem _
                    Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0))
                    Ctr = True
                End If
            Next C
            If Ctr = False Then MsgBox " pas de machine chez ce client"
        End With
    End Sub

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Merci sa marche!!!

    Pourrais-je avoir des commentaires avec please, parce que je ne saisis pas tout

    Re,

    Je ne comprend pas pourquoi pour quelques clients j'obtiens une erreur d'exécution "le type ne correspond pas"..
    La ligne suivante se met en surbrillance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Nmarque.AddItem _
                    Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0))

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Voici la macro commenté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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub NcRecherche_Change()
        Dim AdresseID As Integer, EquipmentID As Integer, C As Range, Ctr As Boolean
        'Recherche de l'"Adresse ID correspondant au nom de la première combobox
        With Sheets("table adresse")
            'les fonctions Index et Match correspondent aux fonctions INDEX et EQUIV
            AdresseID = Application.Index(.[A:A], Application.Match(Me.NcRecherche.Value, .[B:B], 0))
        End With
        'remplissage de la combobox Nmarque
        With Sheets("table equipement adresse")
            'effacement des éléments de la combobox Nmarque
            Me.Nmarque.Clear
            'boucle sur les cellules de la colonne C de laa feuille "table equipement adresse"
            For Each C In .Range(.[C2], .Cells(.Rows.Count, 3).End(xlUp))
                'si on trouve correspondance avec l'AdresseID
                If C.Value = AdresseID Then
                    'on ajoute au combobox l'élément de la colonne C correspondant à l'equipment ID
                    'à l'aide des fonctions INDEX et EQUIV
                    Me.Nmarque.AddItem _
                    Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0))
                    'et on met Ctr à "True"
                    Ctr = True
                End If
            Next C
            'si Ctr est à False, c'est qu'on n'a pas trouvé de matériel pour le client
            If Ctr = False Then MsgBox " pas de machine chez ce client"
        End With
    End Sub

  5. #5
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Nmarque.AddItem _
                    Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0))
    C correspond aux cellules de la colonne C de la feuille "table equipement adresse". C.Offset(,-1) correspond à la colonne B, c'est à dire à l'equipment ID. Avec les fonctions INDEX et EQUIV, on recherche dans la colonne C de la feuille "table equipement actif" et on ajoute la valeur au combobox.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Merci pour les commentaires!

    Cependant j'obtiens toujours une erreur "le type ne correspond pas" sur quelques uns de mes clients..
    Cf. ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.Nmarque.AddItem _
                    Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0))
    De quoi sa peut provenir?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    A priori, la fonction Match ne doit pas trouver d'équivalence. Cela concerne quels clients ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Je ne les a pas tous essayés parce qu'il y'en a plus de milles , mais à priori pour ceux que j'ai essayé , il y a :
    STEINER BRONZAVIA
    001
    toto

    Lorsque je les sélectionne j'obtiens cette erreur : le type ne correspond pas.

    ps: il ne s'agissait pas du fichier que j'ai mis en pièce jointe mais tout est disposé de la même manière. Sinon sur le fichier en pièce jointe tout marche parfaitement même le client STEINER BRONZAVIA qui s'y trouve aussi

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Vérifie qu'il y a bien correspondance entre AdresseID et EquipmentID sur la feuille "table equipement adresse" et entre equipmentID et equipment name sur la feuille "table equipement actif". Sinon, mets en pièce jointe un classeur avec les éléments d'un client en erreur.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Re ,

    Je viens de trouver le problème mais je n'arrive pas à le résoudre.

    En effet pour chacun des clients où j'obtiens cette erreur , il y a bien "l'adresse id" ainsi que "l'equipement id" dans la table Equipement Adresse par contre il n'y a pas d'equipement id correspondant dans la table equipement actif donc il ne trouve rien étant donnée que rien n'est assignée à cette equipement id.

    Je pense qu'il faudrait créer une condition qui vérifie s'il n'y pas l'equipement id dans la table equipement actif de ne pas afficher cette erreur et d'ouvrir une MsgBox qui dirait "L'equipement id n'a pas était retrouvé dans la table equipement actif" ou une phrase dans le même style.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    La nouvelle macro devrait corriger le problème :

    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
    Private Sub NcRecherche_Change()
        Dim AdresseID As Integer, EquipmentID As Integer, C As Range, Ctr As Boolean
        'Recherche de l'"Adresse ID correspondant au nom de la première combobox
        With Sheets("table adresse")
            'les fonctions Index et Match correspondent aux fonctions INDEX et EQUIV
            AdresseID = Application.Index(.[A:A], Application.Match(Me.NcRecherche.Value, .[B:B], 0))
        End With
        'remplissage de la combobox Nmarque
        With Sheets("table equipement adresse")
            'effacement des éléments de la combobox Nmarque
            Me.Nmarque.Clear
            'boucle sur les cellules de la colonne C de laa feuille "table equipement adresse"
            For Each C In .Range(.[C2], .Cells(.Rows.Count, 3).End(xlUp))
                'si on trouve correspondance avec l'AdresseID
                If C.Value = AdresseID Then
                    'on ajoute au combobox l'élément de la colonne C correspondant à l'equipment ID
                    'à l'aide des fonctions INDEX et EQUIV
                    'test
                    If IsNumeric(Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0)) Then
                        Me.Nmarque.AddItem _
                        Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                            ['table equipement actif'!A:A], 0))
                        'et on met Ctr à "True"
                        Ctr = True
                    End If
                End If
            Next C
            'si Ctr est à False, c'est qu'on n'a pas trouvé de matériel pour le client
            If Ctr = False Then MsgBox " pas de machine chez ce client"
        End With
    End Sub

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Yes! Merci Daniel sa marche

    Seriez vous comment faire pour activer la cellule de la marque sélectionné (qui se trouve dans la table equipement actif en colonne C) ensuite faire un décalage de cellule et récupérer la valeur qui se trouve en colonne A et enfin enregistrer cette valeur dans une variable.

    Pour le décalage je sais comment faire mais je bloque sur l'activation de la cellule pour la marque sélectionné.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Ajoute la macro suivante dans la module de l'userform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Nmarque_Change()
        Dim Ligne, Var As String
        Sheets("table equipement actif").Select
        Ligne = Application.Match(Me.Nmarque.Value, ['table equipement actif'!C:C], 0)
        Cells(Ligne, 3).Select
        Var = Cells(Ligne, 1).Value
    End Sub
    La variable s'appelle "Var". Si tu veux l'utiliser ailleurs, définis-la plutôt dans un module standard en tant que variable publique :


  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Re,

    Cela fonctionne mais lorsque j'utilise la touche "précédent" de la page "equipement" qui me permet de revenir à la page une du multipage j'obtiens une erreur "incompatibilité du type" sur la ligne suivante :


  15. #15
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Il n'y a pas de code associé au bouton ? poste ce que tu as codé.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Si!

    J'ai codé ceci sur la touche "précédent" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CommandButton9_Click()
     
    MP1.Value = 0
    NcRecherche = ""
    Nmarque = ""
     
    End Sub

  17. #17
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bon, mais ne modifie pas ton code tous les 36... Voici les macros à changer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton9_Click()
        Me.MP1.Value = 0
        NcRecherche.ListIndex = -1
        Nmarque.ListIndex = -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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private Sub NcRecherche_Change()
        Dim AdresseID As Integer, EquipmentID As Integer, C As Range, Ctr As Boolean
        'Recherche de l'"Adresse ID correspondant au nom de la première combobox
        If Me.NcRecherche.ListIndex = -1 Then Exit Sub
        With Sheets("table adresse")
            'les fonctions Index et Match correspondent aux fonctions INDEX et EQUIV
            AdresseID = Application.Index(.[A:A], Application.Match(Me.NcRecherche.Value, .[B:B], 0))
        End With
        'remplissage de la combobox Nmarque
        With Sheets("table equipement adresse")
            'effacement des éléments de la combobox Nmarque
            Me.Nmarque.Clear
            'boucle sur les cellules de la colonne C de laa feuille "table equipement adresse"
            For Each C In .Range(.[C2], .Cells(.Rows.Count, 3).End(xlUp))
                'si on trouve correspondance avec l'AdresseID
                If C.Value = AdresseID Then
                    'on ajoute au combobox l'élément de la colonne C correspondant à l'equipment ID
                    'à l'aide des fonctions INDEX et EQUIV
                    'test
                    If IsNumeric(Application.Match(C.Offset(, -1).Value, _
                        ['table equipement actif'!A:A], 0)) Then
                        Me.Nmarque.AddItem _
                        Application.Index(['table equipement actif'!C:C], Application.Match(C.Offset(, -1).Value, _
                            ['table equipement actif'!A:A], 0))
                        'et on met Ctr à "True"
                        Ctr = True
                    End If
                End If
            Next C
            'si Ctr est à False, c'est qu'on n'a pas trouvé de matériel pour le client
            If Ctr = False Then MsgBox " pas de machine chez ce client"
        End With
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Nmarque_Change()
        Dim Ligne, Var As String
        If Nmarque.ListIndex = -1 Then Exit Sub
        Sheets("table equipement actif").Select
        Ligne = Application.Match(Me.Nmarque.Value, ['table equipement actif'!C:C], 0)
        Cells(Ligne, 3).Select
        Var = Cells(Ligne, 1).Value
    End Sub

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 61
    Points : 18
    Points
    18
    Par défaut
    Bonjour ,

    Merci !

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/06/2014, 16h17
  2. [SP-2010] Ajouter plusieurs lignes dans une liste via un WorkFlow.
    Par Jonathan.F dans le forum SharePoint
    Réponses: 2
    Dernier message: 19/03/2014, 11h31
  3. Réponses: 6
    Dernier message: 13/01/2014, 14h53
  4. [XL-2010] Trouver la chaine de caractères la plus longue dans une selection
    Par skaz26 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/05/2013, 15h55
  5. Difficulté d'affichage dans une comboBox via une requête
    Par moilou2 dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/07/2008, 10h44

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