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 :

Copie de cellule en fonction d'un critère


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut Copie de cellule en fonction d'un critère
    Bonjour à tous,

    Je reviens vers vous pour finaliser une macro.
    Le but de la macro est de copier plusieurs valeur en fonction d'un critère.

    Le début de la macro fonctionne à savoir, identifier les valeurs à copier selon le critère, cependant je bloque pour copier les valeurs trouver dans certaines colonnes.

    Dans l'exemple que je joint, il y a une feuille tableau et une feuille detail.
    Le critère de recherche se trouve dans "tableau" donc je vais chercher la ligne qui commence par le critère et je souhaite copier les valeurs des colonnes B, C et E de "détail" dans les colonnes B, D, et I ou J en fonction de la valeur (pour compliquer les choses )

    Merci de votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    evite les "select"
    regarde dans l'aide copy et pastespecial

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Ok pour les select
    mais pour l'aide copy et pastespecial je bloque

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    je fais beaucoup de copie de plage en ce momment

    j'utilise cette méthode

    définir une plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set plage = sheets(1).range(cells(L0,C0),cells(Lf,Cf))
    où L0,C0 reprersentent ligne et colonne de la premiére cellule de la plagr
    Lf et Cf les derniéres

    copier la plage
    coller la plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sheets(2).cells(ligne_cible,colonne_cible).pastespecial
    pastespecial réussit toujours, paste plante souvent

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    C'est une méthode très interessante, et je la met de côté

    cependant dans mon cas, cela me semble inadapté pour plusieurs raisons :
    - je ne connais pas la ligne de destination puisque c'est une variante
    - je copie des cellules variables (pas une ligne précise)

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    la ligne et la colonne de destination peuvent être des variables issues d'un calcul, ça marche

    pareil pour la plage de source, tu peux la définir avec des variables si tu sais les calculer

    précise mieux ta pensée

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Justement c'est là que je bloque, je suis pas assez calé en VBA pour créer la macro avec des variables (+condition).

    Je vais essayer d'être plus précis (voir fichier joint)

    En F2 (feuille "tableau") j'ai le mot "voiture" (c'est mon critère)
    la macro cherche ce mot dans la colonne A (feuille détail)
    Lorsque le mot est trouvé on copie : les cellules de la ligne (variable)
    - la ligne (variable) colonnes B => vers feuille "tableau" (variable insertion ligne par rapport au critère initiale) en colonne B,
    - Idem pour la cellule de la ligne (variable) colonnes C => vers feuille "tableau" en colonne D,
    - Idem pour la cellule de la ligne (variable) colonnes E => vers feuille "tableau" en colonne I si la valeur = D ou J si valeur = C

    J'espere avoir été plus précis

  8. #8
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    bon tu as trouvé la solution
    il suffit que tu code ce que tu viens d'écrire et c'est bon
    pas besoin du fichier joint que tu as oublié

    pour trouver un mot utilise find , regarde dans l'aide et sur les forums comment l'utiliser
    récupére le n° de ligne
    le pb est que si les cellules de la ligne à copier sont discontinues, c'est dire qu'elles ne sont pas toutes avec des infos, tu vas devoir recopier toute ta ligne
    et la coller en début de ligne, ie sur la colonne 1

    si ta ligne est continue tu peux mesurer sa longueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' trouver la dernière ligne d'une colonne remplie de données
     
    der_ligne  = Range("a1").End(xlDown).Row
    trouver la dernière colonne d'une ligne remplie de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    der_col = Range ("A1").end(xlToRight).Column
    avec beaucoup de courage et une patience d'ange tu vas y arriver

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Désolé pour l'oubli du fichier joint

    voici le code que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Dim f As Range, c As Variant
    Application.ScreenUpdating = False
    Sheets("Tableau").Activate
    With Sheets("Detail")
    For Each c In .Range("a7:a" & .Range("a65000").End(xlUp).Row)
    Set f = Sheets("Tableau").Range("f3:f" & Range("f65000").End(xlUp).Row).Find(c, LookIn:=xlValues, LookAt:=xlWhole)
    If Not f Is Nothing Then
    Rows(f.Row + 1).Insert Shift:=xlDown
    Cells(f.Row + 1, 1).Select
    Sheets("Detail").Range("a" & c.Row & ":d" & c.Row & ":e" & c.Row).Copy Destination:=Selection
    End If: Next: End With
    - La boucle est ok
    - La recherche du critere est ok
    - je copie les valeurs des colonnes A, D et E qui se recopie sur une seule ligne..... copier à des endroit précis ca je ne sais pas faire

  10. #10
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Salut joums et Patnel,
    Je me permets d'intervenir pour plusieurs points...
    D'abord la méthode Copy, elle n'est absolument pas la plus efficace, il est plus facile d'affecter la valeur à une variable voir directement à la cellule cible.
    Exemple, on doit rapatrier la ligne 7 de ton Détail, pour la colonne avec Voiture ça donnerait (Pas testé, écrit à la volée):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sheets("Tableau").cells(10,2)=sheets("Detail").cells(7,1)
    sheets("Tableau").cells(10,4)=sheets("Detail").cells(7,2)
    sheets("Tableau").cells(10,6)=sheets("Detail").cells(7,3)
    if sheets("detail").cells(7,5)="C" then
         sheets("Tableau").cells(7,10) = sheets("Detail").cells(7,5)
    else
         sheets("Tableau").cells(7,9) = sheets("Detail").cells(7,5)
    end if
    Il reste à mettre ta ligne 7 en variable par boucle comme Patnel te l'a indiqué, par contre pour détecter la dernière ligne ou colonne il vaut mieux commencer par le bas, car si ton tableau continent une ligne vide tu ne couvriras pas l'ensemble de tes données
    Je préconnise pour la dernière ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLig = sheets("Detail").cells(columns(1).cells.count,1).end(xlup).row
    Donc le code complet serait:
    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
    Sub aide()
    DerLig = Sheets("Detail").Cells(Columns(1).Cells.Count, 1).End(xlUp).Row 'Récupère la dernière ligne
    Cible = 9 'Affecte une valeur pour la ligne où copier
    For i = 7 To DerLig 'Boucle sur toutes les lignes remplie de la feuille détail
         If Sheets("Detail").Cells(i, 1) = Sheets("Tableau").Range("F4") Then 'Vérifie si la valeur = ce qu'on recherche
               Cible = Cible + 1 'Incrémente la ligne où placer de 1 à chaque passage (1er = ligne 10)
               Sheets("Tableau").Cells(Cible, 2) = Sheets("Detail").Cells(i, 1) 'Affecte la valeur Code 1
               Sheets("Tableau").Cells(Cible, 4) = Sheets("Detail").Cells(i, 2) 'Affecte la valeur Code 2
               Sheets("Tableau").Cells(Cible, 6) = Sheets("Detail").Cells(i, 3) 'Affecte la valeur Code 3
               If Sheets("detail").Cells(i, 5) = "C" Then 'Vérifie si Code 5 = C
                    Sheets("Tableau").Cells(Cible, 10) = Sheets("Detail").Cells(i, 5) 'si code 5 = C
               Else
                    Sheets("Tableau").Cells(Cible, 9) = Sheets("Detail").Cells(i, 5) 'si code 5 <> C (donc D)
               End If
         End If
    Next i 'Passe à la ligne suivante
    End Sub


    A+

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Bonjour Fvandermeulen,
    Merci pour ces précisions, il est vrai qu'il y a plusieurs manières contourner le problème.

    La solution que tu préconises semble être cohérente pour solutionner mon problème. Cependant je n'est pas l'impression que la notion de boucle fasse complètement son travail.
    Il existe plusieurs criteres à rechercher, d'abord en F4 puis FXX..... puisqu'il y aura eu une incrémentation de ligne.
    Egalement peux-tu m'expliquer le code suivant :
    Cible = 9 'Affecte une valeur pour la ligne où copier

    Merci
    Ps : je vais tester le code

  12. #12
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    j'ai pas pu bien vérifié ton code car je sais pas ce qu'il y a sur les feuilles tableau et détail

    mais je reviens sur ma méthode
    on copie la plage dés qu'on connait sa dimension, ça tu as l'air d'avoir compris

    pour coller il faut calculer la première cellule, et ça aussi tu dois le savoir

    n'utilise pas trop copy destination ça plante souvent et ça fait pas ce qu'on veut

    mais plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    plage.copy
     
    cells(a,b).pastespecial ' il sufiit de calculer a et b

  13. #13
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    D'après tes explications, tu cherches le mot Voiture dans la liste de la feuille Detail (tu n'as pas parlé d'autre chose hormis le Code 5 C ou D)

    On boucle donc toutes les lignes de tes données de la feuille Detail, quand on trouve on place dans la feuille Tableau à partir de la ligne 10; Cible sert donc à incrémenter la ligne sur laquelle on doit placer l'élément trouvé.

    Si tu as d'autre argument à chercher et placer il faudra inclure mon code dans un boucle qui ballaie tes arguments et adapter la définition de la variable Cible en lui affectant la dernière cellule remplie de la fauille Tableau +1

    En espérant avoir été clair.

    A+

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    J'ai omis une précision qui a son importance, il peut y avoir plusieurs critères, tous dans la colonne F (de l'onglet tableau).
    Le schéma doit donc être le suivant :
    - le code en F4 est voiture => chercher ce code dans l'onglet détail en colonne A
    Lorsque le mot est trouvé on copie : les cellules de la ligne (variable)
    - la ligne (variable) colonnes B => vers feuille "tableau" (variable insertion ligne par rapport au critère initiale) en colonne B,
    - Idem pour la cellule de la ligne (variable) colonnes C => vers feuille "tableau" en colonne D,
    - Idem pour la cellule de la ligne (variable) colonnes E => vers feuille "tableau" en colonne I si la valeur = D ou J si valeur = C

    On boucle sur un nouveau critère de la feuille tableau en colonne F.
    Le 2è critère qui était en F5, se retrouve en F6 ou + en fonction du nombre d'incrémentation de ligne.

    (ps : désolé pour cette littérature)

    Partnel,
    je comprends maintenant qu'il ne faut pas utiliser le copy destination
    concernant la plage à copier il s'agit de plusieurs cellule dont les colonnes sont fixes mais la ligne est variable, c'est là où je ne sais pas comment inclure la variable de destination.

    Fvandermeulen,
    ok pour ta 2è explication mais ton code copie les valeurs mais n'incrémente pas de ligne supplémentaire

  15. #15
    Membre habitué
    Inscrit en
    Novembre 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 293
    Points : 125
    Points
    125
    Par défaut
    tu ne pouras coller que ce que tu as copié

    donc la destination aura la même dimmension que la source, il suffit de connaitre uniquement que la première cellule de la destination le reste suit

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Je comprends pas, désolé, j'ai pas trouvé comment faire
    J'arrive à coller toutes les cellules en incrémentant une ligne.
    Mais ce que je veux faire c'est coller les celulle sous la ligne du critère mais dans des colonnes précises.

  17. #17
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Donc résultat final souhaité:
    Si F4 = Voiture
    alors B5 = voiture / D5 = Berline / F5 = Bleu / J5 = C
    B6 = voiture / D6 = sportive / F6 = rouge / J6 = C
    B7 = voiture / D7 = Berline / F7 = Bleu / J7 = C
    B8 = voiture / D8 = sportive / F8 = rouge / I8 = D
    Ensuite F9 = Quad
    alors B10 = quad / D10 = sport / F10 = noir / I10 = D

    C'est bien ça ?
    Veux tu définir tous les éléments à chercher AVANT de lancer la recherche ?
    Est-ce bien le format souhaité, car il ne favorise pas un code simple...

    A+

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Le résultat final est bien celui là
    Au départ le 1er critère est en F4, le second en F5
    La macro doit insérer des lignes en fonction de la recherche du 1er critere
    donc forcément le 2è critere va changer de place et aller en F7,8 ou 9 voir 20.

    Il n'y aura aucune autre valeur que le critere en colonne F
    C'est pour cela que je pensais faire une boucle

  19. #19
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour joums le fil le forum si je comprends tu veus seulement que l'emplacement du résultat changes???? par apport a ton ancienne demande???

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 106
    Points : 40
    Points
    40
    Par défaut
    Bonjour Laëtitia,

    Oui effectivement par rapport à ma demande initial, je n'arrive pas à faire modifier l'emplacement du résultat des valeurs obtenus, avec une condition pour l'une d'entre elle

Discussions similaires

  1. [Toutes versions] Faire apparaître un message dans une cellule en fonction de différents critères
    Par niiiiiiiiiico dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 26/04/2013, 14h43
  2. [XL-2003] Adresse de cellules en fonction d'un critère sur leur contenu
    Par Yvanou dans le forum Excel
    Réponses: 4
    Dernier message: 09/07/2012, 17h50
  3. [XL-2003] Selectionner cellule en fonction de deux critères
    Par thoom dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/07/2011, 18h14
  4. [XL-2007] Surlignage automatique de cellules en fonction d'un critère
    Par panpulilu dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/06/2010, 23h27
  5. [XL-2003] Copie de cellule en fonction du numéro de lignes
    Par biquet25 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/04/2009, 19h34

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