Se connecter avec
S'enregistrer | Connectez-vous

Copier si condition 1remplie et coller sur un autre classeur si condition2 rempl

Dernière réponse : dans Programmation

Bonjour tout le monde, Voilà après des reherches et des recherches, je viens chercher une réponse à ma question. merci d'avance de l'attention que porterez à ce message. Voici mon problème : J'aimerai copier des lignes de mon classeurA qui se trouve dans mon C/temp si la colonne L de la feuille 1 n'est pas vide. Et puis coller ces données copiées dans un autre classeurB, dans la colonne L de la feuille 1 si la valeur de la colonne D du classeurA est la même que celle du classeurB.
voici mon code mais il ne génére aucun résultat :
Sub test3()
Dim ligne As Long
Dim a As Long Dim
FeuilleSource As Worksheet
Dim FeuilleCible As Worksheet
Dim Sh As Workbook
Dim Sh1 As Workbook
Set Sh = Worksbooks("classeurA.xlsm").Worksheets("Feuil1")
Set Sh1 = Worksbooks("classeurB.xlsm").Worksheets("Feuil1")
ligne = 2 ligne
For a = 2 To 65536
If Sh.Cells(a, 4).Text = Sh1.Cells(a, 4) Then
Sh.Cells(a, 12).Copy Sh1.Cells(ligne, 12)
ligne = ligne +1
End If
Next
End Sub

je vous remercie encore
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Mais bien sûr qu'il faut ajouter un For i !!!!
Il faut que tu boucles sur ta source ET sur ta cible.

M'enfin, c'est quoi ce Instr() que tu nous mets là ?

Je t'ai dit de virer ce Step -1 ridicule. :o  Parce que si je te dis d'étudier ça, tu fais quoi ?

  1. Dim ClasseurSource As Workbook
  2. Dim ClasseurCible As Workbook
  3. Dim FeuilleSource As Worksheet
  4. Dim FeuilleCible As Worksheet
  5. Dim CelluleSource As Range
  6. Dim CelluleCible As Range
  7.  
  8. Set ClasseurSource = Workbooks.Open(Filename:="C:\Temp\1_MACRO_ffd\ClasseurA.xlsm", ReadOnly:=True)
  9. Set ClasseurCible = ThisWorkbook
  10.  
  11. Set FeuilleSource = ClasseurSource.Worksheets("Feuil1")
  12. Set FeuilleCible = ClasseurCible.Worksheets("Feuil1")
  13.  
  14. For Each CelluleSource In FeuilleSource.Range("D2", FeuilleSource.Cells(.Rows.Count, 4).End(xlUp))
  15. For Each CelluleCible In FeuilleCible.Range("D2", FeuilleCible.Cells(.Rows.Count, 4).End(xlUp))
  16. If CelluleSource.Text = CelluleCible.Text Then
  17. CelluleCible.Offset(, 8).Value = CelluleSource.Offset(, 8).Text
  18. End If
  19. Next
  20. Next
  21. ClasseurSource.Close SaveChanges:=False


En plus, j'ai optimisé tout ça :
  1. Dim ClasseurSource As Workbook
  2. Dim PlageSource As Range
  3. Dim PlageCible As Range
  4. Dim CelluleSource As Range
  5. Dim CelluleCible As Range
  6.  
  7. Set ClasseurSource = Workbooks.Open(Filename:="C:\Temp\1_MACRO_ffd\ClasseurA.xlsm", ReadOnly:=True)
  8.  
  9. With ClasseurSource.Worksheets(1)
  10. Set PlageSource = .Range("D2", .Cells(65536, 4).End(xlUp))
  11. End With
  12. With ThisWorkbook.Worksheets(1)
  13. Set PlageCible = .Range("D2", .Cells(65536, 4).End(xlUp))
  14. End With
  15.  
  16. For Each CelluleSource In PlageSource
  17. For Each CelluleCible In PlageCible
  18. If CelluleSource.Text = CelluleCible.Text Then CelluleCible.Offset(, 8).Value = CelluleSource.Offset(, 8).Text
  19. End If
  20. Next
  21. Next
  22. ClasseurSource.Close SaveChanges:=False



