Résolu UsF limiter la liste des communes en fonction du département choisit

mouftie

XLDnaute Junior
Bonjour,
Je cherche à utiliser un UserForm comme des filtres dans une base de données ; je n'ai utilisé qu'une fois les UserForm... mais c'était pour remplir un formulaire... rien à voir.

Ici, dans la page 2 du USF, nommée Client, l'utilisateur choisit un département, puis soit le nom d'une commune soit son code postal.
Suite de quoi, les coordonnées du magasin sont sensées apparaître.
je n'ai aucune idée sur la manière de faire, ni par quoi commencer.
je désire passer par le département pour limiter la liste.

Mais de toute façon, après je ne sais pas comment récupérer les coordonnées dans le USF, comme si on avait filtré la base de donnée par la commune ou le code postal.

J'ai fait un fichier test, j'espère que qq'1 pourra m'aider.
Merci d'avance
 

Pièces jointes

  • Test1.xlsm
    89.4 KB · Affichages: 52
  • Test1.xlsm
    89.4 KB · Affichages: 59
  • Test1.xlsm
    89.4 KB · Affichages: 61
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : UsF limiter la liste des communes en fonction du département choisit

Bonsoir.

J'ai remplacé la TextBox code postal par un ComboBox, tant qu'à faire, mais le n'ai pas remplacé, contrairement à ce que je ferais, les autres TextBox par des Label.
Voyez si ça vous convient.
 

Pièces jointes

  • CbxLiésMouftie.xls
    442 KB · Affichages: 49

mouftie

XLDnaute Junior
Re : UsF limiter la liste des communes en fonction du département choisit

Bonjour Dranreb,
Impressionnée, quel travail vous avez fait pour moi et avec beaucoup de commentaires. Je vous suis très reconnaissante.
j'ai testé, c'est super ; si j'ose, je vous demanderai s'il est possible, après avoir choisi le département, de choisir entre rentrer la commune ou le CP ? si non ça ira très bien comme ça.

Au niveau du code, vous utilisez des modules de classe, je n'en ai jamais utilisé, je vais me pencher dessus...
Par contre, dans celui nommé TabIndex, j'ai cette partie
Code:
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
qui est rouge ; Est-ce normal ?

vous utilisez #if...#end if, alors que nous ne sommes pas dans une procédure pouvez-vous me donner qq explications, pourquoi #, pourquoi en dehors d'une procédure, dans quel utilise t-on ce code, comment cela fonctionne-t'il ?

Mon Dieu quel travail vous avez fait, j'en reviens toujours pas ! j'ai bien peur de ne pas comprendre tout de suite ; j'ai imprimé vos 17 pages de code ! ma journée n'y suffira pas à comprendre. ;>

Autre question, vous dites :
"mais je n'ai pas remplacé, contrairement à ce que je ferais, les autres TextBox par des Label."
pourquoi plus des Labels que des textbox

Encore une fois mille mercis, je ne pensais pas que ce serait si compliqué.
 

Dranreb

XLDnaute Barbatruc
Re : UsF limiter la liste des communes en fonction du département choisit

Bonjour.

C'est déjà le cas, j'ai vérifié par acquis de conscience, vous n'avez même pas besoin de choisir un département, si vous commencez par taper le code postal, par exemple 77000, il ne vous propose que les 4 communes que vous y avez mises. Par contre il ne devrait pas afficher le reste tant qu'un choix unique n'est pas défini. Je vais regarder ça de plus près.

Les instructions commençant par # sont des directives de compilation conditionnelles. Et il est en effet curieux qu'il signale quand même visuellement (c'est pareil chez moi) une erreur de syntaxe sur une partie qu'on lui a dit de ne pas compiler. Elle est due au mot clé PtrSafe qui n'est reconnu que sur les architectures 64 bits.

Le vrai travail n'a consisté qu'en le court code dans l'Usf1. Tout le reste n'est que modules de services de la famille OutIdx, un système qui s'efforce de faire l'inventaire de toutes les sortes d'applications qu'on peut tirer de son noyau central, qui est mon module de classe TableIndex.

Les Label seraient plus indiqués car ils n'en permettraient pas par l'opérateur la modification, qui ne saurait avoir ici d'effet. (Pour le moment, du moins… Mais on pourrait envisager qu'il permette la mise à jour…)
À +

P.S. Juste un petit changement d'épaule du pistolet à eau, mais je redonne tout le nouveau code de l'Uf :
VB:
Option Explicit
Dim WithEvents CL As ComboBoxLiés
Dim NePasGarnir As Boolean, Valeurs()

