faire un tri préalable à l'affichage dans un Combobox

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Soyez un peu homogène avec le reste: au lieu de
With Worksheets("DI-MES")
Set PlgNBDI = .[A2:02].Resize(.Cells(.Rows.Count, "A").End(xlUp).Row - 1): End With
VB:
Set PlgNBDI = ColUti(FDonDI_MES.[A2:O2])
Ensuite :
Me.CbxNBDI.List = PlgNBDI.Columns("A").Value
Faux, c'est:
VB:
Me.CbxNBDI.List = DicNBDI.Keys
Mettez plutôt une CbxNBDI_Change qu'une CbxNBDI_Click et mettez y :
VB:
If CbxNBDI.ListIndex = -1 Then Exit Sub
Ligne = DicNBDI.Items(CbxNBDI.ListIndex)(1)
 

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

J'ai fait les modifs ...
Pour vider le combobox "N° DI" du dictionnaire arbo comment fait on ? "nettoyer" ne marche pas

Le distionnaire arborécent me permet de revenir et/ou modifier des enregistrements réalisé dans la base DI-MES.
Cela marche mais quand je valide un enregistrement je n'ai plus acces aux comboxliées pour éventuellement le modifier, est ce normal ?

Je n'ai pas trouvé le code pour enregistrement et/ou modifier un enregistrement dans la base

En faite l'organisation des boutons de commande dans les comboxliées étaient parfait, peut on faire la même chose avec un dictionnaire arbo ??

Merci beaucoup !
Poups
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
Calquez vous sur la façon de procéder de ComboBoxCasc ou ComboBoxLiés. Nettoyer met essentiellement le ListIndex du ComboBox à -1.
Ah, c'est donc la PlgNBDI qui est la table à mettre à jour ? (c'est ça que j'avais pas compris avec cette organisation arachnéenne qui relèverait peut être plus d'Access que d'Excel)
Ce n'est plus une variable locale Ligne qu'il faut utiliser mais sans doute la globale LDICou: il faut qu'elle soit conservée jusqu'à ce qu'on utilise le bouton. Et il faut veiller à le remettre à 0 quand le ListIndex = -1 pour qu'on sache après que c'est une création. Pour l'effectuer, s'il est à 0, mettez le à PlgNBDI.Rows.Count, copiez sa dernière ligne, insérez la devant elle même, ajoutez 1 à LDICou puis embrayez comme pour une modification:
VB:
PlgNBDI.Rows(LDICou).Value = NBDIVLgn
De même qu'avec un ComboBoxLiés, si vous changer la base vous devez refaire un Actualiser, vous devez refaire le Dictionnaire et affecter ses nouvelle clés au List du ComboBox. (Juste ces 2 instructions, PlgNDBI quant à lui est automatiquement rectifié, à condition de procéder comme j'ai dit au lieu d'ajouter bêtement la ligne derrière de sorte que du coup elle n'en ferait plus partie)
 
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Pour le netoyage, j'ai tradui cela par :

Code:
CbxNBDI.ListIndex = -1
Cela marche, mais cela ne doit pas être comme tu la expliqué ...