Je suis allée prendre connaissance du règlement () et donc je vais reformuler ma demande.

J'ai deux classeurs :
- 1 fichier : nommé ClasseurA (= fichier archivé en fin de semaine)
- et 1 fichier : nommé ClasseurEnCours (=fichier de la semaine en cours)

Ces deux fichiers ont les mêmes intitulés au niveau des colonnes et le même nombre de colonne.
- Dans la colonne D, il y a les numéros des clients ; ex: cellule D1 = NumClient1, cellule D2 = NumClient2 ….
- Et dans la colonne L, il y a les commentaires. Chaque commentaire est unique à un client donné (donc à un numéro de client)

Quant aux lignes, leur nombre peut varier d'une semaine à l'autre.

En fait l'objectif est de recopier les commentaires dans le fichier archivé et puis de les coller sur mon fichier en cours. Et ce, s'il s'agit du même client.
Ex : Client1, qui a pour numéro : NumClient1 et pour commentaire Comment1 se trouve dans la ligne 25, dans le fichier archivé.
Mais dans le fichier EnCours, ce même client peut se trouver dans la ligne 29 (ou même il peut ne pas exister).
Je veux copier le commentaire Comment1 concernant le client1 qui se trouve dans le fichier "ClasseurA" et le coller dans le fichier ClasseurEnCours dans la ligne où se trouve le client1 et dans la colonne L (colonne où il y a les commentaires)

Tout ceci aurait pu être facile, pour moi, si les NumClient ne changent pas d'emplacement d'une semaine à l'autre.

Voici mon code (code de débutant), qui marche si les NumClient sont, chacun, à la même cellule dans le fichier "Classeur A" et dans le fichier "ClasseurEnCours"

  1. Sub OuvrirClasseur()
  2.  
  3. Dim ClasseurSource As Workbook
  4.  
  5. Workbooks.Open Filename:="C:\Temp\1_MACRO_ffd\ClasseurA.xlsm"
  6.  
  7. Set ClasseurSource = ActiveWorkbook
  8.  
  9.  
  10. Dim ClasseurCible As Workbook
  11.  
  12. Set ClasseurCible = ThisWorkbook
  13.  
  14. Dim i As Long
  15.  
  16. Dim j As Long
  17.  
  18. Dim FeuilleSource As Worksheet
  19.  
  20. Dim FeuilleCible As Worksheet
  21.  
  22.  
  23.  
  24. Set FeuilleSource = ClasseurSource.Worksheets("Feuil1")
  25.  
  26. Set FeuilleCible = ClasseurCible.Worksheets("Feuil1")
  27.  
  28.  
  29. i = 2
  30.  
  31.  
  32. For j = Cells(65536, 2).End(xlUp).Row To 2 Step -1
  33. If FeuilleSource.Cells(j, 4).Text = FeuilleCible.Cells(j, 4) Then
  34. FeuilleSource.Cells(j, 12).Copy FeuilleCible.Cells(j, 12)
  35. i = i + 1
  36.  
  37. Else
  38.  
  39. End If
  40.  
  41. Next
  42.  
  43.  
  44. ClasseurSource.Close
  45.  
  46.  
  47. End Sub



Merci d'avance
Expert Programmation

Salut,

Wahooooo! jusqu'à la ligne 26, ce code est nickel.
Bon, après ça devient un peu plus brouillon.

D'abord, pourquoi ce Step -1 ? Ca n'empêche pas la macro de fonctionner, mais c'est vraiment le plaisir de se faire des noeuds au cerveau pour rien. :pfff: 
Ensuite toujours à la même ligne, à quelle feuille la méthode Cells() s'applique-t-elle ? :??: 
Ligne 33, tu précises la propriété Text pour l'une des cellule, pas pour l'autre. Sois plus précis ;) 
Ligne 34, tu écrases une mouche avec un marteau-pilon :lol:  Ceci devrait suffir
  1. FeuilleCible.Cells(j, 12).Value = FeuilleSource.Cells(j, 12).Text
