OVH Cloud OVH Cloud

Attribuer une macro à une cellule ou une liste

20 réponses
Avatar
Rex
Bon dimanche à vous toutes et tous

En bref
Comment faire pour activer une macro lors d'un changement de valeur dans une
cellule?


En un peu plus long

Grâce à certains d'entre vous (même beaucoup d'entres vous)
j'arrive doucement, mais là alors très doucement, à faire des trucs
surprenant pour mon fichier

Je voudrais maintenant automatiser une petit truc

Grâce à Trirème et Garnote, je suis parvenu à créer les list dont j'avais
besoin

Pour faire court, une list active une deuxième list
Quand je sélectionne un nom dans la deuxième ma cellule A2 change
Et comme toute une série de cellule sont liées à celle-là, toute est remis à
jour

J'ai une petite macro qui réarrange la feuille pour lui donner l'aspect
souhaité

Mais je ne parviens pas à attribuer cette macro

Elle devrait s'exécuter lors de chaque changement de la cellule A2
Avant j'employais des listbox et c'était simple
Mais dans la nouvelle mouture j'utilise des lists et il n'y pas moyen de
leur attribuer une macro

Cela doit se faire par macro évènementielle, mais je ne suis pas sûr de mon
coup
Cela doit être facile, mais j'y arrive pas

Rex ;-)))

10 réponses

1 2
Avatar
Trirème
Bonjour Rex,

Au travail derrière un antivirus suspicieux je ne peux pas à rapatrier la
dernière version de ton projet.

Je n'ai toujours pas de réponse à la question :
"Faut-il cacher les lignes de la feuille courante ou d'une autre feuille ?"

Hier j'ai émis un bout de code selon la 2ème hypothèse... mais avec mes
essais j'ai laissé une pitite erreur en mettant :
ElseIf Target.Address = "$I$2" And Target.Count = 1 Then



Il fallait lire :
ElseIf Target.Address = "$A$2" And Target.Count = 1 Then

Peux-tu répondre à la question STP ? Car dans les 2 cas j'arrive à cacher
les lignes (dans la feuille courante ou dans une autre feuille).
Y-aurait-il qqchose qui t'aurait échappé au cours des échanges précédents ?

Je te laisse préparer ton "Déclic numérique" avant de recevoir une réponse.
En attendant je me prends déclaques si c'est juste l'erreur I2 -> A2 qui
subsiste.

Cordialement,
Trirème


Avatar
rthompson
Bonjour et encore et toujours merci

La pitite erreur était corrigée
Donc cela ne vient pas de là

Les lignes à cacher et à afficher son sur la feuille active
C'est à dire "Tracking_Orders"

Quand on change la valeur de A2
Toute une série de cellule (de C4 à L60) change de valeur
Pour pour avoir une meilleure visibilité de l'offre
seule les lignes ou il y a une valeur dans le colonne C doivent être
affichées
Les autres sont cachées


Voici le code actuel complet
En mettant le dernier bout en ' cela tourne sans problème
Je sélectionne une option sur J3 et il me mets le nombre de concordance en
J4
Je sélectionne une de ces concordance et il réagit
C'est-à-dire que les cellules nom, addresse, produits quantité, etc son
misent à jour
Mais les cellules qui étaient cachée restent cachées
J'utilise à ce moment un bouton avec la macro Showneeded et tout est parfait

Je ne comprends pas pourquoi si je laisse ce bout de code dans ta macro
elle bloque sur la ligne
c.EntireRow.Hidden = (c.Value = 0)
Alors que la même ligne ne bloque pas dans l'autre code

Le fait les Range sont déclarée de façon différentes ne change pas la donne
J'ai essayée en copiant le code de l'un à l'autre
et le résultat est toujours le même


Voici les deux codes

A bientôt

Rex



xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Private Sub Worksheet_Change(ByVal Target As Range)


Application.ScreenUpdating = False

If Target.Address = "$J$3" Then
[J4].ClearContents
' *********** initialisations **************************
Datas = "Datas" ' Nom de la plage de données
Offre = "Offers" ' Nom de l'onglet contenant les Datas
Consultation = "Tracking_Orders"
OffreNom = "Offre-Nom" ' Nom de l'entête de colonne des Offres-Nom
Statut = "Status" ' Nom de l'entête de colonne des Statuts
' ************ fin d'initialisation *********************
LaListe = "": compt = 0
' Construire une liste de validation à partir des 'Offre-Nom' qui
conviennent
With Worksheets(Offre)
NumeroColonneOffreNom = Application.Match(OffreNom,
.Range(Datas).Resize(1), 0)
' En recherchant la position de la colonne dans la 1ère ligne des
Datas,
' On évite les erreurs en cas de déplacement ou ajout de colonnes.
NumeroColonneStatus = Application.Match(Statut,
.Range(Datas).Resize(1), 0)
Decalage = NumeroColonneStatus - NumeroColonneOffreNom
For Each c In .Range(Datas).Offset(1, NumeroColonneOffreNom -
1).Resize(, 1)
' La colonne contenant 'Offre-Nom' est cherchée automatiquement
If c.Offset(, Decalage) = [J3] Then
If IsEmpty(c) Or c = "" Then c = "Référence absente"
LaListe = LaListe & c & ",": compt = compt + 1
' MsgBox LaListe
End If
Next
End With

If LaListe = "," Then
Range("Offre_Nom") = "Aucune correspondance"
Exit Sub
Else
LaListe = Left(LaListe, Len(LaListe) - 1)
Range("Offre_Nom") = compt & " correspondance(s)"
End If


With Worksheets(Consultation).Range("Offre_Nom").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=
_
xlBetween, Formula1:=LaListe
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = False 'True
End With

' Call masqueZéro
ElseIf Target.Address = "$A$2" And Target.Count = 1 Then
Application.ScreenUpdating = False

