Autres (RESOLU)Cliquer sur une cellule pour effacer une plage

chaelie2015

XLDnaute Accro
Bonsoir FORUM
je cherche un code suivant
cliquer sur une cellule pour effacer une plage
si je clique une fois sur la cellule (par exemple) A1 alors afficher un message Msgbox" Voulez vous effacer les données?" si oui alors effacer toutes les données dans la plage (par exemple) de B1 : E10
Merci par avance
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonsoir chaelie,

ouvre le fichier ci-joint, et fais un double-clic en A1. :)

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Address <> "$A$1" Then Exit Sub
  Cancel = True
  If MsgBox("Voulez-vous effacer les données ?", 4) = 6 Then [B1:D10].ClearContents
End Sub

soan
 

Pièces jointes

  • Exo chaelie2015.xlsm
    12.8 KB · Affichages: 15

chaelie2015

XLDnaute Accro
Bonsoir chaelie,

ouvre le fichier ci-joint, et fais un double-clic en A1. :)

VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Address <> "$A$1" Then Exit Sub
  Cancel = True
  If MsgBox("Voulez-vous effacer les données ?", 4) = 6 Then [B1:D10].ClearContents
End Sub

soan
Re
est ce possible de généraliser
exemple cellule a cliquer A11 et la plage B11 : D20
cellule a clique A21 et la plage B21 : D30
MERCI
 

soan

XLDnaute Barbatruc
Inactif
Bonjour chaelie,

je te laisse essayer ce code VBA :

VB:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim col%, lig&
  With Target
    col = .Column: If col <> 1 Then Exit Sub
    lig = .Row: If lig Mod 10 <> 1 Then Exit Sub
    Cancel = True
    If MsgBox("Voulez-vous effacer les données ?", 4) = 6 _
      Then .Offset(, 1).Resize(10, 3).ClearContents
  End With
End Sub

attention : ce code VBA et le précédent sont pour effacer des colonnes B à D ; or j'ai vu que tu as modifié ton énoncé : tu as maintenant mis B1:E10 ! donc si c'est jusqu'à la colonne E : dans le 1er code VBA, au lieu de [B1:D10].ClearContents mets : [B1:E10].ClearContents (mais je suis sûr que tu as pu faire toi-même la correction adéquate, n'est-ce pas ? 😜) ; dans mon 2ème code VBA, au lieu de .Resize(10, 3).ClearContents mets à la place : .Resize(10, 4).ClearContents ; à la prochaine fois, pour un autre exo ! :)

soan
 
Dernière édition:

chaelie2015

XLDnaute Accro
Bonjour chaelie,

je te laisse essayer ce code VBA :

VB:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim col%, lig&
  With Target
    col = .Column: If col <> 1 Then Exit Sub
    lig = .Row: If lig Mod 10 <> 1 Then Exit Sub
    Cancel = True
    If MsgBox("Voulez-vous effacer les données ?", 4) = 6 _
      Then .Offset(, 1).Resize(10, 3).ClearContents
  End With
End Sub

attention : ce code VBA et le précédent sont pour effacer des colonnes B à D ; or j'ai vu que tu as modifié ton énoncé : tu as maintenant mis B1:E10 ! donc si c'est jusqu'à la colonne E : dans le 1er code VBA, au lieu de [B1:D10].ClearContents mets : [B1:E10].ClearContents (mais je suis sûr que tu as pu faire toi-même la correction adéquate, n'est-ce pas ? 😜) ; dans mon 2ème code VBA, au lieu de .Resize(10, 3).ClearContents mets à la place : .Resize(10, 4).ClearContents ; à la prochaine fois, pour un autre exo ! :)

soan
Bonsoir soan
en réalité le bon fichier est ce rattaché.
 

Pièces jointes

  • Exo chaelie2015 SOAN.xlsm
    19.9 KB · Affichages: 7

soan

XLDnaute Barbatruc
Inactif
@chaelie2015

ton fichier en retour. :)

fais les tests nécessaires, puis lis le code VBA (avec de nombreux commentaires) :

