Eviter les "select"

Y compris Power BI, Power Query et toute autre question en lien avec Excel
p
ponturio
Nouveau venu
Nouveau venu
Messages : 7
Appréciation reçue : 1
Inscrit le : 20 mai 2019
Version d'Excel : 2013

Message par ponturio » 26 mai 2019, 10:46

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
A
AlgoPlus
Membre dévoué
Membre dévoué
Messages : 566
Appréciations reçues : 46
Inscrit le : 27 février 2019
Version d'Excel : 2003

Message par AlgoPlus » 26 mai 2019, 10:58

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+
G
Gli73
Membre fidèle
Membre fidèle
Messages : 294
Appréciations reçues : 37
Inscrit le : 12 avril 2019
Version d'Excel : PC 2013
Contact :

Message par Gli73 » 26 mai 2019, 11:36

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.JPG
Capture 20190526 001.JPG (10.38 Kio) Vu 79 fois
Excelement Vôtre
Cogito ergo Excel
Per espera ad Excel

Développeur Indépendant sur Excel et 40 ans d'expérience informatique, je peux vous aider à apporter une touche "pro" à vos réalisations !
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 934
Appréciations reçues : 125
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 26 mai 2019, 17:11

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
p
ponturio
Nouveau venu
Nouveau venu
Messages : 7
Appréciation reçue : 1
Inscrit le : 20 mai 2019
Version d'Excel : 2013

Message par ponturio » 27 mai 2019, 08:52

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 :wink:

Excellente journée à vous !
1 membre du forum aime ce message.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message