Tri item sur plusieurs feuilles

didier09

XLDnaute Occasionnel
Bonjour à tous,
Je voudrais dans une listebox récupérer des valeurs en fonction de l'item sélectionné dans une autre listbox.
Je joint un fichier pour , j'espère , plus de clarté.
Merci d'avance pour votre aide.
Didier [file name=Maintenance.zip size=20432]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Maintenance.zip[/file]
 

Pièces jointes

  • Maintenance.zip
    20 KB · Affichages: 14
  • Maintenance.zip
    20 KB · Affichages: 12
  • Maintenance.zip
    20 KB · Affichages: 13
D

didier09

Guest
Bonjour,
J'ai travaillé sur mon fichier et je me trouve face à une erreur que je n'arrives pas à solutionner:

Erreur d'exécution '457':
Cette clé est déjà associée à un élément de cette collection.

Je me suis inspiré de la méthode utilisée pour mes différents ListBox
mais la différence est que je veux trier une liste sur une feuille à partir de l'item d'une autre feuille.
Bonne journée
Didier [file name=Maintenance1.zip size=18373]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Maintenance1.zip[/file]
 

Pièces jointes

  • Maintenance1.zip
    17.9 KB · Affichages: 14

didier09

XLDnaute Occasionnel
Salut Hervé,
J'ai essayé ta méthode et le programme se plante: Excel ne répond pas, terniner maintenant. j'ai supprimé On Error Resume Next et
On Error GoTo 0 et là j'ai l'erreur '457', Cette clé est déjà associée à un élément de cette collection.
Merci pour ton aide
Didier
 

Hervé

XLDnaute Barbatruc
Bonsoir didier

Tu avait 2 bugs dans ta macro :

1er le 457 de la collection
2ème un souci de sélection de la plage filtré

le 1er bug se déclenchait en premier masquant le deuxième, et le on error corrigeant le 1er à mis en évidence le deuxième.

ton deuxième bug :

en indiquant comme plage: .Range('D2', .Range('D65536')

lorsque tu sélectionnait ton premier élément de listbox la seule ligne visible de la plage filtré etait la ligne 2.

et comme vba ne sait pas interpréter d2:d2 en plage filtré il te sélectionnait toutes la feuille :eek:

La seul parade que j'ai trouvé sans devoir tout refaire c'est de faire commencer la sélection de la plage filtrée en D1 au lieu de D2.

et donc de corriger le renvoi de la collection en passant par une boucle for to commencant à 2 pour éviter la ligne d'entête.

le code :

Set Plage = .Range('D1', .Range('D65536').End(xlUp)).SpecialCells(xlCellTypeVisible)
On Error Resume Next
For Each Cel In Plage
valeur = Cel.Address
Col.Add Cel.Text, Cel.Text
Next Cel
.AutoFilterMode = False
End With
On Error GoTo 0
For i = 2 To Col.Count
ListBox_composants.AddItem Col(i)
Next i

ce code corrige chez moi les deux bugs.

en espérant avoir été clair.

salut
 

didier09

XLDnaute Occasionnel
Re,
Tout d’abord merci à toi de m’aider à résoudre ce problème.
J’ai adapté ta macro à mon classeur, cela ne bugge plus.
Par contre cela me rapatri toutes les données de la colonne et pas seulement les données concernées par l’équipement. Je joins un classeur avec davantage de valeurs pour que cela soit plus représentatif.
Juste en quelques mots des explications :
Nous avions une gestion de maintenance assistée par ordinateur qui ne fonctionne plus, elle était seulement compatible avec Windows 95. Elle fonctionnait autour d’une base Access que je ne peux convertir car trop ancienne. (Version 1.X)
Mes feuilles sont en réalité les tables de la base de donnée. Ces tables étaient liées par des clés que j’ai remplacé
par les noms des équipements.
En ayant une macro capable de me trier ces valeurs je pourrais récupérer aussi des définitions de maintenance
par équipement, des maintenances déjà éffectuées , etc…
Didier

[file name=Maintenance1_20051019195351.zip size=38467]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Maintenance1_20051019195351.zip[/file]
 

Pièces jointes

  • Maintenance1_20051019195351.zip
    37.6 KB · Affichages: 10

Hervé

XLDnaute Barbatruc
re didier :)

euh...quand tu as copié mon code et collé dans ta macro, tu as eu un peu la main lourd. :)

tu en as trop enlevé.

Il te manque dans cette version toute la partie autofiltre que l'on trouvait dans ta version précédente.


voici le code à reprendre :

ListBox_composants.Clear
With WsComposants
.AutoFilterMode = False
.Columns('B:B').AutoFilter 1, ListBox_equipements_noms
Set Plage = .Range('D1', .Range('D65536').End(xlUp)).SpecialCells(xlCellTypeVisible)
On Error Resume Next
For Each Cel In Plage
valeur = Cel.Address
Col.Add Cel.Text, Cel.Text
Next Cel
.AutoFilterMode = False
End With
On Error GoTo 0
For i = 2 To Col.Count
ListBox_composants.AddItem Col(i)
Next i

salut
 

didier09

XLDnaute Occasionnel
Merci hervé,
Effectivement , je n'y ai pas été de main morte....Après correction
la macro fonctionne parfaitement quand il existe un composant pour l'équipement, par contre Excel se plante s'il n'y a rien à afficher.
Comment gérer ce cas, avec une boucle If ?
là je ne sais pas où intercaler le controle
Didier
 

Hervé

XLDnaute Barbatruc
re didier

Une réponse un peu bricolo rigolo, mais j'ai pas mieux en stock.

tester si la plage fait plus de 16 millions de cellules et refuser dans ce cas.

ListBox_composants.Clear
With WsComposants
.AutoFilterMode = False
.Columns('B:B').AutoFilter 1, ListBox_equipements_noms
Set Plage = .Range('D1', .Range('D65536').End(xlUp)).SpecialCells(xlCellTypeVisible)
If Plage.Count > 16000000 Then Exit Sub
On Error Resume Next
For Each Cel In Plage

Col.Add Cel.Text, Cel.Text
Next Cel
.AutoFilterMode = False
End With
On Error GoTo 0
For i = 2 To Col.Count
ListBox_composants.AddItem Col(i)
Next i

salut
 

didier09

XLDnaute Occasionnel
Bonjour Hervé,
Ta macro fonctionne parfaitement avec cet ajout.Merci pour ton
intérêt.
J'ai une question qui me taraude: pourquoi avoir mis le maxi
Plage.Count supérieur à 16 millions? la plage ne peux contenir
seulement 65536 cellules ? j'ai essayé de mettre la valeur à 65536
et cela fonctionne aussi. j'ai donc mis un point d'arrêt pour comprendre sur la ligne
If Plage.Count > 16000000 Then Exit Sub
et la valeur était effectivement de plus de 16 millions (16754688)???
Didier
 

Hervé

XLDnaute Barbatruc
re didier

:)

on en revient à la conversation d'hier, lorsque la plage filtrer ne fait qu'une ligne, on ne doit pas avoir la bonne syntaxe, et vba sélectionne tout la feuille. Soit 65536 lignes * 256 colonnes.

j'ai donc mis un arret à 16 M , mais un arret à 65536 aurait aussi suffit.

Par habitude, je prévois toujours large surtout quand (comme dans ton exemple) la valeur d'arret n'a pas d'incidence sur le reste du code ou la vitesse de traitement.

Il doit etre possible de corriger ce code pour ne pas avoir à faire ce type de controle, mais je manque de temps en ce moment pour apprendre cet syntaxe.

salut
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 519
dernier inscrit
Thomas_grc11