End If

' With Worksheets("Tracking_Orders")
' Range("D2:D185").EntireRow.Show
' For Each c In Range("D2:D185")
' c.EntireRow.Hidden = (c.Value = 0)
' Next c
' Application.ScreenUpdating = True
' End With

End Sub


' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Private Sub Showneeded_Click()
Application.ScreenUpdating = False
Range([D2], [D185]).EntireRow.Show
For Each c In Range([D2], [D55])
c.EntireRow.Hidden = (c.Value = 0)
Next c
Application.ScreenUpdating = True

End Sub
"Trirème" a écrit dans le message de news:

Bonjour Rex,

Au travail derrière un antivirus suspicieux je ne peux pas à rapatrier la
dernière version de ton projet.

Je n'ai toujours pas de réponse à la question :
"Faut-il cacher les lignes de la feuille courante ou d'une autre feuille
?"

Hier j'ai émis un bout de code selon la 2ème hypothèse... mais avec mes
essais j'ai laissé une pitite erreur en mettant :
ElseIf Target.Address = "$I$2" And Target.Count = 1 Then



Il fallait lire :
ElseIf Target.Address = "$A$2" And Target.Count = 1 Then

Peux-tu répondre à la question STP ? Car dans les 2 cas j'arrive à cacher
les lignes (dans la feuille courante ou dans une autre feuille).
Y-aurait-il qqchose qui t'aurait échappé au cours des échanges précédents
?

Je te laisse préparer ton "Déclic numérique" avant de recevoir une
réponse.
En attendant je me prends déclaques si c'est juste l'erreur I2 -> A2 qui
subsiste.

Cordialement,
Trirème




Avatar
Trirème

La pitite erreur était corrigée
Donc cela ne vient pas de là
Tant mieux !


Mais les cellules qui étaient cachées restent cachées
Si tu veux un démasquage à ce moment, à la place de :

[J4].ClearContents

tu mets :
[J4].ClearContents
Range("D2:D185").EntireRow.Hidden = False

Je fais le résumé de ce que je crois être. Valide par Oui ou Non STP :

- La feuille active est "Tracking_Orders" elle contient une Private Sub
Worksheet_Change().
- Pour le Pb qui nous préoccupe, on ne quitte pas cette feuille.
- La cellule J3 contient une liste de validation.
- En choisissant un item pour J3 le CODE fabrique "à la demande" une liste
de validation pour la cellule J4.
- À ce stade certaines lignes de la feuille active sont masquées (mais
sûrement pas les lignes 3 et 4 of course ?)
- Est-ce que tu veux démasquer ces lignes à ce moment (ça me paraît
judicieux, voir début du post) ?
- En choisissant un item pour J4 certaines cellules (dont A2 ?) sont mises à
jour PAR FORMULE. Quid de la cellule A2, tu la modifies toi-même ?
A2 modifiée par code ou A2 modifiée 'à la main' (rayer mention inutile)

Quand on change la valeur de A2
Toute une série de cellule (de C4 à L60) change de valeur
Qui 'on' ? Toi ou les formules de la feuille ? A2 contient-elle une formule ?


Je ne comprends pas pourquoi si je laisse ce bout de code dans ta macro
elle bloque sur la ligne
c.EntireRow.Hidden = (c.Value = 0)


Que contient 'c' à cette étape, n'y a-t-il pas une erreur #N/A ou autre ?
fait un
MsgBox "Le type de c est " & TypeName(c.Value) avant la ligne
c.EntireRow.Hidden = (c.Value = 0)

Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?


Cordialement,
Trirème

Avatar
rthompson
Bonjour

Allons-y par ordre
Je vais ajouter ++++ la ou j'insère mes commentaires et réponses

Je crois qu'on arrive très près de la résolution de ce problème




"Trirème" a écrit dans le message de news:


La pitite erreur était corrigée
Donc cela ne vient pas de là
Tant mieux !


Mais les cellules qui étaient cachées restent cachées
Si tu veux un démasquage à ce moment, à la place de :

[J4].ClearContents

tu mets :
[J4].ClearContents
Range("D2:D185").EntireRow.Hidden = False


++++ Juste et cela fonctionne
++++ Maintenant y plus qu'à cacher les lignes inutiles


Je fais le résumé de ce que je crois être. Valide par Oui ou Non STP :

- La feuille active est "Tracking_Orders" elle contient une Private Sub
Worksheet_Change().


++++ Oui

- Pour le Pb qui nous préoccupe, on ne quitte pas cette feuille.


++++ Si je dis Oui ça veut dire Non on ne quitte pas cette feuille

- La cellule J3 contient une liste de validation.


++++ Oui Définie par un nom

- En choisissant un item pour J3 le CODE fabrique "à la demande" une liste
de validation pour la cellule J4.


++++ Oui

- À ce stade certaines lignes de la feuille active sont masquées (mais
sûrement pas les lignes 3 et 4 of course ?)


++++ C'était oui, mais avec ton petit bout de code supplémentaire c'est NON
++++ Toute la feuille est visible à ce stade

- Est-ce que tu veux démasquer ces lignes à ce moment (ça me paraît
judicieux, voir début du post) ?


++++ C'est ce qu'on a fait

- En choisissant un item pour J4 certaines cellules (dont A2 ?) sont mises
à
jour PAR FORMULE. Quid de la cellule A2, tu la modifies toi-même ?
A2 modifiée par code ou A2 modifiée 'à la main' (rayer mention
inutile)


++++ La cellule contient la formule
++++ =MATCH(Offre_Nom;Offers!$C$1:$C$25;0)

Quand on change la valeur de A2
Toute une série de cellule (de C4 à L60) change de valeur
Qui 'on' ? Toi ou les formules de la feuille ? A2 contient-elle une

formule ?



++++ Oui voir plus haut