[
c'est donc la PlgNBDI qui est la table à mettre à jour ?
Oui c'est bien cela

J'ai intégrer LDICou mais je pense qu'il ce comporte comme "Ligne" en variable locale, il y a t'il une déclaration spécifique à faire pour LDICou ? ou ?
Pour l'instant tous ce comporte comme je le souhaite, sauf que quand je vais chercher un enregistrement existant j'ai acces au 3 combobox de la boite de dialogue, mais les cellules liés ne sont pas mise à jour en modification ?

Private Sub CLXXX_BingoUn(ByVal Ligne As Long)
inopérant ??

Apres je dois faire marcher le bouton d'enregistrement (modification/création)
Est ce que je peux utiliser "GarnirChamps" ?

Merci encore et toujour !
Poups
 

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Je suppose que vous parlez du Userform Ouverture_DI
Dans la BT_Valider_DI_Click je ne vois toujours pas de code qui écrit la ligne comme je vous l'ai indiqué, analogue d'aiilleurs à ce qui est programmé dans la BT_ValiderDI_Click du Donnees_Code_DI

Et dans la CbxNBDI_Change je ne vois toujours pas non plus de remise à 0 de LDICou quand CbxNBDI.ListIndex = -1 pour qu'on y sache que c'est une création. Là il risque d'écraser une mauvaise ligne.

Bon, après je ne comprend plus rien à ce que vous dites…

On modifie bien toujours une seule table à la fois, et les autres sont simplement en consultation ?
 

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

J'ai traduit ce que je comprend et comme je suis limité je cherche en tatonant....

Je dois enregistrer et/ou modifier 1 seule table (feuille DI/MES)
La boite de dialoge Ouverture_DI et les 3 combobox liées servent à créer ou modifier une ligne de la table (feuille DI/MES) => l'idée est de généré un ordre de mission.
Le combox " cbxNBDI" sert uniquement à rappeler une ligne d'un enregistrement pour eventuellement modifier certaine donnée et les réenregister

J'y suis presque, mais je passe un temps fou à traduire des suptilité que je ne comprend pas toujours, tous du moins je n'arrive pas à le traduire dans le programme.

Private Sub CbxNBDI_Change()

If CbxNBDI.ListIndex = -1 Then LDICou = 0: Exit Sub
est comme cela ?

pour le bouton "Private Sub BT_Valider_DI_Click()" je ne trouve pas ...
Peux tu m'écrire ce boue de code ?

Je suis nul !
Merci de ta patience, je sens que je t'agace un peu ...
Poups
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Est-ce normal que vous écriviez le NBDIVLgn dans la plage avant de l'avoir renseigné selon les contrôles ???
Pour la lecture on la récupère d'abord et on renseigne ensuite les contrôles avec, mais pour l'écriture, vous ne croyez pas que ça doit être l'inverse, et que l'écriture dans la plage doit se faire tout en dernier ?

Autre chose: ne refaites pas l'initialisation de LDICou: si c'est une nouvelle clé (pour une création) ça va planter !

Encore une chose : Ce n'est pas tout en dernier qu'il faut écrire la ligne puisque derrière il faut encore refaire le dictionnaire et attribuer ses clé au combobox. Votre procédure BT_Valider_DI_Click doit donc se terminer comme ça :
VB:
NBDIVLgn(1, 15) = Me.LabMailADV
PlgNBDI.Rows(LDICou).Value = NBDIVLgn
Set DicNBDI = DictionnArbo(PlgNBDI.Columns("A"))
Me.CbxNBDI.List = DicNBDI.Keys
End Sub
Ah et puis vous oubliez de l'écrire la nouvelle clé dans NBDIVLgn(1, 1) selon le combobox quand LDICou = 0. Et même toujours en fait puisque vous ne réutilisez pas le NBDIVLgn global qui aurait pu être initialisé par la CbxNBDI_Change.
Et je vois encore plus grave: Dans la mesure ou NBDIVLgn est un tableau dynamique non conservée puisque local (déclarée dans BT_Valider_DI_Click) il faut faire un Redim dessus pour pouvoir l'utiliser. Ou alors dimensionnez la (1 To 1, 1 To 15) dans la déclaration. Pourquoi est-il aussi déclaré sous le même nom en global ? Vous êtes sûr de toujours savoir lequel vous utilisez ?
Supprimez le du Dim en tête du Userform. À priori vous ne l'utilisez nulle part. Je ne veux plus jamais voir ça dans votre programmation: des variables locales et globales portant le même nom !
 
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

J'ai tenté de suivre ton raisonement
J'avoue que je suit un largué dans les variables local ou dynamique (dans le future je souhaite conserver la variable ligne (clé) pour enrichir le tableau dynamique par ligne avec d'autre boite de dialogue) enfin bon je verrais plus tard ...

J'ai fais quelques modifs en suivant tes instruction tous du moins je l'espère ...

Les enregistrement sont bien incrémenté les un en dessous des autres mais je n'écrit pas de n° de clé dans la colone A
Comment fait on ?

Quand je rappel un enregistrement, quand je valide je ne l'écrasse pas, j'en insere un nouveau en dessous de celui que je viens de rappeler dans le tableau sans n° clé non plus
Comment fait on ?

