Eviter les "select"

Bonjour à tous,

Je débute en vba . J'ai créé une macro afin de la relier à un bouton qui enregistre les nouvelles données saisies par un utilisateur. Cette macro fonctionne très bien par contre ce n'est pas très esthétique car j'ai des onglets qui s'ouvrent et se ferment (après avoir ôter puis remis la protection des feuilles). j'ai bien compris que cela est dû à mes "select" dans mon code mais je ne sais pas comment l'éviter.

Quelqu'un aurait-il une solution à me proposer?

Merci d'avance pour votre aide !

Sub enregistrer()

Dim ligne

ligne = Sheets("base").Range("J1").Value

If Range("saisi").Value > 0 Then

MsgBox ("Semaine déja saisie")

Exit Sub

End If

Range("G8").Select

Selection.Copy

Sheets("base").Select

Range("A" & ligne).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Sheets("Saisie").Select

Application.CutCopyMode = False

Range("G10").Select

Selection.Copy

Sheets("base").Select

Range("B" & ligne).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Sheets("Saisie").Select

Application.CutCopyMode = False

Range("G12").Select

Selection.Copy

Sheets("base").Select

Range("C" & ligne).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Sheets("Saisie").Select

Application.CutCopyMode = False

Range("G14").Select

Selection.Copy

Sheets("base").Select

Range("D" & ligne).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Sheets("Saisie").Select

Application.CutCopyMode = False

Sheets("Résul réel").Select

Range("F12").Select

Selection.Copy

Sheets("base").Select

Range("E" & ligne).Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Sheets("Saisie").Select

ActiveWorkbook.Save

End Sub

Bonjour,

de plus les select rendent la lecture du code malaisée...

Plutôt que de sélectionner physiquement (affichage) une feuille ou une cellule pour y faire une "opération", il vaut mieux désigner cette feuille (cette cellule) dans l'instruction :

Sheets("Saisie").Select
Range("G10").Select
Selection.Copy

devient

Sheets("Saisie").Range("G10").Copy

la feuille "Saisie" n'est pas affichée, et le code est plus clair.

A+

Bonjour

La réponse est dans le titre de ton fil !

Eviter (à tout prix) les select !

En effet ils ne servent à rien la plupart du temps !

Il ne faut les utiliser que pour positionner effectivement le pointeur de cellule sur une cellule précise, pas pour faire des copies !

La bonne méthode pour une copie doit avoir une forme de ce genre :

Worksheets(ongletSource).Cells(celluleSource).Copy Worksheets(ongletDestination).Cells(celluleDestination)

ainsi pas de déplacement du pointeur de cellule donc pas "swaping" d'onglet, et aussi plus de rapidité d'exécution !


Mais il y a encore mieux !

1) Il faut déclarer les onglets dont tu as besoin au départ de la macro avec (dans la partie déclaration, du module ou de la procédure, selon les besoins)

Dim ongletSource  As Object

2) Il faut ensuite l'initialiser dans les 1ère lignes du code (avant les lignes du corps de procédure)

Set ongletSSource = Worksheets("sonNom")

3) Puis enfin dans le corps de procédure, il suffit d'utiliser des structures de lignes telles que :

3.1)

ongletSource.Activate

3.2)

ongletSource.Cells(celluleSource).Copy ongletDestination.Cells(celluleDestination)

3.3) ou encore plus rapide, il peut être pertinent d'utiliser une structure With/End With

With ongletSource
         ' faire tout ce qu'il y a faire sur cet onglet
         ' si il faut utiliser "en cours de ce bloc With/End WIth un autre onglet 2 solutions
         ' 1) une nouvelle structure With/End With
         With ongletTemporaire
                  ' faire tout ce qu'il y a faire sur cet onglet
         End With
         ' 2) utiliser l'une des déclaration d'objet
         ongletTemporaire.faireCela
End With

Plus rapide en exécution pour Excel et pour nous à saisir, et à mon goût plus lisible !


Petite astuce supplémentaire pour accélérer encore plus le code, tu peux utiliser

Application.ScreenUpdating = True/False

à mettre False en début de procédure ou traitement

et à True en fin de procédure ou traitement

L'écran n'est plus "rafraichit" donc plus de flashing !


PS/ Quand tu déposes un code dans ton message, tu peux utiliser la balise "code" pour le mettre en forme, la lecture est plus aisée, car identique à la mise en forme de VBE!

capture 20190526 001

Bonjour à tous,

Une proposition :

Sub enregistrer()
Dim T(4) As Variant, i As Integer

    If Range("saisi").Value > 0 Then
        MsgBox ("Semaine déja saisie")
        Exit Sub
    End If

    For i = 0 To 3
        T(i) = Sheets("Saisie").Range("G" & 8 + (i * 2)).Value
    Next i
    T(4) = Sheets("Résul réel").Range("F12").Value

    With Sheets("base")
        .Range("A" & .Range("J1").Value).Resize(1, 5) = T
    End With

    ThisWorkbook.Save
End Sub

Pierre

Bonjour à tous,

Merci beaucoup Pierrep56, Gli73, AlgoPLus pour vos conseils très pertinents.

Promis, je vais m'améliorer et m'inspirer de vos conseils très pertinents pour m'améliorer

Excellente journée à vous !

Rechercher des sujets similaires à "eviter select"