Je ne comprends pas pourquoi si je laisse ce bout de code dans ta macro
elle bloque sur la ligne
c.EntireRow.Hidden = (c.Value = 0)


Que contient 'c' à cette étape, n'y a-t-il pas une erreur #N/A ou autre ?
fait un
MsgBox "Le type de c est " & TypeName(c.Value) avant la ligne
c.EntireRow.Hidden = (c.Value = 0)


++++ Il y a un message
++++ Le type de c est double
++++ Je suis sûr que tu as une idée


Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?


Cordialement,
Trirème



++++ Je circule maintenant pendant une paires d'heures
++++ Je serais en ligne vers les 9.30 h ce soir


A bientôt

Et merci encore pour ton aide

De mon côté j'ai beaucoup avancé sur la suite du traitement des données
J'ai des feuilles de récup et d'analyses qui donnent pas mal

Rex ;-)))))


Avatar
Trirème
En attendant ce soir...

Je crois qu'on arrive très près de la résolution de ce problème
Je crois aussi... C'est comment le smiley qui transpire ?

;-)

tu mets :
[J4].ClearContents
Range("D2:D185").EntireRow.Hidden = False


++++ Juste et cela fonctionne
++++ Maintenant y plus qu'à cacher les lignes inutiles
C'est ce qu'on fera (essaiera de faire) au choix de J4


- Pour le Pb qui nous préoccupe, on ne quitte pas cette feuille.
++++ Si je dis Oui ça veut dire Non on ne quitte pas cette feuille

%-$


- À ce stade certaines lignes de la feuille active sont masquées (mais
sûrement pas les lignes 3 et 4 of course ?)


++++ C'était oui, mais avec ton petit bout de code supplémentaire c'est NON
++++ Toute la feuille est visible à ce stade
Hé ! Hé !



++++ La cellule (A2) contient la formule
++++ =MATCH(Offre_Nom;Offers!$C$1:$C$25;0)

Quand on change la valeur de A2
Toute une série de cellule (de C4 à L60) change de valeur
Qui 'on' ? Toi ou les formules de la feuille ? A2 contient-elle une

formule ?



++++ Oui voir plus haut


J'attendrais ce soir pour lire ton dernier fichier, mais il me semblait que
A2 = J4 ?

Pour la suite, j'attends de lire ton dernier fichier pour supputer.

Que contient 'c' à cette étape, n'y a-t-il pas une erreur #N/A ou autre ?
fait un
MsgBox "Le type de c est " & TypeName(c.Value) avant la ligne
c.EntireRow.Hidden = (c.Value = 0)


++++ Il y a un message
++++ Le type de c est double
++++ Je suis sûr que tu as une idée
Ben chez moi j'avais ce blocage lorsque 'c' contenait une erreur.


Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?

Là tu n'as pas répondu. J'imagine donc que ça bloque dans toutes les


situations.

Lorsque la macro évènementielle s'arrête sur un bug, est-ce que tu
réinitialises la macro (dans le VBA, le bouton avec un carré dans la barre
d'outil) avant de rebasculer vers la feuille pour continuer d'autres essais ?

Cordialement,
Trirème



Avatar
Rex
Bonsoir

Voici la toute dernière

http://cjoint.com/?iusJyLYx8e

Quand ça bloque je passe par Visual pour voir ou ç bloque
Puis je ferme et il me dis "this command will stop debugger je dis oui

Avec ton msg que j'ai ajouté
Maintenant il me mets ce message C is double puis empty puis error toute
une serie de fois
puis il continue sur le debugger

Pour la question non répondue elle bloque quel que soit le choix de J3 ou J4

Je me demandais une chose

Puis-que sans ce bout de code il fonctionne
Et que la macro Showneeded fonctionne aussi

Ne peut-on pas tout simplement faire un appel à l'autre macro en fin de
boucle?

Et tout à fait autre chose
Et je ne sais pas si c'est faisable ou pas

Quand on séletionne une option dans J3
En J4 il me mets X concordances

Ne pourrait-on pas faire en sorte que la list concordante soit affichée?
oui je sais que je demande beaucoup

Si c'est facile, dis-moi comment
Si c'est pas trop facile, oublie

C'est pas ce qui m'empêche de dormir


A tantôt

Je vais me faire à manger quelque chose de tout simple aujourd'hui


Rex ;-)))) )))
"Trirème" a écrit dans le message de news:

En attendant ce soir...

Je crois qu'on arrive très près de la résolution de ce problème
Je crois aussi... C'est comment le smiley qui transpire ?

;-)

tu mets :
[J4].ClearContents
Range("D2:D185").EntireRow.Hidden = False


++++ Juste et cela fonctionne
++++ Maintenant y plus qu'à cacher les lignes inutiles
C'est ce qu'on fera (essaiera de faire) au choix de J4


- Pour le Pb qui nous préoccupe, on ne quitte pas cette feuille.
++++ Si je dis Oui ça veut dire Non on ne quitte pas cette feuille

%-$


- À ce stade certaines lignes de la feuille active sont masquées (mais
sûrement pas les lignes 3 et 4 of course ?)


++++ C'était oui, mais avec ton petit bout de code supplémentaire c'est
NON


++++ Toute la feuille est visible à ce stade
Hé ! Hé !



++++ La cellule (A2) contient la formule
++++ =MATCH(Offre_Nom;Offers!$C$1:$C$25;0)

Quand on change la valeur de A2
Toute une série de cellule (de C4 à L60) change de valeur
Qui 'on' ? Toi ou les formules de la feuille ? A2 contient-elle une

formule ?



++++ Oui voir plus haut


J'attendrais ce soir pour lire ton dernier fichier, mais il me semblait
que

A2 = J4 ?

Pour la suite, j'attends de lire ton dernier fichier pour supputer.

Que contient 'c' à cette étape, n'y a-t-il pas une erreur #N/A ou
autre ?