Private Sub UserForm_Initialize()
Set CL = New ComboBoxLiés
CL.CouleurSympa
CL.Plage Feuil1.[A2]
CL.Add Me.CbxDep, "A"
CL.Add Me.CbxCP, "B"
CL.Add Me.CbxCommune, "C"
CL.Actualiser
End Sub

Private Sub CmBtEncore_Click()
CL.Nettoyer
End Sub

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
NePasGarnir = Not Complet
If NbrLgn = 0 Or NePasGarnir Then ReDim Valeurs(1 To 1, 1 To 5): GarnirChamps
End Sub

Private Sub CL_Résultat(Lignes() As Long)
If NePasGarnir Then Exit Sub
If UBound(Lignes) > 1 Then MsgBox "Attention, c'est en double: " & UBound(Lignes) & " exemplaires." _
   & vbLf & "Seul le premier est affiché ici.", vbExclamation, Me.Caption
Valeurs = CL.PlgTablo(Lignes(1), 4).Resize(, 5).Value: GarnirChamps
End Sub

Private Sub GarnirChamps()
Me.TbxCode1 = Valeurs(1, 1)
Me.TbxNomMag = Valeurs(1, 2)
Me.TbxAdresse = Valeurs(1, 3)
Me.TbxCode2 = Valeurs(1, 4)
Me.TbxBO = Valeurs(1, 5)
End Sub

Private Sub CmBtAnnul_Click()
Unload Me
End Sub
 
Dernière édition:

mouftie

XLDnaute Junior
Re : UsF limiter la liste des communes en fonction du département choisit

Bonsoir Dranreb,
J'ai mis du temps à vous répondre, car j'ai vraiment essayé de comprendre, ne serait-ce que pour faire toute seule la Page1 de mon USF ; il est beaucoup plus simple, puisque cela correspond à faire un filtre sur la colonne "D" (code1), pour obtenir dans des labels :
d'une part le nom et l'adresse du magasin et d'autre part la liste des communes et leur code postal respectif (dans un même label ou dans 2 si c'est plus facile) correspondants.

Seulement, je n'arrive à rien.
Même quand je tape le code1, le bouton "autre recherche" ne fonctionne pas.
Après, je ne sais pas comment introduire dans votre initialize la notion de Page1 (appelée Structure)
je ne sais pas non plus comment "garnir" les champs LaNomMag, LaAd, LaCode2, LaBO et LaCP_Comm.

Si vous voulez bien encore m'aider, ce serait vraiment sympa, car là c'est vraiment trop compliqué pour moi.
D'avance, je vous remercie

Je vous revoie un fichier, car j'ai modifié d'une part la page2 "Clients" en tenant compte de votre très bonne suggestion de mettre des labels au lieu des textbox pour les retours d'informations et la page1 pour l'adapter à mes besoins
 

Pièces jointes

  • CbxLiésMouftie.xlsm
    202.7 KB · Affichages: 58

Dranreb

XLDnaute Barbatruc
Re : UsF limiter la liste des communes en fonction du département choisit

