Liste déroulante dynamique: mises à jour sur toutes les feuilles

leop93

XLDnaute Occasionnel
Bonjour à tous

Je vous embête encore une fois, mais ça sera la dernière fois de la semaine promis, enfin... :rolleyes:

J'aimerais que dans mon classeur lorsque je change l'état d'un objet dans les feuilles DESSIN et MECANIQUE, le changement d'état s'effectue automatiquement dans les 5 premières feuilles (RADO, OMEGA, GLACE, PIERRE, CERAMIQUE) ainsi que dans ces deux feuilles (DESSIN et MECANIQUE).

Je me doute que je vais devoir utiliser un code de ce type:
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
*CODE*
End Sub
pour que l'actualisation ait lieu en continue, mais je ne vois vraiment pas comment gérer la liaison entre les différentes feuilles via les états disponibles dans les listes déroulantes....

Je vous ai mis en pièce-jointe mon classeur Excel où j'aimerais mettre en place ces "liaisons via listes déroulantes".

Merci pour votre aide et bonne fin de semaine

Leop93
 

Pièces jointes

  • listedéroulantedynamique.xlsm
    79.5 KB · Affichages: 104

job75

XLDnaute Barbatruc
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Bonjour leop93,

Voyez cette macro dans Module1 du fichier joint :

Code:
Sub MAJ(Target As Range)
Dim w As Worksheet, tablo, v1, v2, v3, t As Range, i&
Static flag As Boolean
Set Target = Intersect(Target, Target.Parent.[I:I], Target.Parent.UsedRange)
If flag Or Target Is Nothing Then Exit Sub
Application.ScreenUpdating = False
flag = True
For Each w In Worksheets
  w.Activate 'une macro en a besoin...
  tablo = Range("A1:C1", [A65536].End(xlUp))
  For Each t In Target
    v1 = t.Offset(, -8)
    v2 = t.Offset(, -7)
    v3 = t.Offset(, -6)
    For i = 1 To UBound(tablo)
      If tablo(i, 1) = v1 And tablo(i, 2) = v2 And _
        tablo(i, 3) = v3 Then Cells(i, "I") = t
    Next
  Next
Next
flag = False
Target.Parent.Activate
End Sub
Elle est lancée par les Worksheet_Change dans les feuilles DESSIN et MECANIQUE.

Nota 1 : pas trop compris vos listes de validation.

En feuille DESSIN colonne I il y a "Glace" qui n'est pas dans la liste...

Idem en feuille MECANIQUE pour "Relancer série"...

Nota 2 : pas terrible d'activer les feuilles, en VBA ce n'est généralement pas nécessaire.

Sauf que votre macro de coloration en a besoin...

A+
 

Pièces jointes

  • listedéroulantedynamique (1).xls
    197 KB · Affichages: 101
Dernière édition:

job75

XLDnaute Barbatruc
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Bonjour leop93,

Votre macro colormacro dans ThisWorkbook prenait vraiment beaucoup de temps...

Je l'ai revue, voyez la différence avec ce fichier (2).

A+
 

Pièces jointes

  • listedéroulantedynamique (2).xls
    144.5 KB · Affichages: 99

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Salut Job75

Wahou, une véritable oeuvre d'art. Merci beaucoup.

Et l'optimisation du code pour la couleur... Quelle rapidité ! :eek:

Pour les questions que tu te poses:

- l'état Glace permet à la référence de n'être envoyé que dans la feuille DESSIN au lieu de DESSIN et MECANIQUE
- l'état Relancer série permet à la référence de n'être envoyé que dans la feuille MECANIQUE au lieu de DESSIN et MECANIQUE

J'ai vu que tu étais aussi passé sur mon autre sujet, ça fonctionne presque comme voulu, je te réponds là bas. ;)

Encore merci.

Bonne semaine

Leop93

EDIT: Je me pose une question, pour la liaison des états, est ce qu'il serait possible de ne pas actualiser l'état dans certaines feuilles s'il y a changement dans les feuilles DESSIN ou CLASSEUR. Car j'ai des feuilles d'archivages et l'état doit rester Terminé ou En fabrication et ne pas retourner à En conception si on modifie l'état.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Bonjour leop93,