Merci beaucoup
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
Une variable locale est une variable déclarée dans une procédure. Elle est en principe réservée en mémoire dans la pile au moment de l'appel de la procédure et n'est pas connue ni conservée en dehors de cette procédure. Au contraire une variable globale est déclarée en tête d'un module. Elle est connue, partagée et reprise par toutes les procédures de ce module. Elle peut même être connue de tout le projet si elle est déclarée à l'aide du mot clé Public dans un module ordinaire. Dans toute autre sorte de module qu'un module ordinaire elle en devient une propriété.
Vous n'avez pas suivi mon conseil: il y a toujours un NBDIVLgn global en tête du module et de nombreux autres locaux dans les procédures qui portent le même nom au lieu d'avoir un simple nom très court tel que T puisque ce ne sont que de simples tableaux de travail temporaires et non des tableaux conservés d'une procédure à l'autre.

Oui, je vous l'avait signalé, l'oubli de l'affectation de CbxNBDI.Text à NBDIVLgn(1, 1)
 
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

J'ai fait les modifs que tu site si-dessus => es je bien compris ?
En tous cas cela marche toujours ....

Apres Plusieurs appuis sur le BT validé LDICou n'est pas réinitalisé et la cle enregistrer donne le m^me numéro
OU et avec quoi je le réinialise ?

Sur un rappel d'enregistrement je n'écrasse toujours pas l'enregistrement initial, quelle code je dois mettre

Un truc bizard, si je supprime mes enregistrements sur la feuille DI-MES cela ne marche plus
Il me faut au minimum 2 lignes de données pour que cela marche, pourquoi ?

Vraiment, merci beaucoup de ton aide
Poups
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Sur un rappel d'enregistrement je n'écrasse toujours pas l'enregistrement initial
C'est normal: vous exécutiez With PlgNBDI.Rows(LDICou - 1).EntireRow: .Copy: .Insert: End With dans tous les cas et pas seulement quand LDICou était à 0 avant qu'on y mette PlgNBDI.Rows.Count + 1
Ne pourriez vous prendre un codage de la date et de l'heure comme clé ? Voire l'heure et on utilise un ComboBoxCasc cette fois pour localiser un ordre selon la date puis l'heure ?
 
Dernière édition:

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Merci je suis idiot !
Je savais que c'était cette ligne, je n'est pas vue que le "end if " n'était pas a la fin de la procédure ...
Enfin bon ...

Dernière chose sur cette boite quand je rappelle un enregistrement, comment réinitialisé les combobox liées pour avoir accées au table liées comme lors de l'ouverture de la boite de dialogue en modification ?

De même qu'avec un ComboBoxLiés, si vous changer la base vous devez refaire un Actualiser, vous devez refaire le Dictionnaire et affecter ses nouvelle clés au List du ComboBox. (Juste ces 2 instructions, PlgNDBI quant à lui est automatiquement rectifié, à condition de procéder comme j'ai dit au lieu d'ajouter bêtement la ligne derrière de sorte que du coup elle n'en ferait plus partie)
J'ai essayé : CLADV.Actualiser .... mais cela ne marche pas
je n'ai surment pas tous compris

Poups
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonsoir.
Je ne parlais pas des autres ComboBox, je parlais du CbxNBDI. Et je vous ai ensuite indiqué les instructions exactes au #108.
J'ai essayé : CLADV.Actualiser .... mais cela ne marche pas
je n'ai surment pas tous compris
C'est clair ! Ça ne s'appliquerait que si les données agence changeaient, et ça n'introduirait encore aucun changement dans les ComboBox. Vous devez renseigner leurs .Text d'après les renseignements trouvés dans la ligne. Mais il ne faut pas perdre de vue que cela va déclencher les CLADV_Change et autres CLADV_BingoUn et entrainer toutes leurs conséquences telles que peut être mettre dans d'autres champs les nouvelles info agence correspondantes au lieu de celles trouvées initialement dans la ligne. Mais c'est peut être ce qu'il faut après tout. Si ce n'est pas le cas, il faut le Stopper au préalable, puis l'Activer après l'opération. Vérifiez si votre module ComboBoxLiés est équipé de ces méthodes.
 

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Ca rentre ... ta méthode d'aide est efficasse !

