Feuilles qui sautillent au déclenchement du code

Bonjour

J'ai se code sur un bouton pour effacer certaines plages, le problème c'est que ça saute au niveau de la feuille ou se trouve le bouton.

Avez vous une solution à me proposer pour éviter ce problème.

Je vous remercie

Private Sub CommandButton7_Click()
    If MsgBox("Etes-vous certain de vouloir supprimer les résultats ?", vbYesNo, "Demande de confirmation") = vbYes Then

Worksheets("Poule1").Range("H2:L7").ClearContents
Worksheets("Poule1").Range("O2:S7").ClearContents
Worksheets("Poule2").Range("H2:L7").ClearContents
Worksheets("Poule2").Range("O2:S7").ClearContents
Worksheets("Poule3").Range("H2:L7").ClearContents
Worksheets("Poule3").Range("O2:S7").ClearContents
Worksheets("Poule4").Range("H2:L7").ClearContents
Worksheets("Poule4").Range("O2:S7").ClearContents
Worksheets("Poule5").Range("H2:L7").ClearContents
Worksheets("Poule5").Range("O2:S7").ClearContents
Worksheets("Poule6").Range("H2:L7").ClearContents
Worksheets("Poule6").Range("O2:S7").ClearContents
Worksheets("Poule7").Range("H2:L7").ClearContents
Worksheets("Poule7").Range("O2:S7").ClearContents
Worksheets("Poule8").Range("H2:L7").ClearContents
Worksheets("Poule8").Range("O2:S7").ClearContents

Worksheets("Tableau1a16").Range("D3,d7,d9,d13,d19,d23,d27,d31,d35,d39,d43,d47,d51,d55,d59,d63").ClearContents
Worksheets("Tableau1a16").Range("F4,f12,f20,f28,f36,f44,f52,f60").ClearContents
Worksheets("Tableau1a16").Range("H8,h24,h40,h56").ClearContents
Worksheets("Tableau1a16").Range("J16,J48").ClearContents
Worksheets("Tableau1a16").Range("J63,J64").ClearContents
Worksheets("Tableau1a16").Range("O7,O8,O11,O12,O15,O16,O19,O20").ClearContents
Worksheets("Tableau1a16").Range("O51,O52,O55,O56").ClearContents
Worksheets("Tableau1a16").Range("Q7,Q11,Q15,Q19,Q27,Q31,Q39,Q40,Q51,Q55,Q63,Q64").ClearContents
Worksheets("Tableau1a16").Range("S8,s16,s23,s24,s28,s31,s39,s40").ClearContents
Worksheets("Tableau17a32").Range("D3,d7,d9,d13,d19,d23,d27,d31,d35,d39,d43,d47,d51,d55,d59,d63").ClearContents
Worksheets("Tableau17a32").Range("F4,f12,f20,f28,f36,f44,f52,f60").ClearContents
Worksheets("Tableau17a32").Range("H8,h24,h40,h56").ClearContents
Worksheets("Tableau17a32").Range("J16,J48").ClearContents
Worksheets("Tableau17a32").Range("J63,J64").ClearContents
Worksheets("Tableau17a32").Range("O7,O8,O11,O12,O15,O16,O19,O20").ClearContents
Worksheets("Tableau17a32").Range("O51,O52,O55,O56").ClearContents
Worksheets("Tableau17a32").Range("Q7,Q11,Q15,Q19,Q27,Q31,Q39,Q40,Q51,Q55,Q63,Q64").ClearContents
Worksheets("Tableau17a32").Range("S8,s16,s23,s24,s28,s31,s39,s40").ClearContents
MsgBox "Les résultats ont été effacé !"
 End If
End Sub

Bonjour

Votre code comme ceci