EDIT: Je me pose une question, pour la liaison des états, est ce qu'il serait possible de ne pas actualiser l'état dans certaines feuilles s'il y a changement dans les feuilles DESSIN ou CLASSEUR. Car j'ai des feuilles d'archivages et l'état doit rester Terminé ou En fabrication et ne pas retourner à En conception si on modifie l'état.

Il suffit de tester en conséquence :

Code:
archive = Array("XXX", "YYY", "ZZZ") 'noms des feuilles d'archive
'---
  test = IsError(Application.Match(w.Name, archive, 0))
 '---
    For i = 1 To UBound(tablo)
      If test Or Cells(i, "I") <> "En fabrication" And Cells(i, "I") <> "Terminé" Then _
        If tablo(i, 1) = v1 And tablo(i, 2) = v2 And tablo(i, 3) = v3 Then Cells(i, "I") = t
    Next
Fichier (3).

A+
 

Pièces jointes

  • listedéroulantedynamique (3).xls
    199 KB · Affichages: 58
Dernière édition:

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Merci pour la rapidité.

Mais je me suis rendu compte que je t'ai dit une bétise... Quand j'ai dit "l'état doit rester Terminé ou En fabrication et ne pas retourner à En conception si on modifie l'état", en fait il faudrait qu'il n'y ait aucune liaison avec toutes les feuilles d'archivages, mais uniquement avec celle présentes dans le fichier test que j'ai fourni.

Est ce qu'il serrait possible de faire un: feuillesliees = Array("RADO", "OMEGA", "GLACE", "PIERRE", "CERAMIQUE", "DESSIN", "MECANIQUE") qui elles seules s'auto-mettent à jour ?

Et que donc ces feuilles là: archive = Array("ARCHIVAGE_RADO", "ARCHIVAGE_OMEGA", "ARCHIVAGE_GLACE", "ARCHIVAGE_PIERRE", "ARCHIVAGE_CERAMIQUE") ne soient pas mises à jour lors d'un changement d'état.
 

job75

XLDnaute Barbatruc
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Re,

Alors c'est plus simple et vous pouviez trouver le code :

Code:
Sub MAJ(Target As Range)
Dim archive, w As Worksheet, tablo, v1, v2, v3, t As Range, i&
Static flag As Boolean
Set Target = Intersect(Target, Target.Parent.[I:I], Target.Parent.UsedRange)
If flag Or Target Is Nothing Then Exit Sub
archive = Array("ARCHIVAGE_RADO", "ARCHIVAGE_OMEGA", "ARCHIVAGE_GLACE", "ARCHIVAGE_PIERRE", "ARCHIVAGE_CERAMIQUE")
Application.ScreenUpdating = False
flag = True
For Each w In Worksheets
  If IsError(Application.Match(w.Name, archive, 0)) Then
    w.Activate 'une macro en a besoin...
    tablo = Range("A1:C1", [A65536].End(xlUp))
    For Each t In Target
      v1 = t.Offset(, -8)
      v2 = t.Offset(, -7)
      v3 = t.Offset(, -6)
      For i = 1 To UBound(tablo)
        If tablo(i, 1) = v1 And tablo(i, 2) = v2 And _
          tablo(i, 3) = v3 Then Cells(i, "I") = t
      Next
    Next
  End If
Next
flag = False
Target.Parent.Activate
End Sub
Fichier (4).

A+
 

Pièces jointes

  • listedéroulantedynamique (4).xls
    199 KB · Affichages: 66

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Effectivement. J'avais essayé de le coder le temps que tu répondes (et un petit peu avant de poser la question) mais il me manquait le "If IsError(Application.Match(w.Name, archive, 0)) Then".

Encore merci, ça marche parfaitement. :)
 

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Bonjour à tous

J'aurais aimé appliquer une petite modification pour que le code donné par Job75 prenne en compte pas seulement la colonne I mais toutes les colonnes (de A à V), est ce que c'est possible ?

