Classe Listview absente des bibliothèques
#1
Débutant XLPages

Inscription: 25/03/2011

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 25-03-2011 08h43
Bonjour,

Problématique 1

J'utilise un listview trié par défaut sur une des colonnes qui fonctionne parfaitement à la première édition.
Lorsque je le met à jour après une saisie (par la procédure utilisée à l'initialisation) l'édition se compose d'une ligne vierge sur deux. Toutes les clés étant présentes. Après des heures (jours !) de recherches j'ai trouvé comme solution de courtcircuiter la procédure de tri : 
'LvwClients.SortOrder = lvwAscending
'LvwClients.SortKey = 1
'LvwClients.Sorted = True
La mon édition est cohérente mais j'oblige l'utilisateur à trier par
[Private Sub LvwClients_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)]

Problématique 2
J'importe ce même formulaire dans un nouveau fichier qui sera mon fichier "programme" et là quand je lance mon Usf j'ai sur cette procédure (_ColumnClick) le msg :
"Erreur de compilation, Type défini par l'utilisateur non défini"
Je m'aperçois qu'effectivement la classe listview est absente de toute bibliothèque et je ne sais pas comment l'ajouter. Mais comme elle était bien évidemment tout aussi absente dans l'autre classeur où l'Usf fonctionnait bien (au tri près), je me dis que j'ai un second problème.

Merci de votre aide
Cordialement 


Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#2
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 25-03-2011 20h30
Bonjour Danisoaz,

Si tu fournissais un petit classeur en exemple peut-être qu'on pourrait tirer tout ça au clair plus rapidement.

Je prends note des deux points et j'attends le petit classeur.

Cordialement,

Guy

Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#3
Débutant XLPages

Inscription: 25/03/2011

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 29-03-2011 13h32
Bonjour Guy,

Merci de ton concours et désolé pour ce délai mais je m'étais absenté quelques jours.

Cordialement
Daniel


Pièce jointe:
xlsm Presse€Book.xlsm   [ Taille: 39.36 Ko - Téléchargements: 738 ]
Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#4
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 29-03-2011 15h03
Bonjour Daniel,

Problématique 2 :

Je n'ai jamais eu ce problème tout simplement parce que je n'ai jamais exporté de formulaire portant des contrôles VB6 d'un classeur à l'autre. Ma curiosité a été piquée donc.

J'ai tenté la chose avec Excel 2010 et Excel 2003 et effectivement le problème se produit à l'exportation dans l'une et l'autre version.

Dans la boîte à outils contrôles il y a bien le contrôle Microsoft ListView Control 6.0 (SP6). Si je place un ListView sur un formulaire une référence à l'OCX maître Microsoft Windows Common Controls 6.0 (SP6) est ajoutée automatiquement dans les références du projet. Bien.

Par contre l'importation du formulaire dans un nouveau classeur n'inscrit pas de référence au Microsoft Windows Common Controls 6.0 (SP6) automatiquement. Tant pis. Suffit de l'inscrire et le tout compile sans problème.

Problématique 1 :

Un classeur dont la feuille Clients existe et n'est pas vide serait indiqué. J'aperçois quelques contorsions dans le code qui me semblent suspectes. Des données seraient utiles à tirer la chose au clair.

Cordialement,

Guy

Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#5
Débutant XLPages

Inscription: 25/03/2011

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 31-03-2011 10h33
Bonjour Guy,

"Suffit de l'inscrire et le tout compile sans problème" inscrire quoi, où, comment ?

Ci joint le fichier tables avec la feuille clients

Merci beaucoup
Cordialement
Daniel


Pièce jointe:
xlsx Tables.xlsx   [ Taille: 67.73 Ko - Téléchargements: 1863 ]
Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#6
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 31-03-2011 11h00
Bonjour Daniel,

Pour l'inscription de la référence :
Dans l'éditeur VBA (VBE), menu Outils->Références... Puis dans la liste cocher Microsoft Windows Common Controls 6.0. 

Une fois cette référence inscrite il n'y aura plus d'erreur de compilation (Menu Débogage->Compiler VBAProject)

J'ai importé le formulaire UsfClients dans Tables.xlsx puis effectué la manipulation décrite y compris la compilation, renommé le fichier Tables.xlsm et tout fonctionne.

Seul petit problème, une fois l'importation effectuée le classeur pèse plus de 100 Ko; pas de pièce jointe donc. Tente la chose de ton côté et tout devrait rentrer dans l'ordre pour ce qui est de l'erreur de compilation (Problématique 2).

Cordialement,

Guy

Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#7
Débutant XLPages

Inscription: 25/03/2011

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 05-04-2011 11h37
Bonjour Guy,

