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 SubBonjour
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 SubSi 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 7CordialementBonjour à 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 nomIl 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.