[VBA] Pb hauteur listbox créée dynamiquement

Pb hauteur listbox créée dynamiquement [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 31-05-2010 à 11:47:00    

Bonjour,
 
Voici mes 2 Pb
 
j'alimente une listbox(multicolonnes) par une procédure VBA.
 
1 (pas grave)
Dès le premier Additem, une barre de défilement horizontal s'ajoute en bas de la listbox et je n'en voudrai pas, car je pense qu'elle provoque peut-être le 2ème problème (sinon je veux bien la laisser)
 
2 (plus embêtant)
Ensuite je remplis les colonnes (.colomn, etc  )  
- le nombre de lignes n'est jamais le même (entre 1 et 10 par exemple) ; je modifie dynamique la hauteur à chaque ajout de ligne, ce qui fait que la listbox a une hauteur variable (sans barre de défilement vertical) et peut empiéter sur d'autres contrôles situés en dessous.  
Ce n'est pas grave je veux simplement qu'après avoir cliqué une première fois sur une ligne de la listbox, celle-ci reprenne une hauteur fixe  (par exemple = 5 lignes visibles), avec une barre défilement vertical de manière à pouvoir cliquer à nouveau sur une autre ligne non visible.
 
Je code donc Listbox.height = xxx, et quelque soit la valeur de xxx, la listbox se réduit bien à cette hauteur voulue avec un ascenseur vertical, mais cet ascenseur vertical ne me permet pas de rendre visible le dernier élément de la liste. Lorsque je fais descendre l'ascenseur pour atteindre la dernière ligne, il descend et remonte aussitôt à sa position initiale, ne permettant pas de cliquer sur cette dernière ligne J'ajoute que la propriété integralheight n'a aucun effet intéressant (à moins que je ne sache pas m'en servir)  
 
Merci de vos conseils

Reply

Marsh Posté le 31-05-2010 à 11:47:00   

Reply

Marsh Posté le 31-05-2010 à 15:24:40    

Hello
 
Tu fais ca sur quoi ? Excel ? Access ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 31-05-2010 à 20:37:50    

SuppotDeSaTante a écrit :

Hello
 
Tu fais ca sur quoi ? Excel ? Access ?


 
Avec Excel, mais à partir d'une base Access (initialement j'avais tout fait avec des tables Excel, puis je suis passé à Access pour mieux gérer le multiposte)
 
Le lien suivant traite d'un pb (bug) similaire, mais j'ai du mal à en extraire une solution convenable (pb de traduction d'anglais)
 
http://www.xtremevbtalk.com/archiv [...] 85025.html
 
Merci de ton aide


Message édité par edma le 01-06-2010 à 03:09:35
Reply

Marsh Posté le 01-06-2010 à 09:29:53    

Hello

Citation :

) On form activate  
 
a) Set integralheight to true  
b) Set mode to checked
c) Capture Checked mode Listbox height
 
d) Set mode to plain listbox
e Capture Plain mode listbox height.
 
f) Set integralheight to false
 
2) On toggle set the listbox height to each initial height.


 
Qu'est-ce que tu ne comprends pas ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 02-06-2010 à 11:52:54    

SuppotDeSaTante a écrit :

Hello

Citation :

) On form activate  
 
a) Set integralheight to true  
b) Set mode to checked
c) Capture Checked mode Listbox height
 
d) Set mode to plain listbox
e Capture Plain mode listbox height.
 
f) Set integralheight to false
 
2) On toggle set the listbox height to each initial height.


 
Qu'est-ce que tu ne comprends pas ?


 
 
 
Hello,
 
Il me semblait que dans le topic en question il y avait deux modes d'utilisation de la listbox (mode checked et plain) et que le problème venait du basculement (toggle) entre les deux modes.
 
Mon pb est sensiblement différent :
je suis en mode plain
et j'alimente dynamiquement les lignes de la listbox sans autre limitation que le bas du formulaire (ce qui n'est jamais atteint).
Néanmoins cette action cache (provisoirement) des zones sensibles du formulaire. Je veux donc que une fois qu'on a sélectionné un item de la listbox, celle-ci se réduise à une taille standard (par exemple 5 lignes) avec éventuellement un ascenseur vertical de manière à pouvoir sélectionner à nouveau un autre item.  
 
Pour info ==> Entre chaque sélection il peut avoir des actions qui réinitialisent le contenu de la listbox, c'est pour cela que je ne peux pas faire de sélections multiples qui perturberaient les utilisateurs.
 
Une solution serait de remplacer la listbox par une combobox mais son usage est moins pratique dans le contexte réel où en général on veut avoir la liste complète sous les yeux pour cliquer directement sur un item (et rarement sur un deuxième).
 
Il est vrai que je n'ai pas envisagé d'afficher une combobox déjà déroulée (est-ce possible)
 
..


Message édité par edma le 02-06-2010 à 11:54:47
Reply

Marsh Posté le 02-06-2010 à 14:35:56    

Pour la combobox déroulée, suffit de l'atteindre et d'envoyer F4
 
Et désolé mais je ne cerne pas ton souci.
Comment tu alimentes ta liste ?
Toutes les infos sont dedans et la taille est recalculée a la fin ?
L'utilisateur ajoute des infos dans cette liste et donc la taille est calculée a chaque intervention ?
 
Si je fais des essais sous Access2003 ou 2007 je n'ai aucun souci pour jouer sur la taille, faire apparaitre un ascenceur etc.
L'utilisateur click sur une ligne. Tu stockes la ligne sur laquelle il a cliqué. Tu reduis la taille de la listbox. Tu atteinds la ligne stockée.
 