Bonsoir.
Pas trop fan des Multipage, moi. Enfin. Pour vous débloquer : Mettez plutôt un ComboBox pour saisir le Code1. Mettons CbxCode1.
Pour un seul ComboBox ce n'est pas la peine d'utiliser un second objet de type ComboBoxLiés. Mais on peut utiliser un dictionnaire arborescent à un seul niveau. Très facile. Déclarez en tête un DicCod1 As Dictionary. Profitons de la plage CL.PlgTablo puisqu'elle existe. Ajoutez derrière le CL.Actualiser :
VB:
Set DicCod1 = DictionnArbo(CL.PlgTablo.Columns("D"))
Me.CbxCode1.List = DicCod1.Keys
Il ne reste plus qu'à s'écrire une CbxCode1_Change et le tour est joué, parce que les items d'un tel dictionnaire sont exactement les mêmes listes de lignes que celles rendues par l'évènement ComboBoxLiés_Résultat. (Parce qu'en fait ce module de classe se sert de dictionnaires arborescents logés dans les ComboBoxMembre)
VB:
Private Sub CbxCode1_Change()
Dim Lignes() As Long, Tv(), N As Long, L As Long
If CbxCode1.ListIndex = -1 Then Exit Sub
Lignes = DicCod1.Items(CbxCode1.ListIndex)
Tv = CL.PlgTablo.Resize(, 8).Value
For N = 1 To UBound(Lignes)
   L = Lignes(N)
   MsgBox "Nom du magasin :" & Tv(L, 5), vbInformation, "Test": Exit Sub
   Next N
End Sub
En Tv on met carrément toutes les valeurs de la feuille BdD: c'est plus rapide que d'y accéder au coup par coup par la suite. Vous avez dans Lignes tous les numéros de lignes se rapportant au Code1 choisi ou tapé. Essayez de développer ce qu'il vous faut à la place du MsgBox que j'ai mis juste pour vérifier qu'on récupérait bien le nom du magasin dans la 1ère de ces lignes.
Bon courage.

Remarque: Si on mettait ce ComboBox CbxCod1 avec les autres dans une seule page et géré par le CL, le fait de renseigner juste ce combobox aurait pour effet de rendre exactement la même liste de lignes dans CL_Résultat ! Je crois que j'aurais plutôt combiné quelque chose comme ça. Avec une ListBox pour les villes… Ou pas. Parce qu'a ce moment là vous auriez déjà cette liste dans le CbxCommune, dans le fond…
 
Dernière édition:

mouftie

XLDnaute Junior
Re : UsF limiter la liste des communes en fonction du département choisit

Bonjour Dranreb,
Merci encore pour votre nouvel aide, j'y suis presque...
J'ai réussi à effacer mes champs en cliquant sur le bouton autre recherche, avec des "
Code:
   Me.CbxCode1 = ""
" je ne sais pas si la méthode est belle, mais ça fonctionne.
je remplis mes champs, comme vous me l'avez dit
Code:
Private Sub CbxCode1_Change()
'*Remplissage de la page1 Structure
Dim Lignes() As Long, Tv(), N As Long, L As Long
If CbxCode1.ListIndex = -1 Then Exit Sub
Lignes = DicCod1.Items(CbxCode1.ListIndex)
Tv = CL.PlgTablo.Resize(, 8).Value
For N = 1 To UBound(Lignes)
   L = Lignes(N)
   Me.LaNomMag = Tv(L, 5)
   Me.LaAd = Tv(L, 6)
   
   Me.LaCode2 = Tv(L, 7)
   Me.LaBO= Tv(L, 8)
   Me.LaCpP1 = Tv(L, 2)
   Me.LaComP1 = Tv(L, 3)
Sauf que cela ne renvoie qu'un seul code postal / commune ; il faudrait l'ensemble des communes concernées par le choix ex si on choisit le code1 = 3318, les communes du 8e, 17e et 18e arrondissement doivent apparaitre.

Merci de bien vouloir encore m'aider.
 

Dranreb

XLDnaute Barbatruc
Re : UsF limiter la liste des communes en fonction du département choisit

Bonjour.
Je vous assure que ça les renvoie tous, mais vous les mettez tous au même endroit, alors on n'y retrouve que le dernier qui y a été mis. Essayez peut être de les empiler dans un tableau de String que vous affecterez à la fin au List d'une ListBox avec un ColumnCount approprié.
 

mouftie

XLDnaute Junior
Re : UsF limiter la liste des communes en fonction du département choisit

Re bonjour,
Vous avez une fois de plus raison ; juste en ajoutant un label avec Me.LaCpP1 = Tv(L+1, 2), j'obtiens un 2ème résultat ; du coup, je suis allée voir ma base de donnée et certains magasins peuvent couvrir près de 800 communes ; ça va devenir illisible dans une listBox, donc information inutile ; ce que me confirme les utilisateurs.
J'avais mal compris leur demande... :confused:
Je supprime la page1
et notre (plus le votre d'ailleurs) est fini.

Encore merci pour votre aide
A une prochaine fois j'espère (j'y reviendrai certainement ;>) :D
 

Dranreb

XLDnaute Barbatruc
Re : Résolu UsF limiter la liste des communes en fonction du département choisit

Oui, mais attention, non, je vous le dis au cas ou vous auriez quand même à y revenir, Tv(L+1, 2) ne vous garantirait pas la restitution de la seconde ligne faisant partie du choix, seulement de la ligne, quelle qu'elle soit, qui suit la ligne L. Il faudrait prendre Tv(Lignes(N+1), 2) si votre L vient de Lignes(N).
 

Discussions similaires

Statistiques des forums

Discussions
312 108
Messages
2 085 361
Membres
102 874
dernier inscrit
Petro2611