Merci de tes éclaircissements.
En fait "Microsoft Windows Common Controls 6.0" ne figure pas dans la liste des références. Pour le faire apparaître il faut insérer un contrôle listview bidon à partir de la boite à outils. Avoue que c'est un peu tordu. On m'avait prévenu que la manipulation de ce contrôle n'était pas simple mais quand même.

Ceci étant réglé et si ne n'est pas trop te demander peux tu te pencher sur la problématique 1 évoqué dans mon premier post ? (dans procédure Private Sub MajListingClients(), problème de tri incohérent après une réinitialisation).

Cordialement
Daniel 
Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#8
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 05-04-2011 22h53
Bonjour Daniel,

Le petit bout de code suivant devrait aider ta cause :

Option Explicit ' Requis, indispensable, péremptoire et tutti quanti!

' Pour distinguer les majuscules des minuscules dans le tri
' on posera la directive Option Compare Binary. Lors a > A, etc.
Option Compare Text

'---------------------------------------------------------------------------------------
' Procédure : LvwClients_ColumnClick
' Auteur    : Guy Courville
' Date      : mardi 5 avril 2011
'
' But       : Brouillon 1 de solution pour la Problématique 1 soumise par Danisoaz
'             au forum de MyDearFriend
'
' Référence : http://www.mdf-xlpages.com/modules/ne ... opic_id=768#forumpost4567
'
' Note      : Il se peut que la méthode de tri en bacule sur l'une quelconque
'             des colonnes soit inutile. Il suffira alors de filtrer la valeur
'             de ColumnHeader.SubItemIndex à 1 comme dans les lignes de code
'             commentées du classeur original.
'
'---------------------------------------------------------------------------------------
'
Private Sub LvwClients_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
 
  ' Une variable statique pour garder le dernier ordre de tri.
  ' Comme, fort heureusement, l'énumération ListSortOrderConstants
  ' est définie par :
  '
  ' Public Enum ListSortOrderConstants
  '  lvwAscending
  '  lvwDescending
  ' End Enum
  '
  ' et qu'ainsi définies les constantes symboliques de l'énumération ont
  ' pour valeur entière 0 (lvwAscending) et 1 (lvwDescending) respectivement.
  ' On peut basculer la valeur de OrdreDeTri à chaque appel de la
  ' procédure.
  '
  ' Un clic sur une colonne entraîne un tri dans l'ordre inverse du précédent.
  ' À noter qu'à l'initialisation les données sont dans l'ordre du chargement.
  ' Au premier clic, puisque OrdreDeTri = 0 (valeur par défaut) le tri s'effectuera
  ' selon (0 + 1) Mod 2 = 1, soit lvwDescending.
 
  Static OrdreDeTri As MSComctlLib.ListSortOrderConstants
 
  OrdreDeTri = (OrdreDeTri + 1) Mod 2
 
  ' Pour que le tri s'effectue il faut poser la propriété Sorted à True;
  ' on évitera de poser 1 ou 0, la propriété Sorted est un booléen donc
  ' utilisons un Booléen c'est consistant et plus lisible.
  ' MSDN (Microsoft Software Developer Network
)
  ' object.Sorted [= boolean]
  ' ....
  ' Remarks
  ' For the ListView control, the Sorted property must be set to True for the
  ' settings in the SortOrder and SortKey properties to take effect.
  ' Each time the coordinates of a ListItem change, the Sorted property is set to False.

 
  LvwClients.Sorted = True
 
  LvwClients.SortOrder = OrdreDeTri ' Basculera l'ordre de tri à chaque appel.
 
  ' Ici on utilise la propriété
SubItemIndex
  ' MSDN
  ' Remarks
  ' Subitems are arrays of strings representing the ListItem object's data when
  ' displayed in Report view (note : ce qui est le cas ici.).
  ' The first column header always has a SubItemIndex property set to 0
  ' because the small icon and the ListItem object's text always appear in
  ' the first column and are considered ListItem objects rather than subitems.
  ' The number of column headers dictates the number of subitems.
  ' There is always exactly one more column header than there are subitems.
 
  ' Comme la colonne Code est masquée le SubItemIndex nous sert bien...
  ' À valider et à peaufiner...
  LvwClients.SortKey = ColumnHeader.SubItemIndex
 
End Sub
 

Copie correctement ce truc dans ton formulaire UsfClients  en écrasant l'ancienne procédure.

Il se peut que tu aies à polir quelques coins mais commençons par là. On verra pour la suite.

Je monte un classeur minceur avec quelques lignes de données seulement et je te le transmets aussitôt que j'ai une ou deux minutes.

Cordialement,

Guy




Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#9
Débutant XLPages

Inscription: 25/03/2011

Messages: 15

