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 :

Balayer une Base de données ligne par ligne [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet Immobilier
    Inscrit en
    Mai 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Immobilier
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2015
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Balayer une Base de données ligne par ligne
    Bonjour,

    J'ai un fichier composé de 3 onglets : "Export", "Dossiers en cours", "Dossiers archivés".

    Dans l'onglet "Export", j'ai rajouté une colonne avec formule qui permet de déterminer le statut de chaque dossier en fonction des autres onglets > cela renvoie "encours", "a traiter" ou "archivé"

    Le but de mon outils est de rajouter dans l'onglet "Dossiers en cours" tout les dossiers qui ne sont pas déjà dedans ou déjà archivés mais qui sont apparus dans l'export (Statut "à traiter")

    Quel est la méthode la moins lourde pour balayer toutes les lignes de l'onglet "Export" et copier coller tous les lignes avec la mention "à traiter" dans mon onglet "dossiers en cours" en bas de tableau.

    NB : Partons du principe que le statut apparaît en colonne B dans l'onglet "Export"


    Si je ne suis pas clair je peux vous envoyer un fichier exemple car celui sur lequel je travaille est un chouilla confidentiel

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Je te propose une technique utilisant les filtres avancés. Elle repose sur des tableaux de données (éventuellement, convertis tes plages en tableaux via insertion\tableaux).

    Elle a l'avantage de ne pas figer les conditions de copie dans des tests de type if...then et évite les boucles souvent gourmandes en temps, mais elle nécessite un peu de mise ne place. Elle suppose la connaissance du fonctionnement des filtres avancés (voir ma signature à propos de VBA)...

    1. Convertir tes plages en tableaux nommés par exemple t_Encours et t_Export;
    2. Créer, dans une autre feuille, une plage de deux cellules superposées, par exemple A1:A2 et nommer cette plage, par exemple Filter.



    Tu peux alors utiliser les filtres avancés d'Excel au sein d'une macro. La solution consiste à:
    1. saisir en VBA ta formule dans la cellule A2 de la plage Filter (ici, la formule NB.SI(...) qui renverra VRAI pour les lignes d'Export qui ne sont pas dans Encours;
    2. utiliser le filtre avancé pour n'afficher que ce que tu veux copier;
    3. Itérer sur la les cellules visibles du tableau d'export;
    4. Copier/Coller spécial valeurs d'Export vers Encours.



    Après la mise en place, tu peux utiliser le code suivant (réalisé sur base des noms donnés ci-dessus):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Extract()
      Dim Formula As String
      Dim SelectedRange As Range
      Dim Source As Range
      Dim Target As Range
     
      Formula = "=countif(encours!" & Range("t_encours[Dossier]").Address & ",a2)=0" ' Formule pour filtrer sur les lignes Export qui ne sont pas dans Encours
      Range("filter")(2).Formula = Formula ' on place la formule dans la cellule de la plage de filtre
      Range("t_export[#all]").AdvancedFilter xlFilterInPlace, Range("Filter") ' Filtre sur les cellules qui répondent VRAI à la formule
      Set SelectedRange = Range("t_export").SpecialCells(xlCellTypeVisible) ' On prend uniquement la plage des cellules visibles
      Set Target = Range("t_encours[Dossier]")(Range("t_encours").Rows.Count + 1) ' on détermine la cellule d'arrivée
      SelectedRange.Copy
      Target.PasteSpecial xlPasteValues
    End Sub
    La formule est évidemment à adapter à ton cas et doit être rédigée en anglais (c'est plus sûr et plus portable que d'utiliser FormulaLocal). Elle peut être stockée sans une cellule Excel pour ne pas devoir modifier le code en fonction de la modification des conditions, ce qui est un plus non négligeable par rapport à des conditions "tout dans le code".
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonsoir à tous
    Bonsoir Tibodep

    Je ne voie qu'une solution, faire un Find "à traiter" sur la colonne "Statuts"......... si j'ai bien compris.

    Eric

    PS : Bonsoir Pierre, je n'avais pas vu ta réponse

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut Eric,

    Pas de soucis. On a probablement poussé sur Envoyer la réponse en même temps...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Au passage, note que la solution que je te propose rend ton code totalement indépendant des conditions du filtre. Il suffit en effet de passer la formule en paramètre de la procédure pour pouvoir, par exemple, stocker les formules de différents scenarii dans une plage pour les passer, au choix, à la procédure d'extraction...

    Cela met en évidence (une fois de plus) ce que je dis dans ma signature à propos de VBA pour Excel
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet Immobilier
    Inscrit en
    Mai 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet Immobilier
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2015
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Je n'ai pas très bien compris le principe de la solution que tu proposes, c'est un peu compliqué pour moi et surtout pour la valeur ajoutée de l'outil que je veux mettre en place!

    Ce que je veux faire est très simple (vous trouverez ci-joint un fichier exemple) :
    - 1ère étape : ma macro ouvre l'export et colle les donnée dans l'onglet "EXPORT TOTAL" (déjà fait)
    - 2ème étape : je veux récupérer les lignes de l'export qui ne sont pas dans "Dossiers en cours" ou "Dossiers Archivés" et les ajouter à "Dossier en cours" (chaque ligne a un identifiant unique dans la colonne numéro)
    - 3ème étape : Lorsqu'une ligne est complétée totalement dans l'onglet "Dossiers en cours" elle est coupée/collée vers l'onglet "Dossiers Archivés"

    Fichier Exemple.xlsm

    J'ai tenté de suivre ta méthode, mais je suis vite perdu sachant que je ne connais pas les filtres avancés...

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

Discussions similaires

  1. [AC-2010] Mettre une base de données access en ligne
    Par danytall dans le forum Access
    Réponses: 1
    Dernier message: 29/03/2013, 10h24
  2. [Base de donnée] Lire dans une base de données toutes les lignes
    Par Miharu dans le forum C++Builder
    Réponses: 6
    Dernier message: 05/06/2011, 17h08
  3. Sauvegarder une base de données MySQL en ligne
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 28/11/2007, 07h24
  4. Envoi d'une base de données MySQL par e-mail
    Par Paulinho dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 27/12/2005, 00h22
  5. Delphi Connexion à une base de donnée distante par TCP/IP
    Par viecel dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/01/2005, 19h19

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