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 :

Transformer et adapter INDEX/EQUIV en boucle vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 69
    Par défaut Transformer et adapter INDEX/EQUIV en boucle vba
    Bonjour,

    sur ma feuille 1, j'ai ma colonne D avec des infos et une colonne E avec des équipements (non classés et avec redondance...)

    sur ma feuille 5, j'ai une colonne F qui reprend les équipements de la feuille 1, colonne E et les classes par nombre et ayant auparavant effacer les doublons.

    sur ma feuille 5, en colonne I, j'ai mis en place cette formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =INDEX('Feuille_1'!D:D; EQUIV(F2;'Feuille_1'E:E!;0))
    ça fonctionne et ça me retourne bien l'info de la première infos trouvée en feuille 1 et correspondant à la cellule F de la feuille 5 (mais pas les suivantes...)

    Je voudrais boucler cette formule en vba pour qu'elle me liste les une au dessous des autres les infos, qu'elle passe une ligne une fois que le mot recherché n'a plus de nouvelles infos et qu'elle continue ainsi de suite jusqu'à la fin de la colonne F...

    J'espère que c'est clair car même moi, je trouve ça un peu compliqué à écrire ^^

    D'avance merci

    Akhlan

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    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 208
    Par défaut
    Bonjour,

    Je ne comprends pas ce bout de phrase :

    et les classes par nombre
    sinon, oui, c'est possible.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 69
    Par défaut
    Merci Daniel.C,

    sur la feuille 2, en colonne G, j'ai cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NB.SI('Feuille_1'!E:E;F2)
    ce qui me permet de classer la colonne F par nombre d’occurrence en jouant entre ces deux colonnes F et G

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Tu peux commencer avec ce code qui te permettra de trouver les informations associées aux équipements listés en feuille 5 (notée Feuille_5 dans le code, à adapter si nécessaire).
    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
    Sub Rechercher()
    Dim Plage As Range, Cel As Range, C As Range
    Dim LigneAjout As Long
    Dim firstAddress As String
        Application.ScreenUpdating = False
        With Worksheets("Feuille_5")
            Set Plage = .Range("F2:F" & .Range("F" & Rows.Count).End(xlUp).Row)
            For Each Cel In Plage
                Set C = Worksheets("Feuille_1").Columns(5).Find(Cel, LookIn:=xlValues, lookat:=xlPart)
                If Not C Is Nothing Then
                    firstAddress = C.Address
                    Do
                        LigneAjout = .Range("I" & Rows.Count).End(xlUp).Row + 1
                        .Range("I" & LigneAjout).Value = C.Offset(0, -1)
                        Set C = Worksheets("Feuille_1").Columns(5).FindNext(C)
                    Loop While Not C Is Nothing And C.Address <> firstAddress
                End If
            Next Cel
        End With
        Application.ScreenUpdating = True
        Set Plage = Nothing: Set Cel = Nothing: Set C = Nothing
    End Sub
    Cordialement.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 69
    Par défaut
    Félicitation gFZT82, c'est un très bon premier jet

    J'ai cependant une erreur à la fin du déroulement de la macro

    Erreur d'exécution '13':
    Incompatibilité de type
    ma colonne (Feuille 1 / D) et ma colonne (Feuille 5 /J) sont de type Texte

    Pour info, certaines cellules de la colonne (Feuille 1 / D) commencent par ====

    Comme tu l'as peut-être remarqué, j'ai changé la colonne (Feuille 5 /I) par (Feuille 5 /J) car je voudrais que qu'en I, la valeur C de ta macro apparraisse à la première occurence trouvée (seulement une fois)

    A voir plus tard si besoin... Je voudrai également que par "boucle C", si les informations issue de (Feuille 1 / D) sont identiques, qu'elles n'apparaissent qu'une fois mais qu'une cellule à droite d'elle (Feuille 5 / K) indique le nombre d'occurence (1 sera it aussi affiché si l'occurence est unique)

    D'avance merci

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 69
    Par défaut
    j'ai avancé...

    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
    Sub Rechercher()
    Dim Plage As Range, Cel As Range, C As Range
    Dim LigneAjout As Long
    Dim firstAddress As String
       Application.ScreenUpdating = False
       With Worksheets("Stats")
        Set Plage = .Range("F2:F" & .Range("F" & Rows.Count).End(xlUp).Row)
           For Each Cel In Plage
               Set C = Worksheets("Incidents mensuels").Columns(5).Find(Cel, LookIn:=xlValues, lookat:=xlPart)
               If Not C Is Nothing Then
                   firstAddress = C.Address
                   If LigneAjout = "0" Then LigneAjout = "1" '------------------------------------------------------------------
                   Range("I" & LigneAjout + 1).Value = C '----------------------------------------------------------------------
                   Do
                       LigneAjout = .Range("J" & Rows.Count).End(xlUp).Row + 1
                       .Range("J" & LigneAjout).Value = C.Offset(0, -1)
                       Set C = Worksheets("Incidents mensuels").Columns(5).FindNext(C)
                   Loop While Not C Is Nothing And C.Address <> firstAddress
                   LigneAjout = LigneAjout + 1 '--------------------------------------------------------------------------------
               End If
           Next Cel
       End With
       Application.ScreenUpdating = True
       Set Plage = Nothing: Set Cel = Nothing: Set C = Nothing
    End Sub
    les lignes que j'ai ajoutées place bien la valeur de C à la bonne place en I mais par contre, vu que LigneAjout est calculé dans la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                       LigneAjout = .Range("J" & Rows.Count).End(xlUp).Row + 1
    Je n'arrive pas à insérer une ligne vide dans cette colonne :-(

    PS : J'ai compris d'ou venait mon message d'erreur, une des colonnes ou les données étaient prises contenait des valeurs #REF, du coup, en faisant une mise à jour "propre" de cette colonne avant de lancer la macro, plus de soucis...

    PS2: Par contre c'est super super long, on est proche des 3 minutes pour lister 1521 lignes et mon fichier final mensuel contient environ 5000-6000 lignes :-(

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

Discussions similaires

  1. [XL-2007] Fonction INDEX + EQUIV sous VBA
    Par ti_mouton dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 15/07/2015, 09h18
  2. Réponses: 7
    Dernier message: 11/08/2012, 17h49
  3. probleme index+equiv en vba
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/05/2012, 17h38
  4. Index - Equiv en VBA
    Par JudRos dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2011, 08h53
  5. séléction d'un ligne excel et boucle [vba]
    Par lou87 dans le forum Access
    Réponses: 2
    Dernier message: 06/06/2006, 11h00

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