VB:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim col%, lig&
  With Target
    col = .Column: If col <> 37 Then Exit Sub '=> seulement pour la colonne 37 : AK
    lig = .Row - 7: If lig Mod 62 <> 0 Then Exit Sub '=> seulement pour les lignes
    '7 ; 69 ; 131 ; 193 ; 255 ; 317 ; 379 ; 441 ; 503 ; 565 ; 627 ; 689 ; etc...
    '=> pour toutes les lignes régulièrement espacées de 62 lignes, à partir de la
    'ligne 7 ; mais jusqu'où ? tu n'as pas donné de limite maximale.
    'note bien que ça réagira quand tu feras un double-clic sur les 3 cellules qui
    'contiennent le texte "EFFACER" : en AK7 ; en AK69 ; en AK131 ; idem si tu en
    'ajoute en dessous, à intervalle de 62 lignes : AK193 ; AK255 ; AK317 ; ...
    'par contre, si tu ne veux pas en ajouter d'autres, mets cette ligne :
    'lig = .Row - 7: If lig > 124 Or lig Mod 62 <> 0 Then Exit Sub
    Cancel = True
    If MsgBox("Voulez-vous effacer les données ?", 4) = 6 _
      Then .Offset(2, -35).Resize(15, 11).ClearContents
  End With
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. ;)

soan
 

Pièces jointes

  • Exo chaelie2015 SOAN.xlsm
    20.6 KB · Affichages: 5

chaelie2015

XLDnaute Accro
@chaelie2015

ton fichier en retour. :)

fais les tests nécessaires, puis lis le code VBA (avec de nombreux commentaires) :

VB:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim col%, lig&
  With Target
    col = .Column: If col <> 37 Then Exit Sub '=> seulement pour la colonne 37 : AK
    lig = .Row - 7: If lig Mod 62 <> 0 Then Exit Sub '=> seulement pour les lignes
    '7 ; 69 ; 131 ; 193 ; 255 ; 317 ; 379 ; 441 ; 503 ; 565 ; 627 ; 689 ; etc...
    '=> pour toutes les lignes régulièrement espacées de 62 lignes, à partir de la
    'ligne 7 ; mais jusqu'où ? tu n'as pas donné de limite maximale.
    'note bien que ça réagira quand tu feras un double-clic sur les 3 cellules qui
    'contiennent le texte "EFFACER" : en AK7 ; en AK69 ; en AK131 ; idem si tu en
    'ajoute en dessous, à intervalle de 62 lignes : AK193 ; AK255 ; AK317 ; ...
    'par contre, si tu ne veux pas en ajouter d'autres, mets cette ligne :
    'lig = .Row - 7: If lig > 124 Or lig Mod 62 <> 0 Then Exit Sub
    Cancel = True
    If MsgBox("Voulez-vous effacer les données ?", 4) = 6 _
      Then .Offset(2, -35).Resize(15, 11).ClearContents
  End With
End Sub

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. ;)

soan
Bonjour SOAN
Merci pour la réponse,
pour la limite de mon fichier est limité à la cellule AK441 ('7 ; 69 ; 131 ; 193 ; 255 ; 317 ; 379 ; 441)
A+
 

job75

XLDnaute Barbatruc
Bonjour chaelie2015, soan, le forum,
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column <> 37 Or Target.Row > 441 Or (Target.Row - 7) Mod 62 Then Exit Sub
Cancel = True
With Target.Offset(2, -35).Resize(15, 32)
    If MsgBox("Effacer " & .Address(0, 0) & " ?", 4) = 6 Then .ClearContents
End With
End Sub
A+
 

soan

XLDnaute Barbatruc
Inactif
Bonjour chaelie, job75,

voici la nouvelle version du fichier. :)

je n'ai rien changé sur "Feuil1" ; j'ai modifié seulement le code VBA :

VB:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim col%, lig&
  With Target
    col = .Column: If col <> 37 Then Exit Sub '=> seulement pour la colonne 37 : AK
    lig = .Row - 7: If lig > 434 Or lig Mod 62 <> 0 Then Exit Sub
    '=> seulement pour pour les lignes 7 ; 69 ; 131 ; 193 ; 255 ; 317 ; 379 ; 441 ;
    'comme il faut soustraire 7 de .Row => on teste : lig max - 7 = 441 - 7 = 434
    Cancel = True
    If MsgBox("Voulez-vous effacer les données ?", 4) = 6 _
      Then .Offset(2, -35).Resize(15, 11).ClearContents
  End With
