Aide à l'optimisation de son code VBA

Bonjour à tous !

J'aimerais optimiser mon code en enlevant les .Select, .activate et en ne copiant que les cellules que j'ai et non toutes les lignes.

Mon code est le suivant :

Sub Calcul()

Dim numero As Integer
Dim ligVide As Integer
Dim ligne As Integer
Dim Formule As String

ligVide = 1
numero = 4
Sheets("Bilan").Activate
Cells.Select
Selection.Delete Shift:=xlUp

Sheets("Base de données cogé").Activate
For ligne = 4 To 22
    Sheets("Base de données cogé").Activate
    Cells(2, 1) = Cells(numero, 1)

    Sheets("Temps de retour").Activate
    Range("A59:A62,A67,A79:A83").EntireRow.Copy
    Sheets("Bilan").Activate
    Cells(ligVide, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues
    Selection.PasteSpecial Paste:=xlPasteFormats

    numero = numero + 1
    ligVide = ligVide + 11

Next
Sheets("Base de données cogé").Activate
Formule = "='Temps de retour'!D57"
Range("A2").Formula = Formule

End Sub

Avez vous des idées ? J'ai essayé de faire des range("..").copy destination:= ... Mais il me jette à chaque fois car je pense qu'il aime pas la sélection multiple.. J'avoue être un peu coincé et mon code n'est pas très rapide alors si vous avez idée s'il vous plait

Rebonjour,

Je rectifie mon code mis précédemment que je viens de changer :

Sub Calcul()

Dim numero As Integer
Dim ligVide As Integer

Application.EnableEvents = False
ligVide = 1
numero = 4
Sheets("BILAN").Cells.Delete Shift:=xlUp

Do While Sheets("Base de données cogé").Cells(numero, 1) <> ""

    Sheets("Base de données cogé").Cells(2, 1) = Sheets("Base de données cogé").Cells(numero, 1)
    Sheets("Temps de retour").Range("A59:A62,A67,A79:A83").EntireRow.Copy

    With Sheets("Bilan")
    Cells(ligVide, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues
    Selection.PasteSpecial Paste:=xlPasteFormats
    End With

    numero = numero + 1
    ligVide = ligVide + 11

Loop

Application.CutCopyMode = False
Sheets("Base de données cogé").Range("A2").Formula = "='Temps de retour'!D57"
Application.EnableEvents = True

End Sub

J'ai toujours la même question? Il fonctionne mais est qu'il y a plus jolie et plus rapide ?

Merci d'avance de votre aide

Bonjour,

A tester

Sub Calcul()

Dim numero As Integer
Dim ligVide As Integer
Dim ligne As Integer
Dim Formule As String

ligVide = 1
numero = 4
Sheets("Bilan").Cells.Delete Shift:=xlUp

Sheets("Base de données cogé").Activate
For ligne = 4 To 22
    Cells(2, 1) = Cells(numero, 1)

    Sheets("Temps de retour").Range("A59:A62,A67,A79:A83").EntireRow.Copy
    Sheets("Bilan").Cells(ligVide, 1).PasteSpecial Paste:=xlPasteValues
     Sheets("Bilan").Cells(ligVide, 1).PasteSpecial Paste:=xlPasteFormats
    numero = numero + 1
    ligVide = ligVide + 11

Next
Formule = "='Temps de retour'!D57"
Sheets("Base de données cogé").Range("A2").Formula  = Formule

End Sub

Déjà, sans les select et les activate, ça devrai être plus rapide. Maintenant, sans fichier, difficile de voir l'amélioration...

Cordialement

Bonjour,

Ceci marche et c'est plus rapide qu'avant !

Cela rentre dans mes clou donc je ne pense pas aller plus loin pour le coup.

Je laisse le sujet ouvert jusqu'a ce soir, au cas où quelqu'un aurait une autre idée mais celle ci fonctionne !

Encore merci de ton aide !

Bonjour toutes et tous

coucou besoin_d_aide

facultatif 1er post:

Dim numero%, ligVide%

https://www.excel-pratique.com/fr/vba/variables.php

2ème post

Dim numero%, ligVide% ,ligne%

Dim Formule$

facultatif:

Application.EnableEvents = True (tu peux supprimer)

j'aurais mis aussi en cas d'erreur

on Error Goto 0 (pas certain à voir)

attend l'avis d'un expert

crdlt,

André

Bonjour,

A l'aveugle, sans fichier !...

Option Explicit

Sub Calcul()
Dim ws As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Dim numero As Long, ligVide As Long, ligne As Long

    Set ws = Worksheets("Bilan")
    Set ws2 = Worksheets("Base de donn?es cog?")
    Set ws3 = worksSheets("Temps de retour")

    ws.Cells.Clear

    ligVide = 1: numero = 4

    For ligne = 4 To 22
        ws2.Cells(2, 1) = ws2.Cells(numero, 1)
        ws3.Range("A59:A62,A67,A79:A83").EntireRow.Copy
        With ws.Cells(ligVide, 1)
            .PasteSpecial Paste:=xlPasteValues
            .PasteSpecial Paste:=xlPasteFormats
        End With
        numero = numero + 1
        ligVide = ligVide + 11
    Next

    ws2.Range("A2").Value = ws3.Cells(57, 4).Value

End Sub

Re,

Salut Andre13, coucou Jean-Eric

Et le second code

Sub Calcul()

Dim numero As Integer
Dim ligVide As Integer

ligVide = 1
numero = 4
Sheets("BILAN").Cells.Delete Shift:=xlUp

Do While Sheets("Base de données cogé").Cells(numero, 1) <> ""

    Sheets("Base de données cogé").Cells(2, 1) = Sheets("Base de données cogé").Cells(numero, 1)
    Sheets("Temps de retour").Range("A59:A62,A67,A79:A83").EntireRow.Copy

    Sheets("Bilan").Cells(ligVide, 1).PasteSpecial

    numero = numero + 1
    ligVide = ligVide + 11

Loop
Application.CutCopyMode = False
Sheets("Base de données cogé").Range("A2").Formula = "='Temps de retour'!D57"

End Sub

A toi de choisir lequel est le mieux pour toi

Cordialement

Merci à vous tous pour votre aide !

J'ai de quoi choisir et avec des premiers tests ils sont tous à première vu autant rapide !

Encore merci !

Rechercher des sujets similaires à "aide optimisation code vba"