J'ai traduit cela par :
Me.CbxCodeDI.Text = NBDI(1, 5)
'TBQM = NBDI(1, 6)
'CbxAgence = NBDI(1, 7)
'CbxCodAG = NBDI(1, 8)
'CbxNomTCI = NBDI(1, 9)
'LabMailTCI = NBDI(1, 10)
Me.CbxNomTCS.Text = NBDI(1, 11)
'CbxNomTCS = NBDI(1, 11)
'LabMailTCS = NBDI(1, 12)
'LabTelTCS = NBDI(1, 13)
'CbxNomADV = NBDI(1, 14)
'LabMailADV = NBDI(1, 15)
CLAgence.Actualiser
CLTCS.Actualiser
Ca marche les cellules liées ne sont pas accéssible au changement donc directement lié aux combobox donc SUPER !
Es ce bien comme cela que tu voyais la chose ?

Dernier PB sur cette boite, il faut 2 enregistrement dans la feuille DI-MES pour que la boite fonctione, c'est un PB de clé et LDICou
Mais je ne vois pas comment gérer le truc ?

Sur une suppression d'enregistrement, comment réinitialiser le DictionnArbo?, il n'est pas a jour si l'on retourne dans le Combox et peu générer une erreur d'exécution

Merci d'avance
Poups
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Oui, mais encore une fois, je ne vois pas de raison de faire des Actualiser sur les CL si aucune action n'a entrainé de changement dans les clés enregistrées dans les données Agences ni donc dans les dictionnaires DicBdD qui en ont résulté, contenus dans les ComboBoxMembre gérés par les ComboBoxLiés.
Oui alors le problème de la table qui peut être vide, je ne sais pas. De toute façon on ne peut dans ce cas créer de dictionnaire, et il n'y a aucune clé à mettre dans le List du ComboBox. Tout ce qu'on peut faire c'est mettre On Error Resume Next devant pour que l'erreur ne provoque pas d'arrêt. Après il faut parer comme on peut aux autres conséquences. Je pense que le plus simple serait de toujours lui donner au moins 2 lignes même si elles sont vides. Je verrai une autre fois comment faire pour le mieux.
 

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Et pour :
Sur une suppression d'enregistrement, comment réinitialiser le DictionnArbo ?
Il n'est pas a jour si l'on retourne dans le Combox et peu générer une erreur d'exécution ...
 

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Exactement de la même façon. J'espère que vous y avez pensé plutôt que d'y avoir été confronté.
 

poups

XLDnaute Occasionnel
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour Dranreb,

Je te remerci beaucoup pour tous les renseignements que tu m'as donné, et qui mon permis de réaliser mon fichier
Il aurais tres certainement été plus simple sur ACCESS mais bon ce qui est fait est fait ...
Il marche tres bien depuis une semaine en fichier partagé, j'ai quelque amèlioration a apporté, mais rien d'exeptionel

J'ai encore quelques petites Questions

1 J'aimerais faire disparaitre le bonton "gestion base de données" aussitôt qu'un champs de l'userform est rempli
est-ce possible ?

2 j'aimerais communiquer avec un fichier, je c'est le faire, mais j'aimerais savoir s'il serait possible que VBA me demande le nom et l'emplacement du fichier pour ensuite exécuté un code => cela marche déjà avec un emplacement et non défini en "dure"

Merci beaucoup de ton aide

Poups
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : faire un tri préalable à l'affichage dans un Combobox

Bonjour.
1 - Les contrôles ont une propriété Visible qui peut être mise à False. Peut être vaudrait il mieux n'agir que sur la propriété Enabled qui le rend seulement inutilisable.
2 - Application.GetOpenFilename peut vous renvoyer le nom complet avec chemin d'un fichier choisi par l'utilisateur. L'exploration commence depuis le dossier courant du lecteur courant. Ceux ci peuvent être positionnés préalablement par ChDir et ChDrive.
 

Discussions similaires


Haut Bas