ElseIf Target.Address = "$I$2" And Target.Count = 1 Then
ElseIf Target.Address = "$I$2" And Target.Count = 1 Then
ElseIf Target.Address = "$I$2" And Target.Count = 1 Then
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
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
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
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 :
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)
Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?
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 :
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)
Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?
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 :
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)
Alors que la même ligne ne bloque pas dans l'autre code
Avec les mêmes choix pour J3 et J4 ?
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
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
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
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
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
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
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
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
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
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
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
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
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
???????
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
???????
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
???????
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
???????
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
???????
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
???????
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
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
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
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
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
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