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 :

Boucle de recherche dans différentes plages [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Points : 65
    Points
    65
    Par défaut
    Bonjour à tous,

    Mon fichier contient plusieurs onglets :
    - Le Premier DPN est l'onglet où je souhaite faire apparaître les résultats (y est déjà présent le code de l'agent/ son métier)
    - Le deuxieme SG contient différents agents (code/nom/métier/Ainsi que toutes les stats qu'ils ont réalisé)
    - Le troisième NP contient les normes que les agents doivent réaliser

    J'effectue mon traitement si le nom de l'indicateur situé sur l'onglet DPN de D7 à CZ7 est retrouvé dans la plage B2 à AJ de l'onglet NP.

    Si il est retrouvé, j'effectue le traitement dans l'onglet DPN a savoir faire une différence de ce que chaque agent a réalisé (onglet SG) vs la norme (onglet NP) pour de nombreux indicateurs. Cette différence est effectué via les différentes recherches (R et R2)

    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
    If DPN.Range("A8") = "" Then Exit Sub 'si la cellule A8 de l'onglet DPN est vide, sort de la procédure
     
    'Set NomIndicateur = NP.Range("B1").End(xlToRight) 'définit la plage du nom des indicateurs
     
    'M = 4
    'Indicateur = DPN.Cells(7, M)
     
    Dim Q As Integer
    Dim P As Integer
     
    For Q = 7 To Sheets("Détails Personnes Normes").Range("D7").End(xlToRight) 'Boucle sur le nom des indicateurs (onglet DPN)
    For P = 1 To NP.Range("B1" & P).End(xlToRight) 'Boucle sur le nom des indicateurs (onglet NP)
     
    If InStr(DPN.Range("D" & Q), NP.Range("A" & P)) <> 0 Then 'Si même nom pour les indicateurs effectue le traitement
     
     
    Set PL = DPN.Range("A8:A" & DPN.Range("A600").End(xlUp).Row) 'définit la plage de recherche du code agent
    Set PL2 = DPN.Range("C2:C" & DPN.Range("C600").End(xlUp).Row) 'définit la plage de recherche du métier
     
    For Each CELL In PL
    For Each CELL2 In PL2
     
    Set R = SG.Columns(1).Find(CELL.Value, , xlValues, xlWhole) 'recherche dans SG colonne 1 le code agent
    Set R2 = NP.Columns(1).Find(CELL2.Value, , xlValues, xlWhole) 'recherche onglet NP la norme métier
     
    For I = 7 To 9 'Boucle sur tous les indicateurs de l'onglet SG
    If Not R Is Nothing Then Realise = R.Offset(0, I).Value 'recherche la valeur réalisée du premier indicateur (commence colonne 7)
     
    For J = 2 To 4 'Boucle sur tous les indicateurs de l'onglet NP
    If Not R2 Is Nothing Then Norme = R2.Offset(0, J).Value 'recherche la norme à atteindre pour le premier indicateur
     
    For K = 3 To 5 'Boucle pour reporter les résultats
    CELL.Offset(0, K).Value = Realise - Norme 'précise dans la cellule la différence entre la norme et le resultat
     
     
    Set R2 = Nothing 'vide la variable R
    Set R = Nothing 'vide la variable R
     
     
    Next K
    Next J
    Next I
    Next CELL2 'prochaine cellule
    Next CELL 'prochaine cellule
    End If
    Next P
    Next Q
    J'ai essayé de multiples manières sans arriver à mes fins ..

    Je précise que j'ai une erreur incompatibilité de type à la ligne 12 !

    Merci par avance à celui qui pourra m'aidé ! Je m'y perd avec toutes ces boucles ...

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut



    Bonjour,

    cette ligne est irrationnelle car la fin de la boucle fait référence au compteur lui-même et égal à zéro !
    Compteur P initialisé à zéro, donc B1 & P est égal à B10

    Sans compter qu'un Range n'est pas un nombre, il manque à la fin de la ligne soit .Column soit .Row

    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Points : 65
    Points
    65
    Par défaut
    Salut Marc,

    Merci pour ta réponse, effectivement je ne sais pas ce que j'ai été cherché là ...

    Je me suis rendu que mes boucles ne pouvait marcher sur des colonnes ; je ne vois pas comment les exprimer en VBA par contre ...

    J'aimerai que la première boucle parcours l'entête de mes indicateurs onglet DPN de H7 jusque AP7
    La deuxième boucle, même principe, parcours l'entête des indicateurs onglet NP de B1 à AJ1

    Si l'entête des indicateurs sont identiques, j'aimerais que ça effectue mon traitement

    Et enfin que ça passe à l'entête (colonne) suivante...

    Je ne sais pas si je suis clair ..

    Cordialement

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Question certainement basique: vous ne pouvez-pas le faire avec des fonctions Excel classiques? VLOOKUP par exemple (en anglais)
    Vous pourriez fournir un bout d'exemple?
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Points : 65
    Points
    65
    Par défaut
    Salut Vinc_bilb,

    Je ne peux pas effectuer de recherche V, en fonction du métier de l'individu je dois stocker la norme qu'il doit atteindre (onglet NP) et ce qu'il a réalisé (onglet SG).

    Une fois ces deux valeurs stocker je veux afficher pour chaque individu la différence entre la norme et ce qui a été réalisé puis passé à l'indicateur suivant lorsqu'il n'a plus d'individu.. jusqu’à ce qu'il n'y ai plus d'indicateur dans DPN..

    Voici un fichier exemple pour y voir plus clair ! Exemple DPN.xlsm

    Cordialement

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    Pour la partie Excel pur, voir propal ci-jointe en utilisant juste du VLOOKUP et du MATCH Exemple DPN.xlsm
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Points : 65
    Points
    65
    Par défaut
    Salut Vinc_bilb,

    Tout d'abord merci de ta réponse ! Je pensais pas pouvoir faire ceci avec la RechercheV et Equiv !

    Pourrais-tu m'expliquer un petit peu la syntaxe d'une des formules ?! Je ne vois pas à quoi fais référence les #En-têtes [#Cette ligne] !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV($A40;TAB_SG[#Tout];EQUIV(TAB_SOLUT[[#En-têtes];[FIF]];TAB_SG[#En-têtes];0);FAUX)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =RECHERCHEV(TAB_SOLUT[[#Cette ligne];[Métier]];Table3[#Tout];EQUIV(TAB_SOLUT[[#En-têtes];[contacts]];Table3[#En-têtes];0);FAUX)
    Je te remercie d'avoir pris le temps de me faire découvrir ceci !

    Cordialement

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    il a tout simplement utilisé les fonctionnalités associées à un tableau Excel (appelé ListObject), qui permettent de parcourir :

    - les entêtes : #En-têtes
    - les données : #données
    - tout : #tout
    - uniquement dans la ligne en cours : #cetteligne
    etc...

    par exemple :
    TAB_SOLUT[[#Cette ligne];[Métier]]
    ==> Pour le tableau "TAB_SOLUT" / dans cette ligne et à la colonne "Métier"


    c'est un outil très puissant, qui évite de nommer chaque champs d'un tableau par une plage nommée

    regarde par ici : http://silkyroad.developpez.com/excel/tableau/

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Points : 1 562
    Points
    1 562
    Par défaut
    Bonjour,

    De plus, l'utilisation des tableaux permet entre-autre:
    - une gestion dynamique des enregistrements (l'équivalent du VBA Range.CurrentRegion ou du Excel Ctrl + *: l'ajout d'une ligne ou d'une colonne se répercute immédiatement dans le tableau: plus besoin de rafraichir les adressages .... )
    - une propagation automatique des formules sur chaque colonne
    - une mise en forme assez sympa
    - des formules plus lisibles!

    Si ça peut contribuer
    "Idéalement nous sommes ce que nous pensons. Dans la réalité, nous sommes ce que nous accomplissons." A.Senna
    et n'oubliez-pas de développer des .... sourires ^_^

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 34
    Points
    34
    Par défaut
    bonjour,
    en espérant contribuer
    2 petites fonctions tirées ma bibliothèque : GetV, PutV, inspiré de Vlookup, à adapter selon usage

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    Sub GetV(Table_Array As Range, Etiquette_ColA As String, ValeurA As Variant, Etiquette_ColB As String, CelluleInfo As Variant, Optional CodeRetour As Boolean)
        ' inspiré de WorksheetFunction.VLookup
        ' Recherche une valeur (ValeurA) dans la première colonne (A) d'un tableau et
        ' renvoie une valeur (CelluleInfo) dans la même ligne dans une autre colonne (B) du tableau.
        ' ValeurA - valeur à rechercher dans la première colonne du tableau. ValeurA peut être une valeur ou une référence.
        ' Table_array - deux ou plusieurs colonnes de données. Utilisez une référence à une plage
     
     
        Dim Montab As Variant
        Dim Lig As Long, Col As Long
        Dim ColA As Long, ColB As Long
     
        CodeRetour = False
        Montab = Table_Array.value
     
     
        If TypeOf ValeurA Is Range Then
            Lig = ValeurA.Row - Table_Array.Cells(1, 1).Row + 1
            CodeRetour = True
        Else
            ' Recherche de la première valeur dans la Colonne A -> on récupère la ligne
            For Col = LBound(Montab, 2) To UBound(Montab, 2)
                  If Montab(LBound(Montab, 1), Col) = Etiquette_ColA Then
                      'parcourir les cellules de la colonne A
                            For Lig = LBound(Montab, 1) To UBound(Montab, 1)
                '            MsgBox Montab(Lig, Col)
                                  If Montab(Lig, Col) = ValeurA Then
                                      'MsgBox Montab(Lig, Col)
                                      CodeRetour = True
                                      Exit For
                                  End If
                            Next Lig
                  End If
                  If CodeRetour = True Then Exit For
            Next Col
        End If
     
        If CodeRetour = False Then Exit Sub
     
        CodeRetour = False
        ' Recherche de la seconde colonne -> on récupère la colonne et on renvoie la valeur
        For Col = LBound(Montab, 2) To UBound(Montab, 2)
            If Montab(LBound(Montab, 1), Col) = Etiquette_ColB Then
                      If IsObject(CelluleInfo) Then 'test par isobject car l'objet passé en arg n'est pas encore initialisé
                          Set CelluleInfo = Table_Array.Cells(Lig, Col)
                      Else
                          CelluleInfo = Table_Array.Cells(Lig, Col).value
                      End If
                      CodeRetour = True
                      Exit For
            End If
        Next Col
     
     
    End Sub
    Sub PutV(Table_Array As Range, Etiquette_ColA As String, ValeurA As Variant, Etiquette_ColB As String, ValeurB As Variant, Optional CodeRetour As Boolean)
        ' inspiré de WorksheetFunction.VLookup
        ' Recherche une valeur (ValeurA) dans la première colonne (A) d'un tableau et
        ' Modifie la valeur (CelluleInfo) dans la même ligne dans une autre colonne (B) du tableau.
        ' ValeurA - valeur à rechercher dans la première colonne du tableau. ValeurA peut être une valeur ou une référence.
        ' Table_array - deux ou plusieurs colonnes de données. Utilisez une référence à une plage
    '    PutV  LABASE, "COLONNE SOURCE", ValeurA ,"COLONNE_CIBLE", VALEUR_CIBLE, CodeRetour
    '    GetV LABASE, "COLONNE SOURCE", ValeurA, "COLONNE_CIBLE", CELLULE_CIBLE, CodeRetour
     
        Dim Montab As Variant
        Dim Lig As Long, Col As Long
        Dim ColA As Long, ColB As Long
     
     
        CodeRetour = False
        Montab = Table_Array.value
     
        If TypeOf ValeurA Is Range Then
            Lig = ValeurA.Row - Table_Array.Cells(1, 1).Row + 1
            CodeRetour = True
        Else
            ' Recherche de la valeur dans la Colonne A -> on récupère la ligne
            For Col = LBound(Montab, 2) To UBound(Montab, 2)
                If Montab(LBound(Montab, 1), Col) = Etiquette_ColA Then
                      'parcourir les cellules de la colonne A
                      For Lig = LBound(Montab, 1) To UBound(Montab, 1)
          '            MsgBox Montab(Lig, Col)
                            If Montab(Lig, Col) = ValeurA Then
                                'MsgBox Montab(Lig, Col)
                                CodeRetour = True
                                Exit For
                            End If
                      Next Lig
                End If
                If CodeRetour = True Then Exit For
            Next Col
        End If
     
        If CodeRetour = False Then Exit Sub
     
        CodeRetour = False
        ' Recherche de la colonneB -> on récupère la colonne et on attribue la valeur à la cellule trouvée colonne B
        For Col = LBound(Montab, 2) To UBound(Montab, 2)
                If Montab(LBound(Montab, 1), Col) = Etiquette_ColB Then
                          If IsObject(ValeurB) Then 'test par isobject car l'objet passé en arg n'est pas encore initialisé
                              Table_Array.Cells(Lig, Col).value = ValeurB.Valeur
                          Else
                              Table_Array.Cells(Lig, Col).value = ValeurB
                          End If
                          CodeRetour = True
                          Exit For
                      End If
        Next Col
     
    End Sub

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2014
    Messages : 90
    Points : 65
    Points
    65
    Par défaut
    Parfait j'y suis arrivé en traduisant la formule en VBA (RechercheV & EquiV).

    Je m'aperçois que je ne connais pas de nombreuses fonctionnalités d'Excel ...

    Merci à tous de partager différentes méthodes.

    Bien cordialement.

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

Discussions similaires

  1. Probleme boucle If recherche dans base access
    Par PITP2 dans le forum ASP
    Réponses: 5
    Dernier message: 10/02/2009, 20h55
  2. recherche dans une plage de données avec filtre
    Par depi67 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/10/2008, 14h17
  3. recherche dans une plage dans des fichiers fermés
    Par kikuyu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/04/2008, 10h20
  4. Boucle If-recherche dans une BD
    Par ladywhite dans le forum ASP.NET
    Réponses: 11
    Dernier message: 20/05/2007, 09h53
  5. [date] Recherche dans une plage de dates
    Par astro84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/06/2005, 17h13

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