J'ai essayé de modifier [I:I] par [A:V] mais après les v1 = t.Ofset ne suivent plus et je ne comprends pas bien le fonctionnement de cette macro.

Est ce qu'il faut dans ce cas que je cré autant de v que de colonnes (c'est à dire 22) avec un Offset de plus en plus faible (-21, -20, -19, ...) ?

Pour la pièce jointe, il faudrait prendre celle que Job75 a fourni 2 messages plus haut. Il manque une colonne V que j'ai ajouté par la suite, mais je pourrai modifier le code en conséquence une fois celui-ci compris.

Bonne journée

Leop93
 

job75

XLDnaute Barbatruc
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Bonjour leop93,

Je répète la demande de mon MP :

Joignez le fichier avec un exemple de modification et des résultats attendus dans les feuilles.

A+
 

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Bonjour Job75

D'accord, pourtant il n'y a rien à modifier par rapport à ta pièce jointe...

Donc je l'ai mise en pièce jointe de ce message, j'ai ajouté des dezdzd en bout de ligne dans la zone que j'aimerais actualiser automatiquement entre les feuilles DESSIN/MECANIQUE et les feuilles de Projets (RADO OMEGA GLACE PIERRE CERAMIQUE) et ce dans les 2 sens.

Il se passerait la même chose que pour l'état, sauf qu'ici ça serait les modifications sur chaque colonne de chaque ligne qui seraient prises en compte, et non uniquement le changement d'état en colonne I.

Leop93
 

Pièces jointes

  • modificationdynamique.xls
    192 KB · Affichages: 79

job75

XLDnaute Barbatruc
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Re,

Je suppose que c'est cela que vous voulez :

Code:
Sub MAJ(Target As Range)
Dim archive, w As Worksheet, tablo, v1, v2, v3, t As Range, col%, i&
Static flag As Boolean
Set Target = Intersect(Target, Target.Parent.[A:V], Target.Parent.UsedRange)
If flag Or Target Is Nothing Then Exit Sub
archive = Array("ARCHIVAGE_RADO", "ARCHIVAGE_OMEGA", "ARCHIVAGE_GLACE", "ARCHIVAGE_PIERRE", "ARCHIVAGE_CERAMIQUE")
Application.ScreenUpdating = False
flag = True
For Each w In Worksheets
  If IsError(Application.Match(w.Name, archive, 0)) Then
    w.Activate 'une macro en a besoin...
    tablo = Range("A1:C1", [A65536].End(xlUp))
    For Each t In Target
      col = t.Column
      v1 = t.Offset(, 1 - col)
      v2 = t.Offset(, 2 - col)
      v3 = t.Offset(, 3 - col)
      For i = 1 To UBound(tablo)
        If tablo(i, 1) = v1 And tablo(i, 2) = v2 And _
          tablo(i, 3) = v3 Then Cells(i, col) = t
      Next
    Next
  End If
Next
flag = False
Target.Parent.Activate
End Sub
La modification en DESSIN!K5 est répercutée sur les autres feuilles.

Fichier (5).

A+
 

Pièces jointes

  • listedéroulantedynamique (5).xls
    154 KB · Affichages: 83

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

MA-GNI-FIQUE !

Et tu n'as modifié que cette ligne de ce que j'ai compris:

Code:
Set Target = Intersect(Target, Target.Parent.[A:V], Target.Parent.UsedRange)

Si c'est bien le cas, j'ai voulu effectuer des modifications trop compliquées par rapport à ce qu'il fallait faire...

Encore une fois merci Job75. :eek:

EDIT: et aussi le (i, col) à la fin du code, je ne pense pas que j'aurais réussi à le trouver. :confused:
 
Dernière édition:

leop93

XLDnaute Occasionnel
Re : Liste déroulante dynamique: mises à jour sur toutes les feuilles

Effectivement, c'est ce que j'ai remarqué en essayant de comprendre les modifications et le fonctionnement du code.

Merci encore une fois, vraiment au top. :)
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 331
Membres
103 188
dernier inscrit
evebar