Macro pour vider plusieurs plages de données

Bonjour à toutes et à tous,

Je cherche à coder une fonction VBA qui me permette de vider plusieurs plages de cellules contenant des données brutes et distantes entre elles via une sorte de bouton "Reset" (cf. fichier joint).

Je souhaiterais également savoir si après avoir cliqué sur ce bouton, il est possible de revenir en arrière par un ctrl+z ou autres ?

Et pourquoi mon fichier s'enregistre-t-il automatiquement lorsque je le ferme ?

Un grand merci à celui ou celle qui trouvera la réponse.

Bonjour

Ton fichier en retour

La suppression des données est irréversible

Bonjour P.Labocea,

Pour le ctrl + z, c'est assez compliqué... Une fois qu'une macro est exécutée, la commande Undo n'est plus opérante. Il faudrait éventuellement capter les données pour les garder en mémoire mais cette opération ne pourrait être réalisée que sur la dernière exécution...

Pour la suppression, voici un essai :

Sub Vider_plage_données()

Dim rsupp As Range
Dim dl&

With Sheets("Feuil1")
    dl = .Cells(.Rows.Count, 1).End(xlUp).Row
    Set rsupp = .Range("A3:B" & dl & ", G3:H" & dl)
End With

rsupp.ClearContents

End Sub

Et pour l'enregistrement, je ne sais pas. Je n'ai pas vu de macro évènementielle dans le module ThisWorkbook...

Cdlt,

Edit : Bonjour Joco

Un grand merci à tous les deux pour votre réactivité. Tant pis pour le "ctrl z".

Bonne journée à vous.

Arg, ça fait capoter mon "vrai fichier" car de ces cellules supprimées dépendent une quantité de formules.

Et lorsque je colle mes nouvelles données brutes, les formules ne fonctionnent plus et affichent #REF!

J'essaye de vous envoyer le fichier mais il fait 20 Mo. Une idée pour diminuer drastiquement sa taille ? J'ai déjà supprimé beaucoup d'onglets, graphes et données mais ça stagne à 19Mo.

.clearcontents n'entraine pas la perte de la référence contrairement à .delete...

Ensuite, si tu recolles des données par macro, il vaut mieux les coller en valeurs. Le mieux serait que tu postes, s'il elle existe, la macro qui vient coller les nouvelles valeurs.

Pfiou je viens de réussir à alléger mon fichier, refonte complète.

Lorsque j'intègre le code VBA de 3GB en mettant à jour la case et le nom de la feuille, j'ai un "debug" qui apparaît me disant que les cellules

3new-copie.zip (619.13 Ko)

fusionnées ne peuvent prises ne compte.

Or du peu que je sache lire du code, il n'y a pas de cellules fusionnées concernées si ?

En faisant un essai je n'ai pas eu de problème sur le fichier modèle de tout à l'heure. Et c'est rare d'avoir une alerte aussi précise donc je pense qu'il y a des cellules fusionnées, probablement en haut de feuille. Il vaut mieux ne pas, voire ne jamais, fusionner de cellules.

Merci 3GP, en appliquant le code présenté précédemment, et en le mettant à jour avec mon fichier comme suit :

Sub Vider_plage_données()

Dim rsupp As Range

Dim dl&

With Sheets("Feuil1")

dl = .Cells(.Rows.Count, 53).End(xlUp).Row

Set rsupp = .Range("B53:C" & dl & ", H53:I" & dl)

End With

rsupp.ClearContents

End Sub

Cela supprime toutes les cellules jusqu'à la 53ème au lieu de "à partir" de la 53ème.

Désolé pour mon manque d'expérience, j'apprends sur le tas. Et merci encore pour votre entraide.

2new-copie.zip (617.97 Ko)

Salut,

En fait, la ligne :

dl = .Cells(.Rows.Count, 53).End(xlUp).Row

se lit comme suit : dl vaut le numéro de ligne (row) de la première cellule obtenue en remontant à partir de la cellule (65000, 53), c'est à dire à la ligne 65000 et à la colonne 53.

end est une méthode qui permet le déplacement "global" sur des zones (ctrl + flèche), rows.count renvoie le nombre de lignes sur la feuille (ça ne vaut pas exactement 65000 d'ailleurs).

Or, j'imagine qu'en colonne 53, il ne doit pas y avoir beaucoup de valeurs , donc dl vaut 1 car la méthode end a remonté la totalité de la colonne, n'ayant rien trouvé sur son passage.

dl = .Cells(.Rows.Count, 1).End(xlUp).Row 'dernière non vide en colonne 1 ("A")

Tu peux modifier le 1 par "A" et tu peux bien entendu choisir une autre colonne (celle contenant le plus de valeurs) car de mémoire, il y avait plus de valeurs en colonne G qu'en colonne A.

Merci beaucoup 3GP. Pour clôturer le topic, est-ce normal que la macro ne se mette pas à jour lorsque je modifie le nom de l'onglet 'Bourg Ouest" ?

Je t'en prie et tu peux m'appeler 3GB car c'est mon pseudo .

Pour le nom de l'onglet, il faut qu'il soit identique dans le code et sur l'onglet. Ill faut donc faire attention aux petites fautes de frappe et notamment aux espaces de fin (classique). Sinon, le code (tel qu'on l'a arrêté) devrait être maintenant :

Sub Vider_plage_données()

Dim rsupp As Range
Dim dl&

With Sheets("Bourg Ouest")
dl = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rsupp = .Range("B53:C" & dl & ", H53:I" & dl)
End With
rsupp.ClearContents

End Sub

A bientôt,

Merci beaucoup 3G.....B !

Et si je comprend bien, pour que la macro s'applique à mes prochains fichiers dans lesquels j'aurai à renommer l'onglet, il faudrait intégrer cette macro-là en plus?

Sub SecondOne()

Sheets(2).Activate

End Sub

Encore toi !

Honnêtement, je n'ai pas regardé le fichier. Quand je peux éviter, je me passe d'en télécharger.

Il est possible de remplacer Sheets("Bourg Ouest") par Activesheet ssi la macro s'exécute depuis la feuille (donc au moyen d'un bouton sur cette feuille par exemple).

Pour cette macro secondone, elle active la feuille en 2è position. Mais je ne vois pas trop le rapport avec ce qu'on a vu sur ce post. Si tu me donnais plus de détails, je pourrais mieux comprendre.

Rechercher des sujets similaires à "macro vider plages donnees"