(A la réflexion, pourquoi pas ? Oublie ce que je viens de dire. Ta soluce n'est pas plus mal que ce que je te propose.)
Euh, sans indiscrétion, à quoi te sert i ?
(La solution à ton problème est dans la réponse ;)  )

Réponds à mes questions, essaye de débrouiller un peu ton problème avec les éléments que je te propose...
En attendant, je te prépare une soluce ;) 

Merci Zeb pour les idées.
Pour répondre à ta question, ce programme me permettrait de ne pas avoir à copier les commentaires manuellement d’une semaine à l’autre et d’un fichier à l’autre. Et ce tout en cherchant à chaque fois à quel client appartient un commentaire. De plus les clients changent de ligne d’une semaine à l’autre ou peuvent même disparaitre de mon fichier en cours, s’ils ont déjà réglé leur facture.
J’espère avoir bien répondu à ta question
merci
Expert Programmation

Euh, en fait là, tu paraphrases ce que tu as déjà expliqué.

Les questions sont :
  • A quelle feuille la méthode Cells() s'applique-t-elle ?
  • A quoi te sert i ?
    (T'inquiète, moi j'ai compris. Mais je voudrais que tu t'y penches, juste histoire que tu participes. C'est surtout pour ne pas me donner l'impression que je fais ton boulot à ta place - :spamafote:  )

    Les demandes sont :
  • Sois plus précis
  • Débrouille un peu ton problème

    Allez, un ptit effort de principe et je te propose une soluce....

    zeb a dit :
    Euh, en fait là, tu paraphrases ce que tu as déjà expliqué.

    Les questions sont :
  • A quelle feuille la méthode Cells() s'applique-t-elle ?
  • A quoi te sert i ?
    (T'inquiète, moi j'ai compris. Mais je voudrais que tu t'y penches, juste histoire que tu participes. C'est surtout pour ne pas me donner l'impression que je fais ton boulot à ta place - :spamafote:  )

    Les demandes sont :
  • Sois plus précis
  • Débrouille un peu ton problème

    Allez, un ptit effort de principe et je te propose une soluce....




  • excuse, j'avais pas compris.
    alors pourr cells, il s'as'applique à la feuilleCible
    Quant au i , il me sert de passer d'une ligne à l'autre


    je suis en train te "débrouiller" :)  mon probleme, mais ça ne marche toujours pas. j'essay des tentatives :( 
    Expert Programmation

    Salut,

    >>> alors pourr cells, il s'as'applique à la feuilleCible
    C'est pas évident dans ton code. A revoir.

    >> Quant au i , il me sert de passer d'une ligne à l'autre
    Je ne vois rien en rapport avec ça dans ton code. A revoir.

    Alors, c'est revu ?
    (Montre un peu ce que tu fais...)

    salut zeb,
    j'ai rectifié le cells, qu'en penses tu ?
    je me suis penché sur le i dont tu me parlais et je me suis dit que c'est lui le problème. il faut qu'Excel cherche la premiere valeur de la cellule D2 dans feuille source et puis la compare avec toutes les valeurs de la colonne D, si il trouve dans ce cas il fait le copieé collé. si pas trouvé il passe au suivant.

    Et j'ai trouvé Instr dans l'aide, mais toujours rien, je suis desespérée
    voici mon nouveau code
    1. Sub TEST()
    2. '
    3. 'Ouvrir le classeur "classeurA" qui se trouve dans le chemin ci dessus. Et puis l'activer.
    4. Dim ClasseurSource As Workbook
    5. Workbooks.Open Filename:="\\A19TS-BREFYYKKZ\Utilisateurs\F9596924\Mes Documents\MACROS\ClasseurA.xls"
    6. Set ClasseurSource = ActiveWorkbook
    7.  
    8. Dim ClasseurCible As Workbook
    9. Set ClasseurCible = ThisWorkbook
    10.  
    11. Dim i As Long
    12. Dim j As Long
    13. Dim FeuilleSource As Worksheet
    14. Dim FeuilleCible As Worksheet
    15.  
    16.  
    17. Set FeuilleSource = ClasseurSource.Worksheets("Feuil1")
    18. Set FeuilleCible = ClasseurCible.Worksheets("Feuil1")
    19.  
    20. i = 2
    21.  
    22. For j = FeuilleCible.Cells(65536, 2).End(xlUp).Row To 2 Step -1
    23.  
    24. If InStr(FeuilleSource.Cells(j, i).Text, FeuilleCible.Cells(j, i).Text) Then
    25. FeuilleSource.Cells(j, i).Copy FeuilleCible.Cells(j, i)
    26. i = i + 1
    27.  
    28. Else
    29. End If
    30.  
    31. Next
    32.  
    33.  
    34. ClasseurSource.Close
    35.  
    36. End Sub


    J'ai mis un autre "for i" mais ca ne marchait pas et je l'ai enlevé.

    Je pense que tu m'as assez torturée !! :) 

    attends je teste tout ca puis je te redis.

    merci


    zeb a dit :
    Mais bien sûr qu'il faut ajouter un For i !!!!
    Il faut que tu boucles sur ta source ET sur ta cible.

    M'enfin, c'est quoi ce Instr() que tu nous mets là ?

    Je t'ai dit de virer ce Step -1 ridicule. :o  Parce que si je te dis d'étudier ça, tu fais quoi ?

    1. Dim ClasseurSource As Workbook
    2. Dim ClasseurCible As Workbook
    3. Dim FeuilleSource As Worksheet
    4. Dim FeuilleCible As Worksheet
    5. Dim CelluleSource As Range
    6. Dim CelluleCible As Range
    7.  
    8. Set ClasseurSource = Workbooks.Open(Filename:="C:\Temp\1_MACRO_ffd\ClasseurA.xlsm", ReadOnly:=True)
    9. Set ClasseurCible = ThisWorkbook
    10.  
    11. Set FeuilleSource = ClasseurSource.Worksheets("Feuil1")
    12. Set FeuilleCible = ClasseurCible.Worksheets("Feuil1")
    13.  
    14. For Each CelluleSource In FeuilleSource.Range("D2", FeuilleSource.Cells(.Rows.Count, 4).End(xlUp))
    15. For Each CelluleCible In FeuilleCible.Range("D2", FeuilleCible.Cells(.Rows.Count, 4).End(xlUp))
    16. If CelluleSource.Text = CelluleCible.Text Then
    17. CelluleCible.Offset(, 8).Value = CelluleSource.Offset(, 8).Text
    18. End If
    19. Next
    20. Next
    21. ClasseurSource.Close SaveChanges:=False


    En plus, j'ai optimisé tout ça :
    1. Dim ClasseurSource As Workbook
    2. Dim PlageSource As Range
    3. Dim PlageCible As Range
    4. Dim CelluleSource As Range
    5. Dim CelluleCible As Range
    6.  
    7. Set ClasseurSource = Workbooks.Open(Filename:="C:\Temp\1_MACRO_ffd\ClasseurA.xlsm", ReadOnly:=True)
    8.  
    9. With ClasseurSource.Worksheets(1)
    10. Set PlageSource = .Range("D2", .Cells(65536, 4).End(xlUp))
    11. End With
    12. With ThisWorkbook.Worksheets(1)
    13. Set PlageCible = .Range("D2", .Cells(65536, 4).End(xlUp))
    14. End With
    15.  
    16. For Each CelluleSource In PlageSource
    17. For Each CelluleCible In PlageCible
    18. If CelluleSource.Text = CelluleCible.Text Then
    19. CelluleCible.Offset(, 8).Value = CelluleSource.Offset(, 8).Text
    20. End If
    21. Next
    22. Next
    23. ClasseurSource.Close SaveChanges:=False

    Expert Programmation

    Nan, nan et nan. :non: 
    Je ne t'ai jamais demandé de le tester mais de l'étudier :o 
    Comme ça, si il y a un ptit truc à adapter, c'est à toi de le faire, et tu ne peux pas me répondre "oh l'autre, eh, il a pô fait comme il fallait..."

    :o 

    ... :D 
    Lassé par la pub ? Créez un compte