fait un
MsgBox "Le type de c est " & TypeName(c.Value) avant la ligne
c.EntireRow.Hidden = (c.Value = 0)


++++ Il y a un message
++++ Le type de c est double
++++ Je suis sûr que tu as une idée
Ben chez moi j'avais ce blocage lorsque 'c' contenait une erreur.


Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?

Là tu n'as pas répondu. J'imagine donc que ça bloque dans toutes les


situations.

Lorsque la macro évènementielle s'arrête sur un bug, est-ce que tu
réinitialises la macro (dans le VBA, le bouton avec un carré dans la barre
d'outil) avant de rebasculer vers la feuille pour continuer d'autres
essais ?


Cordialement,
Trirème





Avatar
Rex
Merci pour cette réponse et le cours qui l'accompagne

Et une fois n'est pas coutume, je vais l'imprimer et le lire à mon aise

Si j'ai du temps libre entre les coups de feu à Déclic
J'y jette mon oeil

De toute façon je te tiens au courant

Et t'en fais pas pour les prochaines étapes

Je me dopes au Pot-au-feu et autres gouramandises et contrairement au Tour
de France
Au tour de Rixensart, il n'y a pas de contrôles anti-dope


Bonne nuit et à demain

Rex ;-)))))))

Je viens de poster une petite question toute simple
Mais je suis sur que d'autres me répondront
Faut que tous le monde travaille, non?

Rex

"Trirème" a écrit dans le message de news:
#
Voici la toute dernière
http://cjoint.com/?iusJyLYx8e
Bien reçu.


Et voici le nouveau code, avec encore plus de commentaires. ATTENTION,
j'ai copié aussi le

code des 2 boutons, légèrement modifiés. Tu remplaces tout le texte de la
Sheet18(Tracking_Orders) par ce qui suit (bon courage pour les troncatures
de lignes) (en

pièce jointe, une fois n'est pas coutume, je joins le fichier texte au
format .rar) :


** début des codes ****************************************
Private Sub Showneeded_Click()
Application.ScreenUpdating = False
Range([D2], [D185]).EntireRow.Show
For Each c In Range([D2], [D55])
c.EntireRow.Hidden = (c.Value = 0)
Next c
Application.ScreenUpdating = True
Application.EnableEvents = True ' Secours pour réparer un éventuel
arrêt du code

Worksheet_Change()
End Sub

Private Sub Sub_AfficheTout_Click()
Cells.EntireRow.Hidden = False
Application.EnableEvents = True ' Secours pour réparer un éventuel
arrêt du code

Worksheet_Change()
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)


Application.ScreenUpdating = False

If Target.Address = "$J$3" Then
Application.EnableEvents = False ' évite de relancer la macro car
J4 est modifiée

par le code
' [J4].ClearContents ' ci-dessous j'utilise le nom de la cellule
(au cas où tu la

déplaces)
Range("Offre_Nom").ClearContents ' On l'efface car plus rien à voir
avec le nouveau J3


' *********** initialisations **************************
Datas = "Datas" ' Nom de la plage de données
Offre = "Offers" ' Nom de l'onglet contenant les Datas
Consultation = "Tracking_Orders"
OffreNom = "Offre-Nom" ' Nom de l'entête de colonne des Offres-Nom
Statut = "Status" ' Nom de l'entête de colonne des Statuts
' ************ fin d'initialisation *********************

LaListe = "": compt = 0
' Construire une liste de validation à partir des 'Offre-Nom' qui
conviennent

With Worksheets(Offre)
NumeroColonneOffreNom = Application.Match(OffreNom,
.Range(Datas).Resize(1), 0)

' En recherchant la position de la colonne dans la 1ère ligne des
Datas,

' On évite les erreurs en cas de déplacement ou ajout de
colonnes.

NumeroColonneStatus = Application.Match(Statut,
.Range(Datas).Resize(1), 0)

Decalage = NumeroColonneStatus - NumeroColonneOffreNom

' On cherche le statut chois dans les Datas
' La colonne contenant 'Offre-Nom' est cherchée automatiquement
For Each c In .Range(Datas).Offset(1, NumeroColonneOffreNom -
1).Resize(, 1)

If c.Offset(, Decalage) = [J3] Then
If IsEmpty(c) Or c = "" Then c = "Référence absente"
LaListe = LaListe & c & ",": compt = compt + 1
If compt = 1 Then PremierDeLaListe = c ' ligne gérant le
1er de la liste

' MsgBox LaListe
End If
Next
End With

If LaListe = "" Then ' J'avais dit de ne pas mettre de ',' entre
les guillemets

(14/08/2007 15:10, fin du post)
LaListe = "Aucune correspondance" ' gestion aucun J3 trouvé
dans les datas

Range("Offre_Nom") = LaListe
Else
LaListe = Left(LaListe, Len(LaListe) - 1)
Range("Offre_Nom") = PremierDeLaListe ' compt & "
correspondance(s)"

End If

' Maintenant que "Offre_Nom" est modifié on s'occupe de
masquer/démasquer les lignes

nulles... ou en erreur
For Each c In Range("D2:D185") ' Pourquoi ne commences-tu pas en
ligne 16 ?

If IsError(c.Value) Then ' c peut contenir une erreur
c.EntireRow.Hidden = True
ElseIf c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = True
Else 'If c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = False
End If
Next c

' Enfin on met à jour la nouvelle liste de validation
With Worksheets(Consultation).Range("Offre_Nom").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop,
Operator:= _

xlBetween, Formula1:=LaListe
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = False 'True
End With
Application.EnableEvents = True

ElseIf Target = Range("Offre_Nom") Then ' Là aussi j'utilise la cellule
nommée

' ElseIf Target.Address = "$J$4" Then
Application.ScreenUpdating = False
' Range("D2:D185").EntireRow.Show ' sert à ramener la fenêtre sur
cette zone mais je

