Optimisation Macro

antoinelm Messages postés 4 Statut Membre -  
Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je souhaite optimiser le code suivant qui a pour but d'ajouter une ligne et des informations sur cette ligne en cas de présence d'une cellule non vide dans la colonne 19 suite au copier-coller d'un autre fichier Excel.

Merci donc de m'aider à l'optimiser :

Sub insère_ligne1()
Dim lig As Long

Application.ScreenUpdating = False

For lig = ActiveSheet.Cells(Columns(9).Cells.Count, 9).End(xlUp).Row To 4 Step -1
If Not IsEmpty(Cells(lig, 19)) Then

Rows(lig + 1).Insert
Rows(lig + 1).Interior.Color = RGB(191, 191, 191)
Cells(lig + 1, 1).FormulaR1C1 = Cells(lig, 1).FormulaR1C1
Cells(lig + 1, 5).FormulaR1C1 = Cells(lig, 5).FormulaR1C1
Cells(lig + 1, 12).Value = Cells(lig, 19).Value

Sheets("Date Rétroplanning").Rows(lig - 1).Insert

For i = 37 To 42
Cells(lig + 1, i).FormulaR1C1 = Cells(lig, i).FormulaR1C1

Next i

For i = 1 To 50
Sheets("Date Rétroplanning").Cells(lig - 1, i).FormulaR1C1 = Sheets("Date Rétroplanning").Cells(lig - 2, i).FormulaR1C1

Next i

Cells(lig + 1, 12).Value = Cells(lig, 19).Value

For i = 2 To 4
Cells(lig + 1, i).Value = Cells(lig, i).Value
Next i

For i = 9 To 11
Cells(lig + 1, i).Value = Cells(lig, i).Value
Next i

For i = 20 To 21
Cells(lig + 1, i).Value = Cells(lig, i).Value
Next i

Cells(lig + 1, 36).Value = Cells(lig, 36).Value
Cells(lig, 19).ClearContents

End If

Next lig

End Sub


De plus,j'aimerais enregistrer la date de copier coller d'informations dans une cellule suite au copier-coller effectué. J'ai le code suivant mais celui-ci est valide en cas de modification de cellule, ce qui n'inclut pas les copier-coller :

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
If Target.Column = 16 Then Target.Offset(0, 31).Value = Date

End Sub


Je reste à votre disposition pour tout complément d'informations.

En vous remerciant pour votre aide.

Antoine

4 réponses

  1. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    Bonjour,
    Eh bien, la procédure est optimale puisqu'aucune base n'est présente comme point de référence ..... ?
    Eventuellement insérer l'instruction qui suit avant la fin de la procédure :
    Application.ScreenUpdating = True
    Désolé.

    Salutations.
    Le Pingou
    0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Tu peux remplacer tes boucles :
    For i = 37 To 42
       Cells(lig + 1, i).FormulaR1C1 = Cells(lig, i).FormulaR1C1
    Next i 

    par :
    Cells(lig + 1, 37).resize(,6).FormulaR1C1 = Cells(lig, i).FormulaR1C1


    eric

    edit :
    celui-ci est valide en cas de modification de cellule, ce qui n'inclut pas les copier-coller
    Normalement un collé génère bien un évènement Change.

    En essayant continuellement, on finit par réussir.
    Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
    En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
    0
    1. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
       
      Merci à toi, eriiic, je ne connaissais pas cette manière de procéder.
      N'y a-t-il pas une petite erreur pour la valeur copier qui est dépendante de [i] ... ?
      Amicales salutations.
      Le Pingou
      0
  3. antoinelm Messages postés 4 Statut Membre
     
    Bonjour,

    Merci pour vos réponses mais cela génère une erreur 1004 liée à la dépendance du i...

    En ce qui concerne l'évènement change, mon copier-coller affectant une plage de cellules et pas seulement une cellule, il est impossible d'enregistrer les dates avec ce code. Merci de m'indiquer une autre solution.

    Cordialement
    0
  4. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    Bonjour,
    Vous apportez une petite correction à la proposition de eriiic (salutations) et ce sera bon.
    La ligne doit être :
    Cells(lig + 1, 37).Resize(, 6).FormulaR1C1 = Cells(lig, 37).Resize(, 6).FormulaR1C1

    Concernant la suite je vous répète ceci:
    Eh bien, la procédure est optimale puisqu'aucune base n'est présente comme point de référence ..... ?
    0