VBA - Simplification "copier/coller" Excel

Résolu
Bonjour,

J'ai une macro VBA qui est assez longue, je cherche à réduire son temps de traitement en réécrivant mon programme en un language simplifié.

Voici un morceau de la base:

L = 5 
For I = 5 To 700         
    If [Conditions...] Then 

        Sheets("arrivée").Cells(L, 5) = Sheets("départ").Cells(I, 5) 
        Sheets("arrivée").Cells(L, 7) = Sheets("départ").Cells(I, 7) 
        Sheets("arrivée").Cells(L, 8) = Sheets("départ").Cells(I, 8) 
        Sheets("arrivée").Cells(L, 9) = Sheets("départ").Cells(I, 9) 
        Sheets("arrivée").Cells(L, 10) = Sheets("départ").Cells(I, 10) 
        Sheets("arrivée").Cells(L, 11) = Sheets("départ").Cells(I, 11) 
        Sheets("arrivée").Cells(L, 13) = Sheets("départ").Cells(I, 13) 
        Sheets("arrivée").Cells(L, 14) = Sheets("départ").Cells(I, 14) 
        Sheets("arrivée").Cells(L, 15) = Sheets("départ").Cells(I, 15) 
        Sheets("arrivée").Cells(L, 16) = Sheets("départ").Cells(I, 16) 
        Sheets("arrivée").Cells(L, 17) = Sheets("départ").Cells(I, 17) 
        Sheets("arrivée").Cells(L, 18) = Sheets("départ").Cells(I, 18) 
        Sheets("arrivée").Cells(L, 19) = Sheets("départ").Cells(I, 19) 

        L = L + 1 
    End If 
Next I


J'ai cherché à partir sur une autre base telle que :

L = 5 
For I = 5 To 700         
    If [Conditions...] Then 

        Sheets("départ").Range(Cells(I, 5), Cells(I, 19)).Copy 
        Sheets("arrivée").Range(Cells(L, 5), Cells(L, 19)).Paste 

        L = L + 1 
    End If 
Next I


Je pense ne pas être loin mais ma seconde ligne doit être débogé...
Pouvez-vous m'aider ?

Cordialement,
Ano

3 réponses

  1. J'ai une autre question, comment faire pour que seulement les valeurs soient copiées et non le format ?

    Je me doute qu'un ".Values" doit trainer quelque part mais où et comment ?!!
    0
    1. Contributeur
      Bonjour

      pour aller vite

      Application.ScreenUpdating = False
      If [Conditions...] Then
            With Sheets("arrivée")
                .Range("E5:S700") = Sheets("départ").Range("E5:S700").Value
                .Columns("F").ClearContents
                .Columns("L").ClearContents
           End With
      End If
      

      Michel
      0
      1. >michel re-bonjour
        vu son code, je pense que la condition est évaluée à chacune des lignes i
        bonne fin d'après midi
        0
      2. Contributeur
        Ah oui, OK t'as raison....je reprend ma copie

        alors en me basant sur ton code

        Application.ScreenUpdating = False 
        L = 5 
        For I = 5 To 700
            If [Condition] Then 
                Sheets("arrivée").Range(Cells(L, 5), Cells(L, 19))=Sheets("départ").Range(Cells(I, 5), Cells(I, 19))
                L = L + 1 
            End If 
        Next I 
        

        merci et bonne soirée
        0
      3. Merci, j'avais déjà essayé cette méthode mais elle ne fonctionne pas! O_o
        0
    2. bonjour

      quelque chose comme ça

      Const limax = 700 
      Const Condition = True 
      
      Public Sub Kopi() 
      Application.ScreenUpdating = False 
      L = 5 
      For I = 5 To limax 
          If Condition Then 
              Sheets("départ").Range(Cells(I, 5), Cells(I, 19)).Copy Sheets("arrivée").Cells(L, 5) 
              L = L + 1 
          End If 
      Next I 
      Application.ScreenUpdating = True 
      End Sub

      bonne suite
      -1
      1. Parfait, ça fonctionne nickel !!

        Un grand merci!!
        0
      2. J'ai une autre question, comment faire pour que seulement les valeurs soient copiées et non le format ?

        Je me doute qu'un ".Values" doit trainer quelque part mais où et comment ?!
        0
      3. If Condition Then 
                Sheets("départ").Range(Cells(I, 5), Cells(I, 19)).Copy 
                Sheets("arrivée").Cells(L, 5).PasteSpecial Paste:=xlPasteValues 
                L = L + 1 
            End If 


        bonne suite
        0
      4. merci
        0