Private Sub CommandButton7_Click()
Dim i As Byte
    If MsgBox("Etes-vous certain de vouloir supprimer les résultats ?", vbYesNo + vbQuestion + vbDefaultButton2, "Demande de confirmation") = vbYes Then
    Application.ScreenUpdating = False
    For i = 1 To 7
        Worksheets("Poule" & i).Range("H2:L7, O2:S7").ClearContents
    Next i
    With Worksheets("Tableau1a16")
        .Range("D3,d7,d9,d13,d19,d23,d27,d31,d35,d39,d43,d47,d51,d55,d59,d63").ClearContents
        .Range("F4,f12,f20,f28,f36,f44,f52,f60").ClearContents
        .Range("H8,h24,h40,h56").ClearContents
        .Range("J16,J48").ClearContents
        .Range("J63:J64").ClearContents
        .Range("O7:O8,O11:O12,O15:O16,O19:O20").ClearContents
        .Range("O51,O52,O55:O56").ClearContents
        .Range("Q7,Q11,Q15,Q19,Q27,Q31,Q39:Q40,Q51,Q55,Q63:Q64").ClearContents
        .Range("S8,s16,s23:s24,s28,s31,s39:s40").ClearContents
    End With
    With Worksheets("Tableau17a32")
        .Range("D3,d7,d9,d13,d19,d23,d27,d31,d35,d39,d43,d47,d51,d55,d59,d63").ClearContents
        .Range("F4,f12,f20,f28,f36,f44,f52,f60").ClearContents
        .Range("H8,h24,h40,h56").ClearContents
        .Range("J16,J48").ClearContents
        .Range("J63:J64").ClearContents
        .Range("O7:O8,O11:O12,O15:O16,O19:O20").ClearContents
        .Range("O51,O52,O55,O56").ClearContents
        .Range("Q7,Q11,Q15,Q19,Q27,Q31,Q39:Q40,Q51,Q55,Q63:Q64").ClearContents
        .Range("S8,s16,s23,s24,s28,s31,s39:s40").ClearContents
    End With
    MsgBox "Les résultats ont été effacé !"
    Application.ScreenUpdating = True
End If
End Sub

Si ok, pensez à cloturer le fil

Cordialement

Bonsoir,

Dan bonsoir,

Ce que Dan vous propose c'est d'arrêter la mise à jour de l'écran Excel lors du fonctionnement du code par l'instruction : Application.ScreenUpdating = False
Lorsque tout est fini on remet en "marche" la mise à jour de l'écran par Application.ScreenUpdating = True.

Cette dernière instruction n'est pas utile si vous arrivez à la fin de votre procédure, mais c'est plus propre, on sait où l'on en est.

Cette instruction est souvent employée avec Application.Calculation = xlCalculationManual qui arrête les calculs éventuels présent dans le classeur qui pourraient être lancés suite à la suppression de certaines valeurs.
Par contre cette instruction doit être remise "en marche" avant la fin de la procédure par : Application.Calculation = xlCalculationAutomatic

Tout ceci participe à l'accélération de l'exécution du code VBA.

@ bientôt

LouReeD

Bonjour

@LooReed : je n'ai pas compris votre intervention... Le code parait clair puisque rien ne change à part ces deux instructions au début et à la fin.

@Joco1975 : pour faire simple, retenez que l'instruction "Screenupdating" évite le rafraichissement à l'écran.
La mettre à valeur True à la fin n'est pas toujours nécessaire car Excel remet à valeur True en sortant du code. Là c'est plutôt une prudence pour le cas où vous feriez appel à d'autres macros pendant l'exécution de celle où vous utilisez cette instruction.

Cordialement

Bonjour,

pardonnez moi, je pensais qu'on était sur un forum d'échange...
Ce qui me posait problème "à mon arrivée" en 2014 c'est que souvent les réponses étaient communiquées mais sans trop d'explications.

Mon seul but était de préciser le pourquoi du comment.
Et contrairement à votre remarque, ce n'était pas la seule chose modifiée du code : il y a la boucle des poules, puis l'utilisation des With et End With...

Mais je le note...