Comprends pas le sushi  [:le colonel moutarde:5]  
 
Edit : si tu as le formulaire dans un mdb a la con envoit le sur mon mail je peux zieuter... Ca se trouve c'est juste une connerie... (Taille des colonnes, depart des lignes a 1 et pas 0 etc.)

Message cité 1 fois
Message édité par SuppotDeSaTante le 02-06-2010 à 14:39:19

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 07-06-2010 à 20:16:05    

SuppotDeSaTante a écrit :

Pour la combobox déroulée, suffit de l'atteindre et d'envoyer F4
 
Et désolé mais je ne cerne pas ton souci.
Comment tu alimentes ta liste ?
Toutes les infos sont dedans et la taille est recalculée a la fin ?
L'utilisateur ajoute des infos dans cette liste et donc la taille est calculée a chaque intervention ?
 
Si je fais des essais sous Access2003 ou 2007 je n'ai aucun souci pour jouer sur la taille, faire apparaitre un ascenceur etc.
L'utilisateur click sur une ligne. Tu stockes la ligne sur laquelle il a cliqué. Tu reduis la taille de la listbox. Tu atteinds la ligne stockée.
 
Comprends pas le sushi  [:le colonel moutarde:5]  
 
Edit : si tu as le formulaire dans un mdb a la con envoit le sur mon mail je peux zieuter... Ca se trouve c'est juste une connerie... (Taille des colonnes, depart des lignes a 1 et pas 0 etc.)


 
Je précise un peu mieux le contexte :
une première listbox de taille fixe avec ascenseur vertical qui permet d'alimenter cette deuxième listbox qui pose problème.
à chaque item  de la première correspond une liste d'item plus ou moins longue et qui est chargée à partir d'une table Access  
 
dès qu'on clique sur un item de la première listbox, la deuxième listbox est alimentée à partir de la table Access et l'ensemble des items doit être visible, pour cela je recalcule la hauteur de la listbox en fct du nombre d'items.
Une fois qu'un item a été sélectionné dans cette deuxième liste je veux ramener la listbox à une taille fixe pour ne plus cacher les autres parties du formulaire, mais permettre aussi que l'on clique à nouveau sur un item caché en actionnant l'ascenseur (notamment si on s'est trompé d'item).
 
Je ramène la listbox à cette taille fixe en recalculant sa hauteur, car la hauteur initiale définie dans le formulaire ne tient pas compte de l'ascenseur qui n'existe pas puisque la liste est vide initialement
Pb  
1- avec la propriété integralheight = true
je n'arrive pas a atteindre le dernier item de la liste (l'ascenseur remonte d'un chouia et se cale sur l'avant dernier item)
2 - avec la propriété integralheight = false j'arrive à pointer sur le dernier item de la liste mais il est souvent à moitié caché et si je modifie la hauteur pour qu'il soit entièrement visible je retombe dans le pb précédent.
 
Voici la procedure (vba excel avec table access) pour charger ma listbox  
 
Nb_Lignes = 0
With ListBox3
    Do Until MaTable.EOF 'chargement à partir d'access
        .AddItem MaTable.Fields(2) ' => équivaut à .Column(0, Nb_Lignes) = MaTable.Fields(2)
        For I_col = 1 To 9
                .Column(I_col, Nb_Lignes) = MaTable.Fields(I_col + 2)
        Next I_col
        Nb_Lignes = Nb_Lignes + 1
        MaTable.MoveNext
    Loop
    MaTable.Close
    Set MaTable = Nothing
hauteur = Nb_Lignes * (.Font.Size + 2) + 22  
    If hauteur > formulaire_Height Then hauteur = formulaire_Height
    .Height = hauteur
End With
 
 
===========
et dans la procedure qui traite le clic
 
If ListBox3.Height > Hauteur_5_lignes Then ListBox3.Height = Hauteur_5_lignes
ListBox3.SpecialEffect = fmSpecialEffectSunken ' ça c'est magique ça vaut les pattes de lapin  
Tout critique sur cet usage autodidacte de VBA est aussi bienvenue !

Reply

Marsh Posté le 08-06-2010 à 21:30:36    

Si ta base est en access pourquoi utiliser des formulaires sous Excel et pas sous Access ?
Ca serait plus simple non ?
Quelle est la finalité ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 09-06-2010 à 09:57:39    

SuppotDeSaTante a écrit :

Si ta base est en access pourquoi utiliser des formulaires sous Excel et pas sous Access ?
Ca serait plus simple non ?
Quelle est la finalité ?


 
 
L'application (13 000 lignes aujourd'hui, c'est fou comme ça va vite!) a été initialement écrite en VBA Excel pour un seul poste avec les données dans un classeur Excel (multifeuillets) et une quinzaine de formulaires, elle a ensuite été remise en forme pour accéder à une base Access (une table = 1 feuillet Excel)  en multiposte.  
Les modifications étaient bien ciblées car tous les accès aux données étaient concentrés dans des procédures ad hoc.
 
Je m'étais déjà cogné l'apprentissage du VBA Excel pour ne pas perdre la main (fraichement retraité!). Actuellement tout fonctionne nickel (gestion des clients, prise de commandes, facturation et analyse du CA), sauf cette foutue listbox (la solution de contournement étant de lui laisser un taille absolument fixe et d'utiliser systématiquement les ascenseurs).
 
L'objet du message tient plus du problème métaphysique que d'un appel au secours pour débrouiller une situation bloquée.
Mais bon, pouvoir comprendre et solutionner ce type de difficulté est intéressant.
 
En tout les cas merci pour toute les remarques et suggestions !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed