RESOLU par Robert que je remercie - Exécution auto macro si changement dans feuille

castor30

XLDnaute Occasionnel
Bonjour à tous, le forum,,
J'ai cette macro qui me pose problème
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveCell.FormulaR1C1 = _
        "=IF(AND(R[1]C[-7]="""",R[1]C[-6]="""",R[1]C[-5]=""""),"""",1)"
    Range("Z1").Copy
    [Base2].Select
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Range("A1").Activate
End Sub
Ce que je voudrais obtenir, c'est en cas de modification dans la feuille Base la macro se fasse automatiquement.
Pour une raison que je ne comprends pas, elle boucle sans fin.
Cette macro est placée dans la feuille Base
Je vous remercie de l'aide que vous m'apporterez.
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Castor, bonjour le forum,

La macro s'exécute chaque fois qu'il y a un changement dans l'onglet Base. Donc, la formule dans la cellule active comme le PasteSpecial dans la plage nommée Base2 relancent la procédure. J'utilise une variable booléenne TEST pour éviter ça !
Par ailleurs, et même si ça n'a pas d'incidence sur ton problème, évite les Select inutiles qui ne font que ralentir l'exécution du code et sont source de plantages. Essaie ce code :

VB:
Private TEST As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
If TEST = True Then Exit Sub
TEST = True
ActiveCell.FormulaR1C1 = _
"=IF(AND(R[1]C[-7]="""",R[1]C[-6]="""",R[1]C[-5]=""""),"""",1)"
Range("Z1").Copy
Range("Base2").PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range("A1").Activate
TEST = False
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

A1 est bien sélectionné chez moi !... Mais je viens de me rendre compte que la macro est déclenchée quand on valide... Pour cela, que l'on ait utilisé la souris en cliquant ailleurs ou la touche [Entrée] ou la touche [Tab], la cellule active est déplacée et la formule se retrouve ailleurs que dans la cellule modifiée.
Mais sans le fichier qui va avec des explications claires de ce que tu veux faire difficile de comprendre et donc de t'aider...

Pour le champ dynamique utilise le Gestionnaire de nom du bandeau Formules :
• Clique sur le bouton Nouveau...
• nomme la plage dynamique dans le champ Nom
• dans le champ Fait référence à, la formule : =DECALER(Feuil1!$Z$2;;;NBVAL(Feuil1!$Z:$Z)-1)

(Feuil1 à adapter à ton cas)...

Attention ! La plage nommée ainsi créée n'apparait dans la Zone Nom mais uniquement dans le Gestionnaire de nom. En revanche, utilisable dans les formules ou VBA...
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Castor, bonjour le forum,

Désolé mais je ne comprends pas le rapport entre le code et tes explications ?!... Tu me dis que tu veux sélectionner les lignes dont les colonnes S à U contiennent une valeur. Puis tu parles d'imprimer ? Ce n'est absolument pas clair pour moi.
Ce que je peux te proposer c'est de renvoyer dans un nouvel onglet la liste des lignes. Cela te conviendrait-il ?

C'est la troisième fois que je te réponds mais ma réponses se perd car le site plante sans arrêt. J'espère que ça va marcher cette fois...
 

castor30

XLDnaute Occasionnel
Bonjour Robert,
Je ne peux filtrer simultanément les colonnes S T et U d’où l'idée que j'ai est de filtrer à partir de la colonne Z pour avoir l'ensemble des lignes comme sur l'image.
 

Pièces jointes

  • Capture.JPG
    Capture.JPG
    36 KB · Affichages: 28

Robert

XLDnaute Barbatruc
Repose en paix
Re,

OK je comprend mieux. Mais comme je n'aime pas les formules et autres filtres je te propose la solution VBA en pièce jointe. Est-ce que ça te convient (code commenté) ?
 

Pièces jointes

  • Castor_v01.xls
    267.5 KB · Affichages: 39

castor30

XLDnaute Occasionnel
Re,
Merci beaucoup Robert, cependant n'est-il pas possible de rester sur la feuille Base ? sans l'ajout d'une feuille Filtre...
D'autre part, peut-on supprimer le bouton sur la feuille Base, ou de faire que le code (merci beaucoup pour les commentaires) s'active automatiquement lors d'un changement dans les colonnes S T ou U de la feuille Base (Plage dynamique).
Il faudrait aussi que cela masque les colonnes C - D - E - H - N à R et V pour l'impression et les ré-affiche ensuite.
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Oui en fait c'est même plus simple... Pour afficher à nouveau toutes les lignes et toutes les colonnes, double-clique sur n'importe quelle cellule de la ligne 1...

Le code :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'au double-clic dans l'onglet
'si le double-clic a lieu dans la ligne 1, affiche toutes les lignes et colonnes et empêche le mode [Édition] lié au double-clic
If Target.Row = 1 Then Rows.Hidden = False: Columns.Hidden = False: Cancel = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim TEST As Boolean 'déclare la variable TEST

If Target.Row < 3 Then Exit Sub 'si e changement a lieu dans une ligne inférieure à 3, sort de la procédure
'si le changement a lieu ailleurs que dans les colonnes S à U, sort de la procédure
If Application.Intersect(Target, Columns("S:U")) Is Nothing Then Exit Sub
Application.ScreenUpdating = False 'masque les rafraîchissement d'écran
TV = Range("A2").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
  TEST = False 'initialise la variable TEST
  For J = 19 To 21 'boucle 2 : sur les colonne 19 à 21 (=> colonnes S à U)
  If TV(I, J) <> "" Then 'condition si la donnée ligne I colonne J de TV n'est pas vide
  TEST = True 'redéfinit la variable TEST
  Exit For 'sort de la boucle 2
  End If 'fin de la condition
  Next J 'prochaine colonne de la boucle 2
  If TEST = False Then Rows(I).Hidden = True 'si TEST est [Faux], masque la ligne I
Next I 'prochaine ligne de la boucle 1
'masque les colonnes
Application.Union(Columns("C:E"), Columns("H:H"), Columns("N:R"), Columns("V:V")).EntireColumn.Hidden = True
End Sub

Le fichier :
 

Pièces jointes

  • Castor_v02.xls
    260.5 KB · Affichages: 50

Discussions similaires

Réponses
3
Affichages
575

Statistiques des forums

Discussions
312 194
Messages
2 086 066
Membres
103 110
dernier inscrit
Privé