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 :

[E-03] Récuperer des données en fonction des codes dans plusieurs colonnes


Sujet :

Macros et VBA Excel

  1. #1
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut [E-03] Récuperer des données en fonction des codes dans plusieurs colonnes
    Bonjour, j'ai déja régler mon problème pour aller chercher des données dans une colonne en fonction d'un code placé dans la une autre colonne à coté de celle où sont placées les données.

    Je récupere les données dans une combobox. Le code était le suivant:

    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
    Private Sub MaTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
      Dim bon As Boolean
      Dim DerniereLigne As Integer
      Dim PremiereLigne As Integer
     
      If Me.MaTextBox.Text = "" Then
      Exit Sub
      End If
     
      Sheets("Données").Visible = True
     
      Me.MaComboBox.Clear
      DerniereLigne = Worksheets("MaFeuilleDeDonnées").Range("B2").End(xlDown).Row
      PremiereLigne = Worksheets("MaFeuilleDeDonnées").Range("B2").Row
     
      For i = PremiereLigne To DerniereLigne
        If Sheets("MaFeuilleDeDonnées").Cells(i, 2) = MaTextBox.Text Then
          MaComboBox.AddItem Sheets("MaFeuilleDeDonnées").Cells(i, 3)
          bon = True
        End If
      Next
      If Not bon Then
          MsgBox "La valeur saisie est incorrecte pour ce champ"
          Exit Sub
      Else
          MaComboBox.ListIndex = 0
      End If
     
    End Sub
    Ce code me permettait donc en fonction du code tapé dans "MaTextBox" de d'afficher automatiquement dans "MaComboBox" le champ qui allé bien en fonction du code tapé.

    Tout sa fonctionne trsè bien.

    Maintanant je voudrais savoir comment faire la même chose en tappant toujours un code mais que sa aille chercher dans plusieurs colonnes en même temps et non pas seulement dans une seule colonne.

    Est possible, que faut-il changer au niveau de ma boucle? Est ce que je peut mettre des clauses "Or" dans ma boucle?

    Merci

  2. #2
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Bonjour,

    Regarde l'aide pour OFFSET.

    Je ne sais pas si j'ai bien compris ta question mais je pense que ça peut t'aider.

  3. #3
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Non je ne pense pas que se soit sa, mais ce n'est pas évident à expliquer. Je vous fait une petite pièce jointe de suite pour mieu comprendre.

    Cordialement

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Facile: tu imbriques tout dans une grande boucle, qui commence avant la recherche de ta première et de ta dernière ligne.

    Après, il se peut que tu souhaites que ta combobox soit organisée en colonnes, et là vu que AddItem marche en lignes tu devras tout stocker dans un tableau avant de charger ta combobox.

  5. #5
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Non mais ma comboBox ne doit abriter qu'une donnée pas plusieurs, mais au niveau de mon choix dans ma feuille de données j'ai plusieurs choix de colonne.

    Je vous met une explication en pièce jointe. Je crois que cela sera plus simple pour tout le monde.
    Fichiers attachés Fichiers attachés

  6. #6
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Bon ba je vous ai remis sa sous forme d'images.
    Images attachées Images attachées      

  7. #7
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Et la conclusion
    Images attachées Images attachées  

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Si tu veux sélectionner dans ta combobox machine à partir d'un code de cellule, rien de plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Combobox3.Value=Range(Textbox3.Value).Value
    Ainsi, si tu as B1 dans ta Textbox, ça fera Range("B1").Value, ce qui fait que le nom de machine inscrit en B1 sera sélectionné dans ta combobox.


    Sinon, un grand bravo et un grand merci d'avoir pris le temps d'expliquer ton problème de façon aussi claire!
    Ce n'est pas tout le monde qui le fait, loin de là.

    PS: encore une fois (tes explications confirment la solution que je te proposais), pour le remplissage de ta combobox, une boucle imbriquant le code que tu as déjà en faisant varier le chiffre de colonne et en faisant aussi une recherche de la dernière colonne est la meilleure solution.

  9. #9
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Je suis d'accord avec toi mais je ne peut pas lui dire de chercher dans toutes les colonnes de ma feuille parce que j'ai certains code identiques dans plusieurs colonnes.

    En revanche ce que je suis intéressé de savoir, c'est comment par exemple lui indiquer dans ma boucle de chercher dans les colonnes H, J, L, N, P, R

    Sachant que pour chacune de ces colonnes, le code qui les pilotes est une colonne avant, donc en colonne G, I, K, M, O, Q.

    En fait il faut que je fasse comme j'ai fait actuelement avec ce 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
    Private Sub MaTextBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
      Dim bon As Boolean
      Dim DerniereLigne As Integer
      Dim PremiereLigne As Integer
     
      If Me.MaTextBox.Text = "" Then
      Exit Sub
      End If
     
      Sheets("Données").Visible = True
     
      Me.MaComboBox.Clear
      DerniereLigne = Worksheets("MaFeuilleDeDonnées").Range("B2").End(xlDown).Row
      PremiereLigne = Worksheets("MaFeuilleDeDonnées").Range("B2").Row
     
      For i = PremiereLigne To DerniereLigne
        If Sheets("MaFeuilleDeDonnées").Cells(i, 2) = MaTextBox.Text Then
          MaComboBox.AddItem Sheets("MaFeuilleDeDonnées").Cells(i, 3)
          bon = True
        End If
      Next
      If Not bon Then
          MsgBox "La valeur saisie est incorrecte pour ce champ"
          Exit Sub
      Else
          MaComboBox.ListIndex = 0
      End If
     
    End SubCe code me permettait donc en fonction du code tapé dans
    Mais au lieu que sa teste juste dans les colonnes 2 et 3, il faut que sa teste dans les colonnes "7 et 8" ou "9 et 10"....

    Je ne vois pas si tu vois ce que je veux dire?

  10. #10
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Mais si que c'est possible..... et il me semble que tu pourrais y arriver seul(e).

    il manque juste une boucle for interne à celle qui existe avec comme index (idx) une variable allant de 7 (G) à 12 (Q) que tu utilise avec Cells à la place de 2 (cells(i, idx) et que tu utilises avec + 1 pour le additem (cells(i, idx +1)

    Par contre ta demande est un peu confuse.
    Il faut chercher dans les autres colonnes sur base de la colonne suivante, mais tu ne dis pas si ton "bon" dépend de l'ensemble du résultat (bon partout) ou d'un seul résultat fructueux.

    Allez ouste. Maintenant tu n'as plus qu'à faire ce que je viens de te dire.
    C'est la méthode : un seul bon fait le succès.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  11. #11
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    re:

    Par contre ta demande est un peu confuse.
    Il faut chercher dans les autres colonnes sur base de la colonne suivante, mais tu ne dis pas si ton "bon" dépend de l'ensemble du résultat (bon partout) ou d'un seul résultat fructueux.
    C'est pas évident à expliquer. Veux tu une nouvelle exmplication avec des images? ou tu ne comprend pas sur un point en particulier?

    Tu as compris le système, comment tout cela fonctionne?

  12. #12
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Re,

    je crois juste que tu dois lire ma précédente réponse et qu'avec elle tu peux modifier le code en conséquence dans la mesure ou si on a trouvé quelquechose dans une colonne c'est considéré comme bon.

    Essaie. Je t'ai donné la solution.... à 90%.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  13. #13
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    il manque juste une boucle for interne à celle qui existe avec comme index (idx) une variable allant de 7 (G) à 12 (Q) que tu utilise avec Cells à la place de 2 (cells(i, idx) et que tu utilises avec + 1 pour le additem (cells(i, idx +1)
    Tu veux que je reprenne ce conseil?

    Je te le dis clairement je ne comprend pas tout...

    Je te rappel que je suis débutant

    Bon on va quand même essayé. Disons que l'on part du code suivant:

    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
    Private Sub txtChamp3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
      Dim bon As Boolean
      Dim DerniereLigne As Integer
      Dim PremiereLigne As Integer
      Dim Lettre As String
     
      If Me.txtChamp3.Text = "" Then
      Me.Machine.Clear
      Me.Ligne = ""
      Label22.Caption = " " & TypeDinter.Value & " " & Nature.Value & " " & "" & SousEnsemble.Value & " " & Element.Value & " " & Diagnostic.Value
      Exit Sub
      End If
     
      Sheets("Données").Visible = True
     
      Me.Machine.Clear
      Me.Ligne = ""
      DerniereLigne = Worksheets("Données").Range("h2").End(xlDown).Row
      PremiereLigne = Worksheets("Données").Range("h2").Row
     
      For i = PremiereLigne To DerniereLigne
        If Sheets("Données").Cells(i, 7) = txtChamp3.Text Then
          Machine.AddItem Sheets("Données").Cells(i, 8)
          bon = True
        End If
      Next
      If Not bon Then
          MsgBox "La valeur saisie est incorrecte pour ce champ"
          Exit Sub
      Else
          Machine.ListIndex = 0
     
          Lettre = Left(Me.txtChamp3.Value, 1)
     
          If Lettre = "A" Then
          Me.Ligne = "PAM1"
          End If
     
          If Lettre = "B" Then
          Me.Ligne = "PAM2"
          End If
     
          If Lettre = "C" Then
          Me.Ligne = "Sucre Cuit"
          End If
     
          If Lettre = "D" Then
          Me.Ligne = "Caramel"
          End If
     
          If Lettre = "E" Then
          Me.Ligne = "Conditionnement"
          End If
     
          If Lettre = "F" Then
          Me.Ligne = "Général Usine"
          End If
     
      End If
     
      Affichage
     
    End Sub
    On est d'accord, pour le moment dans ce code, on vient tester la colonne G, en fonction du code tapé dans la textBox 3. Si le code qui a été tapé dans la textox3 est trouvé dans la colonne G, alors j'affiche dans ma comboBox "Machine" l'équivalent de ce code placé dans dans la colonne H.

    Le soucis pour les machines, c'est que dans ma feuille de données les données sont placées dela manière suivante.

    Colonne G Colonne H Colonne I ColonneJ
    Code A1 Machine A1 Code B1 Machine B1
    Code A2 Machine A2 Code B2 Machine B2
    Code A3 Machine A3 Code B3 Machine B3

    Il faut donc que dans ma boucle, sa ne vienne pas juste tester la colone G et afficher les données de la colle H si le code taper dans la textBox3 est trouvé dans la colonne H.

    C'est possible en fait que dans ma textBox3 je vienne inscrire un code allant de la lettre A à la lettre E. Sachant qu'il y a une colonne par lettre.

    Donc dans la boucle, il faut que sa teste dans la première colonne, si sa trouve le code, sa s'arrette et sa incrit l'équivalent dans la combobox,sinon on passe a la seconde et etc.... si après avoir testé les 6 colonnes, aucun code ne correspond à celui tapé dans la textBox,alors laon affiche le message

    "La valeur saisie est incorrecte pour ce champ".

    J'espere qhe je suis clair? Mais c'est pas évident...

  14. #14
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Bonjour,

    Tu peux utiliser Elseif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      For i = PremiereLigne To DerniereLigne
        If Sheets("Données").Cells(i, 7) = txtChamp3.Text Then
          Machine.AddItem Sheets("Données").Cells(i, 8)
          bon = True
        Elseif Sheets("Données").Cells(i, 9) = txtChamp3.Text Then
          Machine.AddItem Sheets("Données").Cells(i, 10)
          bon = True
        End If
      Next
    Tu peux mettre autant de elseif que tu veux.

    Toutefois, attention car si le 1er IF est vérifié, vba ne passe pas dans le elseif.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Citation Envoyé par moilou2 Voir le message
    En revanche ce que je suis intéressé de savoir, c'est comment par exemple lui indiquer dans ma boucle de chercher dans les colonnes H, J, L, N, P, R
    Je serais toi je mettrais la boucle qui parcourt les lignes dans la boucle qui parcourt les colonnes, et non l'inverse.
    Bref, un peu dans ce style (en supposant qu'il ne te faille qu'un seul résultat de bon):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        For colonne_test = 7 To 17 Step 2
            For i = PremiereLigne To DerniereLigne
                If Sheets("Données").Cells(i, colonne_test) = txtChamp3.Text Then
                    Machine.AddItem Sheets("Données").Cells(i, colonne_test + 1)
                    bon = True
                    Exit For
                    Exit For
                End If
            Next
        Next
        ' Te donne le numéro de colonne associé au résultat entre A et E
        numero_colonne = (colonne_test - 5)\2
    Désolé Vave, mais ta solution tient du débutant: quand on écrit du code répétitif, c'est qu'on n'emploie pas la bonne méthode.

    @moilou2:
    J'espère que le peu de code que je viens de te donner correspond à tes attentes, car là j'ai peur de ne pas avoir compris ce que tu demande.

  16. #16
    Débutant
    Inscrit en
    Décembre 2007
    Messages
    1 235
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 1 235
    Points : 269
    Points
    269
    Par défaut
    Merci c'est exactement ce que je voulais

  17. #17
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Désolé Vave, mais ta solution tient du débutant: quand on écrit du code répétitif, c'est qu'on n'emploie pas la bonne méthode.
    Ouais, t'as raison. Je croyais qu'il n'y avait que 2 colonnes à vérifier.
    Mais je ne le prend pas mal, car débutant, c'est ce que je suis.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    752
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 752
    Points : 832
    Points
    832
    Par défaut
    Ne t'inquiètes pas: c'est à force d'essayer d'aider les autres qu'on apprend le plus et qui nous permet d'aider encore mieux.

    De toute façon, au bout d'un moment, même quand on sait pas faire, on sait faire quand même.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/06/2014, 22h37
  2. Réponses: 2
    Dernier message: 06/06/2010, 15h15
  3. Rechercher des données en fonction des variables d'un tableau
    Par BOU59000 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/07/2009, 13h43
  4. Afficher des valeurs en fonction des données d'un champ
    Par Tchouk01 dans le forum VBA Access
    Réponses: 0
    Dernier message: 02/04/2008, 14h24
  5. Réponses: 6
    Dernier message: 16/10/2007, 20h07

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