Copier des lignes avec condition

Fermé
JM - 26 mars 2017 à 16:15
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 28 mars 2017 à 08:53
Bonjour,

Je débute en VBA et je veux faire une code pour copier des lignes d'un classeur vers un autre avec une condition, si quelqu'un peut m'aider svp je serai reconnaissant.
Je vous explique avec un exemple c'est mieux je crois

Exemple:
J'ai deux classeurs Excel :

Classeur 1: "A" qui contient plusieurs feuilles "feuil1", "feuil2"...
Classeur 2: "B" qui contient plusieurs feuilles "feuil1", "feuil2"...
Si la cellule V2 de la "feuil1" du premier classeur "A" contient le texte "toto"
Alors copier toute la 2eme ligne et la coller à la 1ère ligne vide de la "feuil2" du 2eme classeur "CR" (la feuille 2 du 2eme classeur n'est pas vierge)
Sinon on passe à la cellule suivant V3

Données:
Nbr de lignes: i=2 à 5000

Merci d'avance pour votre aide
avec tout mes respects

JM
A voir également:

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié le 27 mars 2017 à 08:16
Bonjour
Je vous explique avec un exemple c'est mieux je crois
ah bon ?
par exemple: tu as besoin de copier les 16384 colonnes d'un ligne ?
on copie que les valeurs , les cellules avec ou sans leur format et/ou leurs formules?
les classeurs sont ils dans le m^me dossier ?
etc
sans boule cristal, ce qui serait réellement mieux

mettre les 2 classeurs dans un .Zip (et non dans un .rar) et
Mettre les classeurs sans données confidentielles en pièce jointe sur « mon-partage.fr »
et faire un clic droit-coller le raccourci dans votre message

Dans l’attente

 Michel
0
Bonjour Michel,

Merci pour ta réponse.

Désolé je n'avais pas précisé le nombre de colonne, j'ai 20 colonnes dans mon tableau, pas de formule (le format des cellules c'est soit un texte, nombre ou une date)
Les deux classeurs je pourrai les mettre dans le même dossier si ça facilite le code.
Vu que les deux classeurs sont très lourd, j'ai supprimé les autres feuilles, et j'ai laissé que quelques lignes dans mon tableau. Voici le lien pour accéder aux classeurs :

https://mon-partage.fr/f/kQzgmk7i/

Merci d'avance pour ton aide,
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
27 mars 2017 à 11:50
Bien reçu mais...

V2= "toto" ???? pas de colonne V utilisée, "toto" inconnu

classeur source ?
classeur cible ?
0
Classeur Source = Classeur pièce forum
Classeur Cible = Classeur suivi forum

Alors, la colonne V devient la colonne U vu que j'ai supprimé une colonne ou il y avait des informations confidentielles,
"toto" = "A rajouter"

Je suis désolé, je n'avais pas précisé ça dans le message précédent

Merci beaucoup Michel_m
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
27 mars 2017 à 14:58
pourquoi l'appel de la dernière ligne non vide m'envoie à la derniere ligne du classeur (ctrl+fin)soit 1048576 a lors que tu annonces 5000 lignes????
de ce fait la durée de traitement est longue....

proposition
Option Explicit
Const Mot As String = "A rajouter"
'----------------------------------------------------------------
Sub mettre_a_jour()
Dim Derlig As Integer, Nbre As Integer, T_test, T_piece
Dim Cptr As Integer, Index As Integer, Col As Byte
Dim Chemin As String, Ligvid As Integer

With Sheets("EQPT POST PR MODULE METH")
'-----------------------------------------initialisations
Derlig = .Columns("U").Find(what:=Mot, searchdirection:=xlPrevious).Row
Nbre = Application.CountIf(.Columns("U"), Mot)
End With
'tableau des "a rajouter"
T_test = Range("A2:U" & Derlig)
'détermination du tableau des données à rajouter dans le classeur cible
ReDim T_piece(1 To Nbre, 1 To 21)

'--------------------------------------------traitement
For Cptr = 1 To UBound(T_test)
If Index = Nbre Then: Exit For
If T_test(Cptr, 21) = Mot Then
Index = Index + 1
For Col = 1 To 20
T_piece(Index, Col) = T_test(Cptr, Col)
T_piece(Index, 21) = "A JOUR"
Next
End If
Next

'-------------------------------------------restitution
Chemin = ThisWorkbook.Path
Workbooks.Open (Chemin & "\" & "Classeur suivi forum.xlsx")

With Sheets("EQPT POST PR MODULE METH")
Ligvid = Columns("A").Find(what:="", after:=.Range("A1")).Row
.Cells(Ligvid, "A").Resize(Nbre, 21) = T_piece
.Range(.Cells(Ligvid, "A"), .Cells(Ligvid + Nbre, "U")).Borders.Weight = xlThin
End With

ThisWorkbook.Saved = True 'ferme le classeur source
End Sub



faut que je parte car je suis à la bourre
  • ad taleur


0
T'as essayé le code chez toi ? parce que moi ça me donne une erreur à la première ligne du code:
 Derlig = .Columns("U").Find(what:=Mot, searchdirection:=xlPrevious).Row

erreur d'execution "91" (variable objet ou variable bloc With non définie)

J'arrive pas à trouver le problème...

Sinon pour les 5000 lignes que j'ai annoncé au début c'est une approximation du nombre réel des lignes non vides dans le classeur original, je ne sais pas pourquoi il t'envoie à la dernière ligne du classeur, normalement il doit t'envoyer à la ligne 25

j'attend ton retour =) merciiii
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
28 mars 2017 à 08:53
T'as essayé le code chez toi?
Bravo!
Quand je me donne la peine de résoudre un problème pour aider quelqu'un, imagine toi qu'il est TOUJOURS testé.

Chez moi ca marche et je viens quand m^me de réessayer: c'est OK
https://mon-partage.fr/f/R4JxBBbw/


la lenteur avec laquelle les 2 classeurs s'ouvrent et se ferment indique un grand nombre de cellules non vides. d'où le test avec Ctrl+fin qui m'a envoyer sur la dernière ligne ---> feuille "sale"
0