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 :

Rechercher des données en fonction des variables d'un tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut Rechercher des données en fonction des variables d'un tableau
    Bonjour,

    En parallèle à un autre projet...
    J'ai créé un tableau qui me permet d'avoir des informations dans des variables:
    Ex:
    Banane dans MaListe(1)
    Sucre dans MaListe (2)...

    Ce tableau étant fait, mon but est de créer une macro qui dirait:
    Pour toutes les feuilles commençant par XXX,
    Passer en revue la colonne A
    Si dans une cellule de cette colonne A, il y a une valeur qui est la même qui MaListe(1)
    Alors copié l'info et coller la dans une autre feuille
    ....

    Mon code se présente sous cette forme la:
    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
    Sub Liste()
     
    Dim MaListe(40) As String
    Dim Cel As Range
    Dim Cel2 As Range
    Dim Counter As Integer
    Dim Compteur As Integer
    Dim ws As Worksheet
     
     
     
    Set Cel = Worksheets("Feuil4").Range("A1")
    Compteur = 1
     
    While Cel.Offset(Compteur) <> ""
    Compteur = Compteur + 1
    Wend
     
    For i = 1 To Compteur
        MaListe(i) = Cel.Offset(i - 1)
    Next i
     
    Set Cel2 = Range("A6")
    Counter = 1
     
    For Each ws In Worksheets
        If Left(ws.Name, 3) = "GEO" Then
            While Cel2.Offset(Counter) <> ""
                If Cel2.Offset(Counter) = MaListe(1) Then
                Worksheets("Feuil5").Range("A65535").End("XlUp").Row = Cel2.Offset(Counter)
                End If
            Counter = Counter + 1
            Wend
     
        End If
     
    Next ws
     
    End Sub
    Le code ne fonctionne pas, le problème se situe au niveau de MaListe(1). Je pense que le programme ne doit pas ce que contient MaListe(1). Si MaListe(1) contient banane, le programme ne recherche pas banane.

    y a t il un ligne de code qui permet cela?
    (Ou alors le problème vient il d'autres part?)

  2. #2
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    cels2 c'est la cellule A2 de longlet actif au moment du
    Tu aura beau faire des boucle sur les onglet ca ne servira a rien

    Tu peux utiliser offset mais a mon avis c'est un peu,.... pas pratique
    utilise plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    For Each ws In Worksheets
    derniereligne=ws.Range("A65535").End("XlUp").Row
        If Left(ws.Name, 3) = "GEO" Then
            for i=1 to derniereligne
                 if ws.cells(i,1)= = MaListe(1) Then
                Worksheets("Feuil5").Range("A65535").End("XlUp").Row = Cel2.Offset(Counter)
                End If
            next i
        End If
    Next ws
     
    End Sub
    Encore mieu c'est la fonction find
    sinon tu peux garder ton cels2
    en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cel2 = ws.Range("A6")
    Au passage tu devrais réinitialisé ton counter dans ta boucle car si le premier onglet fini ligne 50 tu teste le deuxième a partir de la ligne 51 et c'a c'est un peu balot
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    J'ai essayé ws.propriété mais le debogage prends le relai des qu'il lit cela..

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    heu je dirais que c'est normal propriété n'existe pas, tape ws. et normalement si ws est bien déclaré tu aura la liste de ce que tu peux mettre a la suite.
    Qu'est ce que tu voulais faire en faisant ce code?
    As-tu essayé le code que je t'ai donnée?
    As-tu compris le problème de ton set?

    Trois question j'attends trois réponses pour poursuivre la discution
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  5. #5
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Re,

    Non en fait je disais ws.propriété car pour moi propriété c'est range. ws étant l'objet. La propriété de mon objet, la plage de cellule de ma feuille (ws). Mais rassures toi je n'ai pas écris .propriété dans mon code

    Oui j'ai essayé le code que tu m'a écris et le problème arrive au niveau de ws.range. si j'enlève ws le debogage ne se lance plus (mais le code ne fonctionne pas pour autant lol)

    Pour mon set non je ne vois pas trop. Car mon code se lance sur la page active, donc si je mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Cel2 = ws.range ou Set Cel2 = range
    sa devrait revenir au même, non?
    PS: j'ai quand même suivi ton conseil et j'ai rajouté cel2 = ws.range("A6") mais le programme s'arrête net dès qu'il arrive sur ws.range

    EDIT: oui je viens aussi d'y penser
    J'ai enlever un égal a un moment donné dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                 if ws.cells(i,1)= = MaListe(1) Then
    Je n'en n'ai laissé qu'un seul (le programme n'accepte pas non plus les 2 =, mais je ne pense pas que ce soit sa qui fasse stopper le programme)

  6. #6
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Le problème de set
    tu défini cel2 c'est la cellule A6 de la feuille active AU MOMENT ou le programme lit la ligne.
    Ensuite tu change la feuille active mais cel2 lui tu ne le change pas du coup c'est toujours le meme comme tu utilise un décalage a parti de cel2 tu teste toujours les meme cellules

    Il y avai un problème dans mon programme javais concervé un cel2.offset (tu aurais pu le modifier )
    Pour le double = c'est une coquille
    Et un petit souci sur la dernière ligne, enfin je viens de tester ce code il semble bon (par contre je ne comprend pas l'intéret de copier juste la valeur de la cellule qui contient maliste(1) enfin j'ai pas trop compris ce que tu voulais faire du coup je copie la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim i As Long, DerniereLigne As Long
    Dim ws As Worksheet
    Dim MaListe(1 To 40) As String
    For Each ws In Worksheets
    MaListe(1) = "bob"
    DerniereLigne = ws.Range("A65536").End(xlUp).Row
        If Left(ws.Name, 3) = "GEO" Then
            For i = 1 To DerniereLigne
                 If ws.Cells(i, 1) = MaListe(1) Then
                   ws.Cells(i, 1).EntireRow.Copy Worksheets("Feuil5").Cells(Worksheets("Feuil5").Range("A65536").End(xlUp).Row + 1, 1)
                End If
            Next i
        End If
    Next ws
    Regarde si ca te va, si non explique pourquoi
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  7. #7
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Le code fonctionne super bien
    J'ai rajouté une boucle pour prendre en compte mes variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    For j = 1 To 40
    For Each ws In Worksheets
     
    DerniereLigne = ws.Range("A65536").End(xlUp).Row
        If Left(ws.Name, 3) = "GEO" Then
                For I = 1 To DerniereLigne
                   If ws.Cells(I, 1) = MaListe(j) Then
                   ws.Cells(I, 1).EntireRow.Copy Worksheets("Feuil5").Cells(Worksheets("Feuil5").Range("A65536").End(xlUp).Row + 1, 1)
                End If
            Next I
        End If
    Next ws
    Next j
    Comme cela je prends mes variables (boucle j de 1 à 40).
    Bref je n'ai pas fait grand chose, sans ton code je n'y serais jamais arrivé

    Encore un grand merci

    PS: petite question pour améliorer ma culture du vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ws.Cells(i, 1).EntireRow.Copy Worksheets("Feuil5").Cells(Worksheets("Feuil5").Range("A65536").End(xlUp).Row + 1, 1)
    Derrière .Row +1,1 servent à annoncer quoi?

  8. #8
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil5").Cells(Worksheets("Feuil5").Range("A65536").End(xlUp).Row + 1, 1)
    En fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil5").Range("A65536").End(xlUp).Row
    renvoi un nombre qui corespond au numéro de la dernière ligne utilisé colonne a de la feuille 5, j'ajoute 1 pour être dans la première ligne vide et je suis colonne 1 d'ou le ,1 car
    corespond a la cellule ligne i colonne j
    i c'est la dernière ligne +1 et j la première colonne

    J'aurais pu mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    derniereligne=Worksheets("Feuil5").Range("A65536").End(xlUp).Row
     ws.Cells(I, 1).EntireRow.Copy Worksheets("Feuil5").Cells(derniereligne+1,1)
    « Il n'y a pas de recette miracle qui permet aux gens d’écrire des programmes corrects sans avoir à réfléchir. Il faut apprendre aux gens comment réfléchir »

  9. #9
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2008
    Messages : 195
    Points : 82
    Points
    82
    Par défaut
    Je te remercie pour tes réponses toujours très claire.

    Et encore une fois merci pour ton aide! (je vais devoir prendre un abonnement je pense! lol)


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/06/2010, 15h15
  2. Attribuer des droits en fonction des données
    Par Higgins dans le forum Administration
    Réponses: 3
    Dernier message: 28/05/2010, 15h44
  3. Réponses: 17
    Dernier message: 01/12/2008, 10h52
  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