Copier des lignes avec condition

JM -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
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

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. JM
       
      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
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bien reçu mais...

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

    classeur source ?
    classeur cible ?
    0
    1. JM
       
      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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. JM
       
      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
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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