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 : Comparer cellules + couper/coller lignes [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut VBA : Comparer cellules + couper/coller lignes
    Bonjour,
    J'espère que certains pourront venir à mon aide, je suis débutant en VBA (je pars de zéro mais avec des bases en C et fortran) et je dois absolument réaliser une maccro VBA.

    Voila j'explique mon problème un peu plus en détails.

    J'ai deux fichiers excel : "A_valider_calculs" et "Priorites".
    Le fichier "A_valider_calculs" contient une feuille "Clos" et le fichier "Priorites" contient 3 feuilles : "Bidos", "Non_Bidos" et "Clos_Priorites".

    Le but de la maccro VBA est de comparer la colonne A de "A_valider_calculs/Clos" avec respectivement "Priorites/Bidos" et "Priorites/Non_Bidos".
    Si le contenu des cellules est le meme pour une ligne, il faut que je colorie en vert la ligne correspondante dans "Priorites/Bidos" ou "Priorites/Non_Bidos" et que je coupe cette même ligne pour la coller dans "Priorites/Clos_Priorites", sachant que ce fichier contient déjà des lignes à la base.

    Petite chose en plus, Il faudrait également que cette maccro s'effectue à l'aide d'un "bouton" mise à jour qui se situerait dans la première cellule de "Priorites/Bidos" et qui afficherait la dernière date à laquelle on a cliqué dessus.

    Je remercie tous ceux qui auront le temps de lire mon problème et qui m'apporteront de l'aide sachant que je galère dessus depuis pas mal de jour.

    Bonne journée

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par CedricBDO Voir le message
    ....
    Je remercie tous ceux qui auront le temps de lire mon problème et qui m'apporteront de l'aide sachant que je galère dessus depuis pas mal de jour.
    ...
    et tu en est ou ?

    Tout d'abords il faut ouvrir tes 3 fichiers ... Comment vois-tu cela ? tes fichiers sont toujours ouvert avant le lancement de ta macro ?

  3. #3
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    Bonjour,

    Tu trouveras 2 méthodes dans ce post
    http://www.developpez.net/forums/d11...s-differentes/

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Disons que pour l'instant j'ai à peu près l'algorithme mais version langage humain ...
    Mes fichiers ne sont pas tous ouverts lors de la maccro, seul le fichier "Priorites" l'est. Pour les ouvrir, si j'ai bien compris il faut utiliser la fonction Workbooks.Open Filename:=

    Pour ce qui est de mon algortithme en langage normal comme je disais, ca donne ceci :

    -> Ouvrir le fichier "A_Valider_Calculs"
    -> Ouvrir la feuille "Clos"
    -> Ouvrir le fichier "Priorites"
    -> Ouvrir les feuilles "Bidos", "Non_Bidos" et "Clos_Priorites"
    -> Lire les valeurs de la colonne A de "A_Valider_Calculs/Clos"
    -> Lire les valeurs de la colonne A de "Priorites/Bidos" (ou de "Priorites/Non_Bidos)
    -> Comparer toutes ces valeurs entre elles
    -> Si des valeurs sont égales, sélectionner la ligne correspondante dans "Priorites/Bidos)
    -> Colorier la ligne en vert
    -> Couper la ligne
    -> Sélectionner la première ligne vide dans la feuille "Priorites/Clos_Priorites"
    -> Coller à cet endroit la ligne coupée provenant de "Priorites/Bidos"
    -> Afficher l'heure+date de la dernière utilisation de la maccro à coter du bouton de mise à jour
    -> Fermer le fichier "A_Valider_Calculs"

    Voila, c'est comme ca que je vois l'execution à peu près, j'espère que c'est logique.

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Ok ...
    pour ouvrir un fichier et l'assigner à une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim wkAvalid as WorkBook 
    set wkAvalid  = Workbooks.open ("c:\...\A_Valider_Calculs.xls")
    ainsi wkAvalid te permet ensuite d'agir sur le fichier

    par exemple pour définir la variable te permettant d'accéder à la feuille clos..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim shClos as WorkSheet
    set shClos =wkAvalid.worksheets("Clos")
    quand tu dis comparer les valeurs entre-elle ... comment doit s'effectuer la comparaison ? ligne par ligne ? ou ta comparaison serait plutôt pour chaque ligne du tableau Clos une recherche de la valeur contenue en colonne A dans la feuille Bidos ?

    les valeurs en colonne A de la feuille shClos sont elles uniques ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Points : 414
    Points
    414
    Par défaut Définir le problème en terme de constantes Excel VBA
    Bonjour,
    Il va falloir décrire chaque .xls par des constantes telles que le nom du Workbook (.xls).
    Le nom de la constante de chaque Workbook doit refléter s'il s'agit d'un fichier source ou cible c-a-d résultat.

    Pour chaque feuille, décrire les zones utiles en terme de rangées et colonnes.
    Cela a été clairement indiqué dans l'algorithme en langage naturel.
    Traduisez le en constantes Excel VBA dans un module Module1 inséré dans une feuille Excel vide dont vous choisirez le nom du .xls tel que Priority.xls

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
    Public Const nameWrkSourceValider = "A_Valider_Calculs.xls"
    Public Const indShtSourceClos = 1 ' Première feuille "Clos" de A_Valider_Calculs.xls
    Public Const rowClosCalcul = 1 ' à adapter si le premier calcul n'est pas en 1ere rangée.
    Public Const colClosCalcul = 1 ' à adapter si le premier calcul n'est pas en 1ere colonne.
     
    Public Const nameWrkTargetPriorite = "Priorites.xls"
    Public Const indShtTargetBidos = 1 ' feuille "Bidos"
    Public Const rowData = 1 ' à adapter si la première data n'est pas en 1ere rangée.
    Public Const colData = 1 ' à adapter si la première data n'est pas en 1ere colonne.
     
    Public Const indShtTargetNonBidos = indShtTargetBidos + 1 ' feuille "Non_Bidos"
    '...
    Il faut choisir des noms significatifs pas trop courts ni trop longs en vous aidant des libellés des rangées et colonnes.

    • Au niveau des Workbook, on n'a pas le choix il faut les identifier par leurs noms.
    • Pour les feuilles à l'intérieur d'un .xls, si vous pouvez garantir leurs ordres tel que "Bidos" sera toujours avant "Non_Bidos" alors utiliser des indices numériques comme indShtTargetBidos et indShtTargetNonBidos sinon passez à des noms comme nameShtTargetBidos et nameShtTargetNonBidos.


    Si la structure des feuilles Bidos et Non_Bidos est identique, vous pouvez factoriser les constantes qui les décrivent en utilisant des noms judicieux communs aux deux feuilles.

    A la lecture des noms des constantes et surtout de leurs commentaires, on doit pouvoir immédiatement comprendre où sont les sources de données, où est la cible résultat, où trouver chaque donnée, où afficher le résultat (colorier en vert, couper puis coller, datation, etc.)

    Ce travail descriptif par des constantes est indispensable avant d'aborder le détail de chaque action à réaliser.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre aide, j'ai finalement trouvé la solution à mon problème après moultes essais et bcp d'aides.

    Pour ceux que ça intéresse voici mon code :

    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
    Sub maccro()
    'Définition des variables
    Dim i As Long, j As Long, k As Long, wk0 As Workbook, wk1 As Workbook 
     
    'Permet de ne pas afficher le message de fermeture de fichier
    Application.DisplayAlerts = False 
     
    On Error Resume Next 'Ouverture de la gestion de problème
    Workbooks.Open "C:\Doc1.xls"
    If Err <> 0 Then
        MsgBox ("Le fichier C:\Doc1.xls n'existe pas")
        Exit Sub 'Affichage d'un message d'erreur si le fichier n'existe pas
    End If
    On Error GoTo 0 'Fermeture de la gestion de problème
    Set wk0 = ActiveWorkbook
    Set wk1 = ThisWorkbook
     
     
    j = 2
    While wk0.Worksheets("Doc1_Feuille1").Cells(j, 1) <> ""
          On Error Resume Next
          i = WorksheetFunction.Match(wk0.Worksheets("Doc1_Feuille1").Cells(j, 1).Value, wk1.Worksheets("Doc2_Feuille1").Columns(1), 0) 'Comparaison de la valeur des colonnes A des différentes feuilles
          If Err Then i = 0
          On Error GoTo 0
          If i <> 0 Then
          wk1.Worksheets("Doc2_Feuille1").Rows(i).Interior.Color = RGB(153, 204, 0) 'Remplissage en vert de la ligne
          wk1.Worksheets("Doc2_Feuille1").Rows(i).Cut 'On coupe la ligne qui a passé le test de comparaison
          With wk1.Worksheets("Doc2_Feuille2")
            With .UsedRange: k = .Row + .Rows.Count
            .Rows(k).Insert 'On insert la ligne dans la feuille " Doc2_Feuille2"
            End With
          End With
          wk1.Worksheets("Doc2_Feuille1").Rows(i).Delete 'On supprime la ligne qu'on a déplacé et qui est maintenant vide
          End If
    j = j + 1 'On passe au traitement de la ligne suivante dans la feuille " Doc1_Feuille1" de Doc1
    Wend
     
     
    wk0.Close
     
    'Affichage de la date de dernière mise à jour dans la 1ère case de la feuille Doc2_Feuille1
    wk1.Worksheets("Doc2_Feuille1").Cells(1, 1) = " Mis à jour le   " + Format(Date, "dd-mm-yyyy") + " à  " + Format(Time, "hh:mm")
     
    End Sub
    Remarque : La maccro plante s'il y a des colonnes avec des cellules fusionnées.

    Bonne journée

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

Discussions similaires

  1. Verifier date(s) puis couper/coller ligne(s) si correspondance
    Par jonathanoudelet dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/08/2008, 18h23
  2. [VBA-E] cellules vide sur une ligne
    Par bricereyem dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 12/06/2006, 22h20
  3. [VBA-E] Copier et coller une ligne entiere
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 30/05/2006, 16h51
  4. [VBA-E] Couper-coller
    Par tonyC dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2006, 18h04
  5. [VBA-E] couper-coller graphique dans autre woorkbooks
    Par gigs dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/04/2006, 13h42

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