@ bientôt

LouReeD

re

pardonnez moi, je pensais qu'on était sur un forum d'échange...

Evidemment, je n'ai pas dit le contraire
C'est juste que l'instruction ajoutée saute aux yeux que cela résoud le problème.
J'attendais le retour de Joco pour le lui expliquer si besoin mais bon il n'est pas novice non plus que ce soit sur ce forum ou sur d'autres forums.

Ce qui me posait problème "à mon arrivée" en 2014 c'est que souvent les réponses étaient communiquées mais sans trop d'explications.

Quelques fois oui et encore toujours aujourd'hui pour certains.

Cordialement

Bonjour Dan

Merci pour ton aide ça fonctionne à merveille,

j'ai fait une petite rectif ici il y a 8 poules

For i = 1 To 7
Cordialement

Bonjour à tous ,

On peut réduire le code -> c'est plus joli :

Private Sub CommandButton7_Click()
Dim i&, nom
   If MsgBox("Etes-vous certain de vouloir supprimer les résultats ?", vbYesNo, "Demande de confirmation") = vbYes Then
      Application.ScreenUpdating = False
      For i = 1 To 8
         Sheets("Poule" & i).Range("H2:L7").ClearContents
         Sheets("Poule" & i).Range("O2:S7").ClearContents
      Next
      For Each nom In Array("Tableau1a16", "Tableau17a32")
         With Sheets(nom)
            .Range("D3,d7,d9,d13,d19,d23,d27,d31,d35,d39,d43,d47,d51,d55,d59,d63").ClearContents
            .Range("F4,f12,f20,f28,f36,f44,f52,f60").ClearContents
            .Range("H8,h24,h40,h56").ClearContents
            .Range("J16,J48").ClearContents
            .Range("J63,J64").ClearContents
            .Range("O7,O8,O11,O12,O15,O16,O19,O20").ClearContents
            .Range("O51,O52,O55,O56").ClearContents
            .Range("Q7,Q11,Q15,Q19,Q27,Q31,Q39,Q40,Q51,Q55,Q63,Q64").ClearContents
            .Range("S8,s16,s23,s24,s28,s31,s39,s40").ClearContents
         End With
      Next nom
   End If
End Sub

...

Oui !

et si toutes ces cellules on les regroupe dans un nom sous Excel c'est encore plus simple ! Mais je crois qu'il y a une limite au nombre de cellules non contiguës pouvant être définie dans un nom, non ?

      For Each nom In Array("Tableau1a16", "Tableau17a32")
         Sheets(nom).Range(Range("MaSélection").Address).ClearContents
      Next nom

Il suffit de créer un nom en sélectionnant les cellules sur la première feuille et le tour est joué...
si un jour la sélection devait changer, soit par déplacement de cellule soit par ajout/suppression de cellules, il n'y aura pas besoin de revenir sur le code VBA, les modifications se feront sur la feuille "principale"

Mais pourquoi avoir mis les "poules" sur deux lignes ?

@ bientôt

LouReeD

Bonjour LouReeD ,

Le Monsieur, il a écrit :

Mais pourquoi avoir mis les "poules" sur deux lignes ?

(C'est pour faire une course type "tiercé avec handicap" avec les huit poules et voir celle qui va gagner)

En fait uniquement pour conserver la structure de l'ordre et des définitions des différentes plages. L'utilisateur a sans doute suivi (visuellement et avec du sens pour lui) les plages devant être effacées. En conservant cette énumération, le code sera plus facile à vérifier et/ou à modifier (plages dans les poules et par colonne dans les autres). Il ne faut pas aller chercher plus loin mais c'était voulu.

C'est pour la même raison que j'utilise les noms personnalisés avec parcimonie. Quand la définition du nom devient très longue, c'est une galère (pour moi) d'y retrouver une erreur ou de modifier la définition du nom.

image
Rechercher des sujets similaires à "feuilles qui sautillent declenchement code"