End Sub

la solution de job75 est mieux que la mienne, sauf sur ce point : ce n'est pas .Resize(15, 32) mais .Resize(15, 11), car en largeur, il faut effacer seulement la fusion des colonnes B:L (là où y'a des « X »), pas les colonnes M:AG ! ;)

soan
 

Pièces jointes

  • Exo chaelie2015 SOAN.xlsm
    20.1 KB · Affichages: 3
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@job75, chaelie,

moi aussi, au début, j'avais pensé qu'il fallait effacer sur toute la largeur des cellules colorées en jaune, puis ensuite j'ai compris que non : il faut effacer seulement là où y'a des « X » ; c'est peut-être une colonne de références de produits, d'articles divers, ou de prestations ? ou autre chose encore ? mais pour une raison que seul le demandeur chaelie connaît, je suis sûr qu'il ne faut pas effacer M:AG ! preuve en est qu'il n'a fait aucune réclamation à ce sujet après mon précédent fichier du post #7 ; sinon, chaelie aurait écrit : « il faudrait effacer aussi M:AG ! » ; et tout ça même si le tableau entier est coloré en jaune, en brun, ou en cyan : chaelie veut que toutes les colonnes soient en couleur, mais effacer seulement les « X », donc la fusion de colonnes B:L ; d'où mon .Resize(15, 11) au lieu de .Resize(15, 32) :)



@chaelie, job75,

en fait perso, je préfère quand même mettre 2 tests au lieu d'un seul ; voici pourquoi :

si le VBA de Microsoft faisait comme le Turbo Pascal, il stopperait son évaluation du test complet dès qu'une partie est fausse ; au lieu de cela, il continue ! 😭 donc avec cette seule ligne de test de job75 :

If Target.Column <> 37 Or Target.Row > 441 Or (Target.Row - 7) Mod 62 Then Exit Sub

même si Target.Column est différent de 37, au lieu de stopper aussitôt l'évaluation du test et de continuer sur l'instruction en dessous (Cancel = True), il continue quand même, et bêtement, à évaluer inutilement la suite du test qui est : Or Target.Row > 441 Or (Target.Row - 7) Mod 62

de plus, même si Target.Row est supérieur à 441, là aussi, au lieu de stopper aussitôt son évaluation du test, il continue bêtement à évaluer inutilement la suite : Or (Target.Row - 7) Mod 62

voilà les raisons pour lesquelles je préfère « morceler » un long test ; c'est mieux, surtout si le test est inclus dans une longue boucle For .. Next ou Do .. Loop ; mébon, je reconnais que quand c'est pas dans une boucle, comme ici, c'est surtout par « purisme » que je morcelle quand même le test ; quel dommage que Microsoft n'aie pas inclus dans sont VBA l'évaluation prédictive des tests ! mais ça a été son choix, on n'y peut rien ! si encore y'avait eu une option avancée dans le menu de VBA pour cocher ou non ce type d'évaluation prédictive ! mais non, c'est pas le cas, hélas ! 😭


j'ai tout d'même fait une sorte de « compromis » en mettant ensemble ces 2 tests :

VB:
    lig = .Row - 7: If lig > 434 Or lig Mod 62 <> 0 Then Exit Sub

sinon, j'aurais écrit la partie du code concernée avec 3 tests :
VB:
  With Target
    col = .Column: If col <> 37 Then Exit Sub '=> seulement pour la colonne 37 : AK
    lig = .Row: If lig > 441 Then Exit Sub '=> seulement pour une ligne <= 441, et
    If lig - 7 Mod 62 <> 0 Then Exit Sub 'seulement si cette ligne est un multiple
    'de 62, à partir de la ligne n° 7 : 7 ; 69 ; 131 ; 193 ; 255 ; 317 ; 379 ; 441.

soan
 
Dernière édition:

job75

XLDnaute Barbatruc
Si l'on veut pouvoir ajouter ou supprimer des lignes ou colonnes on peut utiliser cette macro :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim r As Range, test As Boolean, deb As Range
If UCase(Target(1)) <> "EFFACER" Then Exit Sub
Set r = Intersect(Rows(Target.Row + 1 & ":" & Rows.Count), UsedRange)
If r Is Nothing Then Exit Sub
For Each r In r
    test = r.Interior.ColorIndex <> xlNone
    If deb Is Nothing Then If test Then Set deb = r
    If test Then If r(1, 2).Interior.ColorIndex = xlNone And r(2, 1).Interior.ColorIndex = xlNone Then Exit For