crois que l'instruction précédente l'inhibe
' Quand "Offre_Nom" est mis à jour on s'occupe de masquer/démasquer
les lignes

nulles... ou en erreur
For Each c In Range("D2:D185") ' Pourquoi ne commences-tu pas en
ligne 16 ?

If IsError(c.Value) Then ' c peut contenir une erreur
c.EntireRow.Hidden = True
ElseIf c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = True
Else 'If c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = False
End If
Next c
Application.ScreenUpdating = True
End If

End Sub


' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
** fin des codes *******************************************


En fait ce n'est pas sur une modif de A2 qu'il faut lancer la proc
évènementielle (A2 est

modifiée par formule qui ne la déclenche pas). Il faut le faire sur le
choix de J4 (qui

engendre la modif de A2).
Cependant, le code évènementiel qui surveille J3 modifie la cellule J4 (il
efface J4 puis

renseigne sur le nombre d'occurrence). il faut donc prendre soin de mettre
un

Application.EnableEvents = False au début et un Application.EnableEvents True à la fin.

ATTENTION, si le code bug entre ces 2 instructions les proc
évènementielles ne se

déclencheront plus du tout.
Pour faire roue de secours j'ai ajouté 'Application.EnableEvents = True'
derrière les 2

boutons (Afficher tout et Show only need).
Donc en cas de 'blème, si plus rien ne réagit, tu pourras cliquer sur
'Afficher'Tout' pour

rétablir les évènements.
Si tu ne comprends pas, dit le moi.

Pour la question non répondue elle bloque quel que soit le choix de J3
ou J4


En fait on pouvait reproduire l'erreur avec le code lancé avec tes
boutons.


Quand on sélectionne une option dans J3
En J4 il me mets X concordances

Ne pourrait-on pas faire en sorte que la liste concordante soit
affichée?


oui je sais que je demande beaucoup


La liste concordante n'est affichée QUE SI tu te positionnes sur J4.
Donc, quand tu choisis un statut pour J3 et juste avant de choisir quelque
chose en J4 tu

seras d'accord avec moi pour dire que ce qui est en J4 (issu d'un choix
précédent) n'a

rien à voir avec le nouveau J3. Il faut donc l'effacer. Et si tu
interrompais ton travail

à ce moment la feuille n'aurait pas de sens.
J'ai donc choisi de l'effacer, et, plutôt que d'imposer une des nouvelles
valeurs pour J4

j'ai affiché le nombre de concordances à titre d'information.

Si c'est facile, dis-moi comment
On peut afficher la première valeur (si elle existe) de la liste de

validation rafraichie.

Tu auras l'impression qu'elle est 'affichée'. Mais je le répète, il faut
se mettre en J4

pour qu'elle apparaisse. Le nouveau code que je fournis fait cela, tu
verras si c'est

mieux. Le client est roi.

Pitites remarques...
La zone nommée 'Status' comporte 3 lignes vides. Tu devrais la mettre dans
une feuille à part.

La zone nommée 'Datas' comporte des lignes vides et elle n'est pas
dynamique. J'imagine

que c'est la prochaine étape ?

Plus grosses remarques...
La feuille 'Price Input' te rendrait plus de services si tu évitais les
trous. Les données

devraient être dans une plage bien rectangulaire avec AUCUNE CELLULE VIDE.
Quitte à

recopier plusieurs fois les catégories et les sous-catégories dans les
cellules du

dessous. La feuille 'Product_List' (notamment la colonne B) pourrait y
récupérer plus

simplement les informations.
Mais c'est sûrement l'étape suivante ?

Dans 'Offers',avec les produits en colonnes, tu risques d'avoir des soucis
à gérer des

références-produits supplémentaires. Surtout que par souci d'historique tu
ne pourras pas

récupérer les colonnes des références devenues obsolètes.

Dans 'Make Offer' tu as des cellules fusionnées. C'est dommage, tu
pourrais alléger le

code de la Sub Enregistrer_Offre() en faisant des copies avec
transposition.


