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 :

VBA_Recherche & copie lignes_Multi-critères_Boucle [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Janvier 2016
    Messages : 34
    Par défaut VBA_Recherche & copie lignes_Multi-critères_Boucle
    Bonjour à tous!

    Pour effectuer une recherche en boucle dans un fichier spécifique, puis copier des lignes entières dans le fichier où s'exécute la macro je me suis largement inspiré du code présent sur ce fil de discussion.
    Après de nombreuses recherches notamment sur ce superbe site, je me vois confronté à un problème que je n'arrive pas à résoudre seul.

    Aussi, je viens vous demander de l'aide.

    Mon problème: je souhaite effectuer une recherche multi-critère avec le code que j'utilise (i.e. sélectionner des lignes de données qui possèdent 1, 2, etc. valeurs à définir).

    Mes questions:

    - Comment faire pour adapter le code afin d'effectuer une recherche avec plusieurs critères?

    - Existe-t-il une méthode plus simple (j'étais parti sur des boucles "Do While / Loop" au début, mais je n'arrivais pas à trouver exactement ce que je voulais).



    Voici le code que j'utilise actuellement:

    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
    Option Explicit
     
    Dim J As Integer 'variable globale index ligne destination
     
    '===================================================================================
    '
    ' stFind : Valeur cherchée
    '     rOu: Plage de recherche
    '
    ' Retour = Nb de fois trouvé
    '
    ' Modifier procédure TraiteC en fonction
    '  du traitement à effectuer...
    Function iBoucleCherche(stFind As String, rOU As Range) As Integer
     Dim c As Range
     Dim stAdd As String 'Memo premier element
     Dim bFinBoucle As Boolean
     Dim iNb As Integer
      Set c = rOU.Find(stFind, After:=rOU.Cells(1), LookIn:=xlFormulas, _
      LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      MatchCase:=False)
      On Error GoTo 0
      stAdd = c.Address
      bFinBoucle = False
      While Not c Is Nothing And Not bFinBoucle
        iNb = iNb + 1
        TraiteC c
        On Error Resume Next
        Set c = rOU.FindNext(After:=c)
        bFinBoucle = (c.Address = stAdd)
        On Error GoTo 0
      Wend
      iBoucleCherche = iNb
    End Function
    '
    ' Fonction de traitement
    ' A modifier suivant les besoins..
    Sub TraiteC(c As Range)
      Debug.Print c.Address & " ... " & c.Value
      '----- le traitement proprement dit...
      ' ici copie ligne entiére dans feuille 2
     
    'emplacement où l'on souhaite copier les lignes
      c.EntireRow.Copy ThisWorkbook.Sheets("Data").Rows(J)
      J = J + 1
    End Sub
    '=======================================================================================
    Sub MonTest()
    Dim date_du_jour As Variant
    Dim classeur As Workbook
    Dim CS As Workbook
     
    'variable
    date_du_jour = Format(CDate(DateSerial(Year(Date), Month(Date), Day(Date) - 1)), "ddmmyyyy")
     
    'Classeur source
    Set CS = ActiveWorkbook
     
        Application.ScreenUpdating = False
     
    'Chercher données dans CSV
    Set classeur = Workbooks.Open("\\...\...\STOCK_AU_" & [date_du_jour] & ".csv", _
        False, True, Local:=True)
     
    'Boucler sur les données
    J = 1 '
        Debug.Print iBoucleCherche(CS.Sheets("Critères").Range("D3").Value, classeur.Sheets("STOCK_AU_" & [date_du_jour]).Cells)
     
     
    'Pour fermer le fichier .csv
    Workbooks("STOCK_AU_" & [date_du_jour] & ".csv").Close False
     
     
    'Rétablir le rafraichissement
        Application.ScreenUpdating = True
     
    'Mise en forme: Autofit
    Range("A:AZ").Columns.AutoFit
     
    End Sub
    Concrètement j'aimerai pouvoir utiliser par exemple les cellules D3, D5 et D7 de CS.Sheets("Critères") comme valeurs à définir pour la recherche.


    En espérant avoir été assez clair, je reste à votre disposition pour toute précision.


    Merci d'avance pour votre aide,




    Esculape

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    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 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    peux-tu préciser le contexte de la recherche ?

    la recherche doit s'effectuer sur une seule colonne pour l'ensemble des critères ? Ou chaque critère dans une colonne différente ? Ou tous les critères n'importe où dans la feuille ?

    donne nous le maximum d'informations, suivant le cas il n'est pas forcément obligatoire de passer par Find (des filtres automatiques ou avancés suffisent et sont beaucoup plus rapides)

  3. #3
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Janvier 2016
    Messages : 34
    Par défaut
    Bonjour joe.levrai,


    Pour préciser un peu mon problème:
    - il s'agit d'extraire des lignes de données dans un fichier CSV avec plusieurs colonnes.
    - chaque ligne est renseignée selon les mêmes informations (par ex: colonne A = "Nom de la personne" / colonne B = "Département de naissance" / colonne C = "numéro de téléphone").

    L'idée serait donc de chercher chaque critère dans une colonne différente, copier puis coller les lignes définies selon les données présentes.
    Je souhaiterais par exemple extraire toutes les lignes contenant en colonne A le nom "Damien" ET en colonne B le département "74".


    Merci pour le temps accordé,


    Esculape

  4. #4
    Expert éminent
    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
    Par défaut



    Bonjour,

    réalisable avec ou sans code via un simple filtre ou un filtre avancé …



    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …

  5. #5
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Janvier 2016
    Messages : 34
    Par défaut
    Bonjour,


    Je souhaite automatiser cette copie afin d'en transmettre l'utilisation à d'autres usagers sans que ceux-ci n'aient à effectuer d'opération (à part celle d'appuyer sur un bouton).
    J'ai bien regardé la gestion des filtres, cependant je ne trouve pas comment lier ceux-ci avec une fonction de copie-colle de plusieurs lignes sélectionnées par lesdits filtres.

    Si vous avez une solution, ou le lien d'un article je suis preneur.


    Merci d'avance.


    Esculape

  6. #6
    Expert éminent
    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
    Par défaut



    C'est pourtant facile !

    Le filtre (simple) est appliqué sur une plage précise.
    Seules les lignes correspondantes aux critères restent affichées dans cette plage.
    Comme la méthode Copy - appliquée à cette plage - ne s'occupe que des lignes visibles, où est donc la difficulté ?

  7. #7
    Membre averti
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Janvier 2016
    Messages : 34
    Par défaut
    OK.
    Je me suis dirigé sur cette option. Je galère un peu, mais je finirai bien par trouver.

    Merci de l'aide!

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

Discussions similaires

  1. Protéger une disquette contre la copie
    Par benzaza dans le forum Assembleur
    Réponses: 20
    Dernier message: 16/01/2005, 10h42
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20
  4. Copie de fichier
    Par Bjorn dans le forum C
    Réponses: 4
    Dernier message: 11/06/2002, 15h23
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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