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 :

Recherche si valeur dans une liste [XL-2007]


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
    Intégrateur Web
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut Recherche si valeur dans une liste
    Bonjour,

    Je vais tenter de vous expliquer ce que je cherche à faire, mais j'ai l'impression de me perdre en me compliquant la vie en vain...

    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
     
    'A partir de la ligne 2 de mon tableau, je boucle pour tester toutes les lignes (longueur variable du tableau)
    FOR n=2 to Fin du tableau Step 1
     
      IF sur ma feuille "1", ma colonne AJ contient un ID THEN
     
        'Je veux savoir si cet ID existe dans la colonne A de ma feuille "2".
        'Si c'est le cas, je récupère dans la feuille "2" la valeur de la colonne M sur cette ligne (où il a trouvé l'ID).
        '(En gros, si c'est le cas, on récupère le numéro de la ligne qu'on utilise pour cibler la cellule de la colonne M, non ?)
     
        'Ensuite je reporte cette valeur dans la range("Q"&n&"") de ma feuille "1"
     
      ELSE
        'Je colore la cellule Q sur la ligne n
        Range("Q"&n&"").Interior.ColorIndex = 46
     
      END IF
     
    NEXT
    Je ne sais pas si ça peut "aider", mais la valeur ID à "rechercher" est un entier. Je ne peux utiliser le "LIKE", c'est la valeur de la cellule qui compte.

    Je me perds entre les passages entre les feuilles, les colonnes et pour cibler correctement...
    Pouvez vous me donner des indications et des astuces ?

    Cdt,
    Ghuron

  2. #2
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Adapte et teste le code ci-dessous (je ne l'ai pas testé pour ma part) :
    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
     
    Sub Test()
     
        Dim Fe_1 As Worksheet
        Dim Fe_2 As Worksheet
        Dim Plage_1 As Range
        Dim Plage_2 As Range
        Dim Cel_1 As Range
        Dim Cel_2 As Range
     
        Set Fe_1 = Worksheets("Feuil1")
        Set Fe_2 = Worksheets("Feuil2")
     
        'défini sur la colonne A ligne 2 de la feuille "Feuil1"
        With Fe_1
     
            Set Plage_1 = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'défini sur la colonne A ligne 2 de la feuille "Feuil2"
        With Fe_2
     
            Set Plage_2 = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'boucle sur chaque cellule de la plage
        For Each Cel_1 In Plage_1
     
            'effectue la recherche
            Set Cel_2 = Plage_2.Find(Cel_1.Value, , xlValues, xlWhole)
     
            'si trouvé, récup de la valeur en colonne M de la feuille "Feuil1"
            'pour la mettre en colonne M de la feuille "Feuil2" sur la ligne
            'correspondante
            If Not Cel_2 Is Nothing Then
     
                Cel_2.Offset(, 12).Value = Cel_1.Offset(, 12).Value
     
            End If
     
        Next Cel_1
     
    End Sub
    Hervé.

  3. #3
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut
    Un très grand merci (le 1er) à toi ...

    J'ai cherché pendant 2 heures et j'ai tenté plusieurs macros glanées sur le net, sans comprendre la totalité de ces dernières.

    Là j'ai saisi la structure et le déroulement de la macro. Merci (le 2eme).
    Au début, je ne comprenais pas trop pourquoi cela ne faisait rien. Puis je l'ai adapté et j'ai "corrigé" les erreurs de ciblage sur les colonnes (AJ au lieu de A, et des offset différents).

    Je pose ici le résultat du remaniement de ta macro :

    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
     
    Sub maj_stock()
     
        Dim Fe_1 As Worksheet, Fe_2 As Worksheet
        Dim Plage_1 As Range, Plage_2 As Range
        Dim Cel_1 As Range, Cel_2 As Range
        Dim old_stock As Integer, new_stock As Integer
        Dim lign_maj As Integer, lign_manq As Integer
        Dim t As Single
     
        Set Fe_1 = Worksheets("MaJ_Stock")
        Set Fe_2 = Worksheets("Master")
     
        'initialise le timer
        t = Timer
     
        'défini sur la colonne A ligne 2 de la feuille "MaJ_Stock"
        With Fe_1
     
            Set Plage_1 = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'défini sur la colonne AJ ligne 2 de la feuille "Master"
        With Fe_2
     
            Set Plage_2 = .Range(.Cells(2, 36), .Cells(.Rows.Count, 1).End(xlUp))
     
        End With
     
        'boucle sur chaque cellule de la plage
        For Each Cel_1 In Plage_1
     
            'effectue la recherche
            Set Cel_2 = Plage_2.Find(Cel_1.Value, , xlValues, xlWhole)
     
            'si trouvé, récup de la valeur en colonne M de la feuille "Feuil1"
            'pour la mettre en colonne M de la feuille "Feuil2" sur la ligne
            'correspondante
            If Not Cel_2 Is Nothing Then
                'enregistre l ancienne valeur
                old_stock = Cel_2.Offset(, -19).Value
                'enregistre la nouvelle
                new_stock = Cel_1.Offset(, 12).Value
                Cel_2.Offset(, -19) = new_stock
                'affiche la date de maj
                Cel_2.Offset(, 1) = Date
                'calcule la variation de stock
                Cel_2.Offset(, 2) = (new_stock - old_stock)
                'incremente un compteur
                lign_maj = lign_maj + 1
            Else
                'colore la ligne manquante pour mieux la reperer
                Cel_1.EntireRow.Interior.ColorIndex = 46
                'incremente un compteur
                lign_manq = lign_manq + 1
            End If
     
        Next Cel_1
     
        'affiche moi le résultat de cette macro
        MsgBox ("Lignes mises à jour : " & lign_maj & vbCrLf & "Lignes manquantes : " & lign_manq & vbCrLf & "Temps de traitement : " & Timer - t & " s")
     
    End Sub
    Une seule question : c'est une programmation orientée objet là ? (Je suis intégrateur web à la base et je connais plutot le JS et PHP)

    PS: mon seul soucis c'est le temps nécessaire à l'éxécution de cette macro... Mon tableau (en perpetuelle évolution) fait déjà plus de 1500 lignes sur plus de 30 colonnes, cela ne doit pas l'aider. Néanmoins je pense que c'est surtout l'utilisation d'une boucle (FOR) de recherche (find) qui impacte à ce point le temps d'exécution.

    2069,566 s pour traiter tout le tableau :p
    Mais cela sera toujours mieux que moi passant des heures à mettre a jour ce tableau ligne par ligne...


    Merci Theze !

    Cordialement,
    Ghuron - autodidacte du VBA depuis 2 mois.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour,
    Tu pourrais gagner déjà pas mal de temps en rédigeant cette ligne en début de procédure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.screenupdating=False
    qui fige le défilement de l'écran

    D'autre part et pour te proposer une alternative peut-^tre + rapide
    avec la feuille de "plage2"
    dans quelle colonne se trouve l'identifiant ?
    cet identifiant est unique dans la colonne ?

  5. #5
    Membre averti
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Août 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 15
    Par défaut
    Hello,

    Oui. J'avais pensé à le rajouter le screenupdate : false mais je ne savais pas trop si cela améliorerait beaucoup le temps (étant un "noob" du vba excel).
    Je vais tester.

    De plus, voilà comment ça se passe pour le moment :
    • il prend la valeur dans la colonne A de la feuille 1
    • il va rechercher dans la colonne AJ de feuille 2 si il trouve cet identifiant unique
    • si c'est le cas : avec des offsets sur ces deux feuilles, il récupère et transfère les valeurs
      à la base, je ne souhaitais que viser la colonne M de la feuille 1 et transféré vers Q de la feuille 2, ... mais quitte à faire travailler l'ordinateur autant vérifier et transférer d'autres valeurs dans un futur proche
    • sinon : il me "surligne" la ligne dans la feuille 1
    • Puis il descend d'une ligne sur la feuille 1 en répétant ce schéma.



    J'ai voulu réaliser cette macro pour "faciliter" une partie de mon travail, et je ferai des tests Lundi. N'hésitez pas à poser des idées, je vous ferai les retours "test à l'appui"

    Ghuron

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    OK, merci pour les renseignements. Je te propose un truc beaucoup + rapide dès que je peux ce dimanche:
    vu la météo , je devrais avoir le temps !

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 13/09/2013, 14h20
  2. Réponses: 11
    Dernier message: 07/09/2010, 22h49
  3. Réponses: 2
    Dernier message: 22/04/2008, 16h21
  4. recherche de valeur dans une liste lag lead
    Par fatsora dans le forum Oracle
    Réponses: 1
    Dernier message: 31/01/2008, 08h28
  5. Ajouter un valeur dans une liste modifiable
    Par ancylia dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2005, 12h50

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