Il y a beaucoup de références écrites 'en dur' dans les macros
(Sheets("Make

Offer").Range("j7")...). Les modifications de mise en page et
d'organisation doivent donc

être très lourdes à gérer.

Bon courage, et bon déclic.

Cordialement,
Trirème
???????




Avatar
Rex
Bonne nuit

Je n'ai pas résisté

J'ai fais un copier/coller de ton code

ET CA MARCHE

Maintenant je peu dormir tranquil, et demain j'essaie de comprendre tes
explications


UN TOUT GRAND MERCI A TOI



A bientôt

PS Quelles sont tes connaissances en ACCESS?

On vient de me dire (Et oui, à Minuit moins dix, je reçois de courriels de
mon Boss!!!) qu'il y a de la restructuration dans l'air
Et qu'Excell ne sera pas suffisant pour tout regrouper ;-((((((((


Rex


"Trirème" a écrit dans le message de news:
#
Voici la toute dernière
http://cjoint.com/?iusJyLYx8e
Bien reçu.


Et voici le nouveau code, avec encore plus de commentaires. ATTENTION,
j'ai copié aussi le

code des 2 boutons, légèrement modifiés. Tu remplaces tout le texte de la
Sheet18(Tracking_Orders) par ce qui suit (bon courage pour les troncatures
de lignes) (en

pièce jointe, une fois n'est pas coutume, je joins le fichier texte au
format .rar) :


** début des codes ****************************************
Private Sub Showneeded_Click()
Application.ScreenUpdating = False
Range([D2], [D185]).EntireRow.Show
For Each c In Range([D2], [D55])
c.EntireRow.Hidden = (c.Value = 0)
Next c
Application.ScreenUpdating = True
Application.EnableEvents = True ' Secours pour réparer un éventuel
arrêt du code

Worksheet_Change()
End Sub

Private Sub Sub_AfficheTout_Click()
Cells.EntireRow.Hidden = False
Application.EnableEvents = True ' Secours pour réparer un éventuel
arrêt du code

Worksheet_Change()
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)


Application.ScreenUpdating = False

If Target.Address = "$J$3" Then
Application.EnableEvents = False ' évite de relancer la macro car
J4 est modifiée

par le code
' [J4].ClearContents ' ci-dessous j'utilise le nom de la cellule
(au cas où tu la

déplaces)
Range("Offre_Nom").ClearContents ' On l'efface car plus rien à voir
avec le nouveau J3


' *********** initialisations **************************
Datas = "Datas" ' Nom de la plage de données
Offre = "Offers" ' Nom de l'onglet contenant les Datas
Consultation = "Tracking_Orders"
OffreNom = "Offre-Nom" ' Nom de l'entête de colonne des Offres-Nom
Statut = "Status" ' Nom de l'entête de colonne des Statuts
' ************ fin d'initialisation *********************

LaListe = "": compt = 0
' Construire une liste de validation à partir des 'Offre-Nom' qui
conviennent

With Worksheets(Offre)
NumeroColonneOffreNom = Application.Match(OffreNom,
.Range(Datas).Resize(1), 0)

' En recherchant la position de la colonne dans la 1ère ligne des
Datas,

' On évite les erreurs en cas de déplacement ou ajout de
colonnes.

NumeroColonneStatus = Application.Match(Statut,
.Range(Datas).Resize(1), 0)

Decalage = NumeroColonneStatus - NumeroColonneOffreNom

' On cherche le statut chois dans les Datas
' La colonne contenant 'Offre-Nom' est cherchée automatiquement
For Each c In .Range(Datas).Offset(1, NumeroColonneOffreNom -
1).Resize(, 1)

If c.Offset(, Decalage) = [J3] Then
If IsEmpty(c) Or c = "" Then c = "Référence absente"
LaListe = LaListe & c & ",": compt = compt + 1
If compt = 1 Then PremierDeLaListe = c ' ligne gérant le
1er de la liste

' MsgBox LaListe
End If
Next
End With

If LaListe = "" Then ' J'avais dit de ne pas mettre de ',' entre
les guillemets

(14/08/2007 15:10, fin du post)
LaListe = "Aucune correspondance" ' gestion aucun J3 trouvé
dans les datas

Range("Offre_Nom") = LaListe
Else
LaListe = Left(LaListe, Len(LaListe) - 1)
Range("Offre_Nom") = PremierDeLaListe ' compt & "
correspondance(s)"

End If

' Maintenant que "Offre_Nom" est modifié on s'occupe de
masquer/démasquer les lignes

nulles... ou en erreur
For Each c In Range("D2:D185") ' Pourquoi ne commences-tu pas en
ligne 16 ?

If IsError(c.Value) Then ' c peut contenir une erreur
c.EntireRow.Hidden = True
ElseIf c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = True
Else 'If c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = False
End If
Next c

' Enfin on met à jour la nouvelle liste de validation
With Worksheets(Consultation).Range("Offre_Nom").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop,
Operator:= _

xlBetween, Formula1:=LaListe
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = False 'True
End With
Application.EnableEvents = True

ElseIf Target = Range("Offre_Nom") Then ' Là aussi j'utilise la cellule
nommée

' ElseIf Target.Address = "$J$4" Then
Application.ScreenUpdating = False
' Range("D2:D185").EntireRow.Show ' sert à ramener la fenêtre sur
cette zone mais je

crois que l'instruction précédente l'inhibe
' Quand "Offre_Nom" est mis à jour on s'occupe de masquer/démasquer
les lignes

nulles... ou en erreur
For Each c In Range("D2:D185") ' Pourquoi ne commences-tu pas en
ligne 16 ?

If IsError(c.Value) Then ' c peut contenir une erreur
c.EntireRow.Hidden = True
ElseIf c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = True
Else 'If c.Value = 0 Then ' mais ce qui t'intéresse c'est une
valeur nulle

c.EntireRow.Hidden = False
End If
Next c
Application.ScreenUpdating = True
End If

End Sub


' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
** fin des codes *******************************************


En fait ce n'est pas sur une modif de A2 qu'il faut lancer la proc
évènementielle (A2 est

modifiée par formule qui ne la déclenche pas). Il faut le faire sur le
choix de J4 (qui

engendre la modif de A2).
Cependant, le code évènementiel qui surveille J3 modifie la cellule J4 (il
efface J4 puis

renseigne sur le nombre d'occurrence). il faut donc prendre soin de mettre
un

Application.EnableEvents = False au début et un Application.EnableEvents True à la fin.

ATTENTION, si le code bug entre ces 2 instructions les proc
évènementielles ne se

déclencheront plus du tout.
Pour faire roue de secours j'ai ajouté 'Application.EnableEvents = True'
derrière les 2

boutons (Afficher tout et Show only need).
Donc en cas de 'blème, si plus rien ne réagit, tu pourras cliquer sur
'Afficher'Tout' pour

rétablir les évènements.
Si tu ne comprends pas, dit le moi.

Pour la question non répondue elle bloque quel que soit le choix de J3
ou J4


En fait on pouvait reproduire l'erreur avec le code lancé avec tes
boutons.


Quand on sélectionne une option dans J3
En J4 il me mets X concordances

Ne pourrait-on pas faire en sorte que la liste concordante soit
affichée?


oui je sais que je demande beaucoup


La liste concordante n'est affichée QUE SI tu te positionnes sur J4.
Donc, quand tu choisis un statut pour J3 et juste avant de choisir quelque
chose en J4 tu

seras d'accord avec moi pour dire que ce qui est en J4 (issu d'un choix
précédent) n'a

rien à voir avec le nouveau J3. Il faut donc l'effacer. Et si tu
interrompais ton travail

à ce moment la feuille n'aurait pas de sens.
J'ai donc choisi de l'effacer, et, plutôt que d'imposer une des nouvelles
valeurs pour J4

j'ai affiché le nombre de concordances à titre d'information.

Si c'est facile, dis-moi comment
On peut afficher la première valeur (si elle existe) de la liste de

validation rafraichie.

Tu auras l'impression qu'elle est 'affichée'. Mais je le répète, il faut
se mettre en J4

pour qu'elle apparaisse. Le nouveau code que je fournis fait cela, tu
verras si c'est

mieux. Le client est roi.

Pitites remarques...
La zone nommée 'Status' comporte 3 lignes vides. Tu devrais la mettre dans
une feuille à part.

La zone nommée 'Datas' comporte des lignes vides et elle n'est pas
dynamique. J'imagine

que c'est la prochaine étape ?

Plus grosses remarques...
La feuille 'Price Input' te rendrait plus de services si tu évitais les
trous. Les données

devraient être dans une plage bien rectangulaire avec AUCUNE CELLULE VIDE.
Quitte à

recopier plusieurs fois les catégories et les sous-catégories dans les
cellules du

dessous. La feuille 'Product_List' (notamment la colonne B) pourrait y
récupérer plus

simplement les informations.
Mais c'est sûrement l'étape suivante ?

Dans 'Offers',avec les produits en colonnes, tu risques d'avoir des soucis
à gérer des

références-produits supplémentaires. Surtout que par souci d'historique tu
ne pourras pas

récupérer les colonnes des références devenues obsolètes.

Dans 'Make Offer' tu as des cellules fusionnées. C'est dommage, tu
pourrais alléger le

code de la Sub Enregistrer_Offre() en faisant des copies avec
transposition.


Il y a beaucoup de références écrites 'en dur' dans les macros
(Sheets("Make

Offer").Range("j7")...). Les modifications de mise en page et
d'organisation doivent donc

être très lourdes à gérer.

Bon courage, et bon déclic.

Cordialement,
Trirème
???????




Avatar
Trirème
J'ai répondu plutôt mais ça n'est pas passé.
Je ne sais pas si tu vas lire ce post... Fais un signe ;-)


ET CA MARCHE
Tant mieux !


PS Quelles sont tes connaissances en ACCESS?
Minimales



On vient de me dire ...
... qu'Excell ne sera pas suffisant pour tout regrouper ;-((((((((
Le projet est assez ambitieux, et s'il grossit tu atteindras les limites de ce qu'il est

décent de demander de faire à Excel.
Demande une formation Access pour un premier débroussaillement. Après, il y a toujours les
forums.
Par contre, tu devras toujours faire un peu de code. Access gère bien les tables, les
formulaires, les états... Mais pour remplir les tables, les vider, les copier...

J'ai amélioré légèrement le code qui nous intéresse.
J'ai refoulé la gestion des masquages / démasquages de ligne dans la 2ème partie du code
en reprenant d'ailleurs en partie une formulation précédente.
Pas la peine d'effacer "Offre_Nom" pour y écrire la valeur par défaut. Cette valeur par
défaut est d'ailleurs mise à la fin de la 1ère partie est déclenche implicitement la 2ème
partie du code, par réentrance.
Plus la peine de faire des Application.EnableEvents = False/True
Un peu de nettoyage :


Private Sub Showneeded_Click()
Application.ScreenUpdating = False
Range([D2], [D185]).EntireRow.Show
For Each c In Range([D2], [D55])
c.EntireRow.Hidden = (c.Value = 0)
Next c
Application.ScreenUpdating = True
Application.EnableEvents = True ' Secours pour réparer un éventuel arrêt du code
Worksheet_Change()
End Sub
Private Sub Sub_AfficheTout_Click()
Cells.EntireRow.Hidden = False
Application.EnableEvents = True ' Secours pour réparer un éventuel arrêt du code
Worksheet_Change()
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$3" Then
' *********** initialisations constantes ****************
Datas = "Datas" ' Nom de la plage de données
Offre = "Offers" ' Nom de l'onglet contenant les Datas
Consultation = "Tracking_Orders"
OffreNom = "Offre-Nom" ' Nom de l'entête de colonne des Offres-Nom
Statut = "Status" ' Nom de l'entête de colonne des Statuts
' ************ fin d'initialisation *********************
LaListe = "": compt = 0

' Construire une liste de validation à partir des 'Offre-Nom' qui conviennent
With Worksheets(Offre)
NumeroColonneOffreNom = Application.Match(OffreNom, .Range(Datas).Resize(1), 0)
' En recherchant la position de la colonne dans la 1ère ligne des Datas,
' On évite les erreurs en cas de déplacement ou ajout de colonnes.
NumeroColonneStatus = Application.Match(Statut, .Range(Datas).Resize(1), 0)

Decalage = NumeroColonneStatus - NumeroColonneOffreNom
' On cherche le statut choisi dans les Datas
' La colonne contenant 'Offre-Nom' est cherchée automatiquement
For Each c In .Range(Datas).Offset(1, NumeroColonneOffreNom - 1).Resize(, 1)
If c.Offset(, Decalage) = [J3] Then
If IsEmpty(c) Or c = "" Then c = "Référence absente"
LaListe = LaListe & c & ",": compt = compt + 1
If compt = 1 Then PremierDeLaListe = c ' ligne gérant le 1er de la liste
End If
Next
End With
If LaListe = "" Then
LaListe = "Aucune correspondance" ' gestion aucun J3 trouvé dans les datas
ValeurDéfaut = LaListe
Else
LaListe = Left(LaListe, Len(LaListe) - 1)
ValeurDéfaut = PremierDeLaListe
End If

' On met enfin à jour la nouvelle liste de validation
With Worksheets(Consultation).Range("Offre_Nom").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=LaListe
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = False 'True
End With

' Seulement à cet instant on met "Offre_Nom" à jour
Range("Offre_Nom") = ValeurDéfaut ' Ce qui déclenche l'autre partie de la macro

ElseIf Target.Address = Range("Offre_Nom").Address Then ' Là aussi j'utilise la cellule nommée
' Quand "Offre_Nom" est mis à jour on s'occupe de masquer/démasquer les lignes
nulles... ou en erreur
Application.ScreenUpdating = False
For Each c In Range("D2:D185") ' Pourquoi ne commences-tu pas en ligne 16 ?
If IsError(c.Value) Then ' c peut contenir une erreur
c.EntireRow.Hidden = True
Else
c.EntireRow.Hidden = (c.Value = 0)
End If
Next c
Application.ScreenUpdating = True
End If

Cordialement,
Trirème

Avatar
Rex
Bonjour

Je ne sais pas si je t'ai répondu ou pas

Je ne sais même pas si celui-ci va passer

Je suis sous Mac à Houffalize

On verra bien

Rex



J'ai répondu plutôt mais ça n'est pas passé.
Je ne sais pas si tu vas lire ce post... Fais un signe ;-)


ET CA MARCHE
Tant mieux !


PS Quelles sont tes connaissances en ACCESS?
Minimales



On vient de me dire ...
... qu'Excell ne sera pas suffisant pour tout regrouper ;-((((((((
Le projet est assez ambitieux, et s'il grossit tu atteindras les limites

de ce qu'il est décent de demander de faire à Excel.
Demande une formation Access pour un premier débroussaillement. Après,
il y a toujours les forums.
Par contre, tu devras toujours faire un peu de code. Access gère bien
les tables, les formulaires, les états... Mais pour remplir les tables,
les vider, les copier...

J'ai amélioré légèrement le code qui nous intéresse.
J'ai refoulé la gestion des masquages / démasquages de ligne dans la
2ème partie du code en reprenant d'ailleurs en partie une formulation
précédente.
Pas la peine d'effacer "Offre_Nom" pour y écrire la valeur par défaut.
Cette valeur par défaut est d'ailleurs mise à la fin de la 1ère partie
est déclenche implicitement la 2ème partie du code, par réentrance.
Plus la peine de faire des Application.EnableEvents = False/True
Un peu de nettoyage :


Private Sub Showneeded_Click()
Application.ScreenUpdating = False
Range([D2], [D185]).EntireRow.Show
For Each c In Range([D2], [D55])
c.EntireRow.Hidden = (c.Value = 0)
Next c
Application.ScreenUpdating = True
Application.EnableEvents = True ' Secours pour réparer un éventuel
arrêt du code Worksheet_Change()
End Sub
Private Sub Sub_AfficheTout_Click()
Cells.EntireRow.Hidden = False
Application.EnableEvents = True ' Secours pour réparer un éventuel
arrêt du code Worksheet_Change()
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$J$3" Then
' *********** initialisations constantes ****************
Datas = "Datas" ' Nom de la plage de données
Offre = "Offers" ' Nom de l'onglet contenant les Datas
Consultation = "Tracking_Orders"
OffreNom = "Offre-Nom" ' Nom de l'entête de colonne des Offres-Nom
Statut = "Status" ' Nom de l'entête de colonne des Statuts
' ************ fin d'initialisation *********************
LaListe = "": compt = 0

' Construire une liste de validation à partir des 'Offre-Nom' qui
conviennent
With Worksheets(Offre)
NumeroColonneOffreNom = Application.Match(OffreNom,
.Range(Datas).Resize(1), 0)
' En recherchant la position de la colonne dans la 1ère ligne
des Datas,
' On évite les erreurs en cas de déplacement ou ajout de colonnes.
NumeroColonneStatus = Application.Match(Statut,
.Range(Datas).Resize(1), 0)

Decalage = NumeroColonneStatus - NumeroColonneOffreNom
' On cherche le statut choisi dans les Datas
' La colonne contenant 'Offre-Nom' est cherchée automatiquement
For Each c In .Range(Datas).Offset(1, NumeroColonneOffreNom -
1).Resize(, 1)
If c.Offset(, Decalage) = [J3] Then
If IsEmpty(c) Or c = "" Then c = "Référence absente"
LaListe = LaListe & c & ",": compt = compt + 1
If compt = 1 Then PremierDeLaListe = c ' ligne gérant
le 1er de la liste
End If
Next
End With
If LaListe = "" Then
LaListe = "Aucune correspondance" ' gestion aucun J3 trouvé
dans les datas
ValeurDéfaut = LaListe
Else
LaListe = Left(LaListe, Len(LaListe) - 1)
ValeurDéfaut = PremierDeLaListe
End If

' On met enfin à jour la nouvelle liste de validation
With Worksheets(Consultation).Range("Offre_Nom").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop,
Operator:= _
xlBetween, Formula1:=LaListe
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = False 'True
End With

' Seulement à cet instant on met
"Offre_Nom" à jour
Range("Offre_Nom") = ValeurDéfaut ' Ce qui déclenche l'autre
partie de la macro

ElseIf Target.Address = Range("Offre_Nom").Address Then ' Là aussi
j'utilise la cellule nommée
' Quand "Offre_Nom" est mis à jour on s'occupe de masquer/démasquer
les lignes nulles... ou en erreur
Application.ScreenUpdating = False
For Each c In Range("D2:D185") ' Pourquoi ne commences-tu pas en
ligne 16 ?
If IsError(c.Value) Then ' c peut contenir une erreur
c.EntireRow.Hidden = True
Else
c.EntireRow.Hidden = (c.Value = 0)
End If
Next c
Application.ScreenUpdating = True
End If

Cordialement,
Trirème



1 2