Système d'exploitation:
PC
Version Excel utilisée:
2007
Posté le : 06-04-2011 15h09
Bonjour Guy,

Ma procédure "Private Sub LvwClients_ColumnClick..." fonctionne très bien (ce qui n'exclut pas que je puisse améliorer le code avec tes remarques !) et j'ai du mal poser ma problématique 1, donc je reprends :

Dans Private Sub UserForm_Initialize(),  le listview est initialisé , puis chargé et trié sur la colonne client par appel de 
MajListingClients. Ceci sans aucun problème.

Par contre après la saisie d'un nouveau client je veux évidemment rafraîchir mon listview avec les nouvelles données. Pour ce faire j'appelle la même MajListingClients et là l'édition se compose d'une ligne vierge sur deux bien que toutes les clés soient présentes.
Or quand je saute les 3 lignes ci dessous de MajListingClients (état du code dont tu disposes), l'édition est parfaitement cohérente en terme de données mais non triée sur la colonne client.
'LvwClients.SortOrder = lvwAscending
'LvwClients.SortKey = 1
'LvwClients.Sorted = True

C'est pas dramatique, mais comme ce n'est pas logique ça m'empêche de dormir !

Merci encore

Cordialement
Daniel 

Hors Ligne
Rapport   Haut 

Re: Classe Listview absente des bibliothèques
#10
Accro XLPages

Inscription: 09/01/2008
De Montréal, Québec

Messages: 463

Système d'exploitation:
PC
Version Excel utilisée:
97 à 2016
Posté le : 09-04-2011 16h24
Bonjour Daniel,

J'ai suivi le chargement de la liste pas à pas en scrutant les étapes une à une. Il apparaissait qu'à l'enregistrement d'un nouvel élément, plus précisément à l'exécution de la seconde ligne du bloc suivant :

       With LvwClients.ListItems(vNbLignes)
            .ListSubItems.Add 1, , vCellule.Offset(0, 3)   'Client
            .ListSubItems.Add 2, , vCellule.Offset(0, 5)  'prénom
            .ListSubItems.Add 3, , vCellule.Offset(0, 6)  'Nom
            .ListSubItems.Add 4, , vCellule.Offset(0, 15) 'tél
            .ListSubItems.Add 5, , vCellule.Offset(0, 16) 'mobile
            .ListSubItems.Add 6, , vCellule.Offset(0, 18) 'mail
            Set vCellule = vCellule.Offset(1, 0)
            vNbLignes = vNbLignes + 1
        End With


l'élément 1 prenait la valeur 2, l'élément 2 prenait la valeur 4, l'élément 3 la valeur 6 etc.

À la passe suivante tout recommence mais à l'envers. L'élément 1 passe à 7, le 2 à 6, le 3 à 5, etc. et ça tourne les enfants ça tourne.

Comportement absolument déroutant. Inextricable.
Au bout du compte seuls les éléments impairs possédaient des ListSubItems non vides d'ou une ligne sur deux vide.
Tu pourras noter que ce ne sont que les lignes impaires qui portent des ListSubItems non vides.

Je t'invite à zieuter la chose par toi-même. Tu verras que le comportement du ListView est tout à fait ésotérique.
Pour ce faire ajoute un espion LvwClients.ListItems et un point d'arrêt au début du bloc. Des heures de plaisir.

Bien, mais encore me suis-je dit. Quel que soit le comportement de cet objet, puisque j'avais renoncé à pousser davantage dans cette direction, où peut bien être la différence entre le chargement du ListView à l'affichage (UserForm_Initialize()) et celui à la mise à jour (nouvel élément)? Compte tenu du comportement de cette bibite il semble que le chargement suive un ordre sur lequel le codeur n'a aucune prise. Hmmm... réchiflissons... Euréka!

Au démarrage le ListView n'est pas trié! La propriété Sorted est à False, alors qu'à l'ajout celle-ci est à True!

J'ai donc ajouté une instruction

' 2pme : instruction ajoutée
LvwClients.Sorted = False

juste avant le bloc cité dans MajListingClients() et le tout semble fonctionner correctement.

Alors pour ce qui est d'empêcher de dormir ton truc est champion.

Aussi il se peut fort bien que tu reviennes ici pour d'autres petits problèmes causés par ton application. J'en ai aperçu quelques bribes ici et là.

Je crois la problématique 1 résolue. Si tel est le cas prière de le noter ici.

Cordialement,

Guy




Pièce jointe:
zip Tables_Mod.zip   [ Taille: 69.30 Ko - Téléchargements: 849 ]
Edité par Guy le 13/04/2011 00:12:05

Hors Ligne
Rapport   Haut 


Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Qui consulte actuellement ce sujet ?   1 Utilisateur(s) anonymes