Next
If deb Is Nothing Or r Is Nothing Then Exit Sub
Cancel = True
With Range(deb, r)
    If MsgBox("Effacer " & .Address(0, 0) & " ?", 4) = 6 Then .ClearContents
End With
End Sub
Elle s'appuie sur les mots EFFACER et sur le fait que les plages à effacer sont colorées.
 

Pièces jointes

  • Exo chaelie2015(1).xlsm
    22.7 KB · Affichages: 8

job75

XLDnaute Barbatruc
@soan concernant les tests je ne comprends pas que tu te lances dans des explications aussi vaseuses !

Il est évident que l'exécution de :
VB:
If Target.Column <> 37 Or Target.Row > 441 Or (Target.Row - 7) Mod 62 Then Exit Sub
est extrêmement rapide !

Chez moi 1,1 millionième de seconde !!!
 

soan

XLDnaute Barbatruc
Inactif
@job75

Image.jpg


merci bien pour ta si gentille appréciation, ça fait toujours plaisir ! 😁 😜 (n'est-ce pas ? :rolleyes: 😇) ; j'ose espérer que mes explications vaseuses plairont à d'autres lecteurs de cette conversation, même si ça n'est pas ton cas ; comme actuellement il y a 157 740 autres membres, ça me laisse quand même un peu d'espoir ! 😁 🤣

a) mes explications ne sont PAS vaseuses, bien au contraire ! je sais parfaitement que mes explications sont très claires et même limpides pour quiconque comprend bien le français ; il suffit de les lire attentivement pour comprendre en quoi l'évaluation de certaines parties du test est complètement inutile ; c'est d'ailleurs la raison pour laquelle Philippe Kahn, le PDG de l'ex-société Borland, avait décidé d'implémenter l'évaluation prédictive des tests dans son langage Turbo Pascal, alors même que la compilation était pourtant extrêmement rapide, ainsi que l'exécution ; ça aurait été assurément une excellente chose si Microsoft l'avait imité sur ce point ! (c'est sans doute car Crosoft a moins le souci de la satisfaction de sa clientèle que l'avait Borland ! 😁)

b) je reconnais quand même que c'est par simple « purisme », de la même façon que je mets (quasiment) toujours une sub appelée avant son appel : c'est une habitude que j'avais prise quand j'utilisais une des premières versions de Turbo Assembleur ou de Turbo Pascal : la phase de compilation bloquait s'il y avait appel d'une sub ou d'une fonction située en aval de son lieu d'appel ; c'est seulement ensuite que sont apparues des versions qui savaient effectuer la résolution des adresses aval ; plus d'infos sur les compilateurs ici : lien Wikipédia ; dont la différence entre un compilateur simple passe (monopasse) et un compilateur multi passe ; en général, y'a une passe en avant qui « garde en mémoire » la trace des adresses qui n'ont pas pu être résolues lors de cette 1ère passe, qui est suivie d'une seconde passe en arrière, pour résoudre effectivement les adresses non résolues lors de la 1ère passe.

c) « Chez moi 1,1 millionième de seconde !!! » : c'est effectivement ultra-rapide !!! n'empêche que ça évalue quand même bêtement et inutilement des parties de tests, puisqu'on sait d'avance que si Target.Column est différent de 37, le test sera VRAI dans tous les cas (peu importe la suite du test), car c'est l'opérateur Or qui est utilisé ➯ l'évaluation du test peut stopper aussitôt, sans avoir à évaluer la suite du test qui est Or Target.Row > 441 Or (Target.Row - 7) Mod 62 (soit 2 évaluations complètement inutiles) ; CQFD. 😁 😄 et je t'assure que pour celui qui veut concevoir un compilateur vraiment performant, faire l'évaluation complète d'un test est une incongruité flagrante, quels que soient le temps de compilation et le temps d'exécution ! :)

soan
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 282
Messages
2 086 764
Membres
103 389
dernier inscrit
DEDE86