liste validation ou combobox ?

W

wachoo31

Guest
Bonjour le Forum,

ci joint un petit fichier expliquant mon souci




@ + Wachoo31
 

Pièces jointes

  • test.zip
    22 bytes · Affichages: 24
  • test.zip
    22 bytes · Affichages: 19
  • test.zip
    22 bytes · Affichages: 23
@

@+Thierry

Guest
Re-Bonjour Michel, Salim, Le Fil, le Forum

Euh oui Michel, c'est ce que j'ai dit aussi car je parle bien de Liste de Validation de Données (voir la démo mise en lien), et comme j'ai également précisé on peut jouer avec les formats spéciaux d'Excel (sous entendu Codes Postaux) mais essaie sur ton fichier tel quel (même avec la modif Long) de taper un code Postal 06240 Beausoleil... et de le retrouver ensuite.... C'était l'objet de ma remarque... Mais je confirme, les Belges ont bien prévu des Codes Postaux Integer et pas les Français !!! lol


Pour Salim, je vais essayer d'être un peu plus "Option Explicit"

Explications détaillées pour ces lignes :
ReDim Preserve TheListe(x)
TheListe(x) = TheListe(x) & TheSource(i, 2) & ","
Il s'agit ici d'une construction de Dynamic Array (Tableau Indéxé séquentiellement) afin de pouvoir incrémenté une Liste De Validation.

La partie qui doit te dérouter c'est que cette Dynamic Array est une Array Dynamique à une dimension (x) que je n'incrémente pas en linéaire, et je lui adjoint un Virgule comme séparateur en fin de chaque String ajoutée (",") ce qui a posé d'ailleurs problème à Céléda qui (selon la config des PCs) avait besoin du Point Virgule et il faut alors changer par (";")...


Explications détaillées pour ces lignes :
y = y + 1
If y = 1 Then WSCible.Range(TheAddress) = TheSource(i, 2)
Il s'agit ici d'une demande dans la Version 01, en fait ces ligne permettent de compter combien de retours peuvent matcher avec le test :
If CStr(TheSource(i, 1)) = TheCode Then

Si "y" = 1 c'est qu'il n'y a qu'un seul retour, donc j'écris directement le résultat dans la cellule (pas besoin de Liste de Validation) c'était une demande de Célada, qui a fait naître la Version 02.


Explications détaillées pour ces lignes :
Select Case y
Case 0: MsgBox "Pas de Ville avec ce code Postal : " & TheCode, vbCritical, "Thierry's Démo"
With WSCible.Range(TheAddress).Offset(0, -1)
.Value = ""
.Activate
End With

Exit Sub
Case 1: Exit Sub
Case Else
With WSCible.Range(TheAddress)
With .Validation
.Delete
.Add Type:=xlValidateList, _
Operator:=xlBetween, _
AlertStyle:=xlValidAlertStop, _
Formula1:=TheListe(x)
End With
.Value = "Selection à faire"
.Activate
End With
End Select
End Sub

Et bien là c'est très simple, si toujours le même "y" = 0 et bien on sort avec un message d'alerte... Si Il égale 1 on sort aussi (puisque déjà traité sur la cellule avant)....... Sinon c'est un autre Cas et on fabrique la Liste de Validation grace à cette fameuse Dynamique Array Linéaire en une seule ligne contenant les Items séparé par le Séprateur ","...


Explications détaillées pour ces lignes :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TheCode As String, TheAddress As String

If Not Application.Intersect(Target, Range("A:A")) Is Nothing Then
On Error Resume Next
With Target.Offset(0, 1)
.Validation.Delete
.Value = ""
End With
If Target.Value <> "" Then
TheCode = Target.Value
TheAddress = Target.Offset(0, 1).Address
ListeRechercheV TheCode, TheAddress
End If
End If
End Sub

Attention ici on est dans le Private Module de Sheets "Recherche"
Ce qui est important de noter c'est que j'utilise ici :
=> ListeRechercheV TheCode, TheAddress
Un appel de macro (ListeRechercheV)
et deux passages d'arguments (TheCode) & (TheAddress)
ce sont des variables Strings que je récupère dans la macro comme ceci :
Sub ListeRechercheV(TheCode As String, TheAddress As String)

Je les utilise ensuite facilement dans la macro (ListeRechercheV) en ayant le code précis qui vient d'être saisi (TheCode), et l'adresse de la cellule concernée (TheAddress)...

Voilà, ke pense que tu comprendras mieux, il y a aussi pour finir (plutot pour commencer) un Tableau Variant ici :

Explicationd détaillées pour ces lignes :
TheSource = .Range("A2:B" & .Range("B65536").End(xlUp).Row)
'et plus bas
For i = 1 To UBound(TheSource)
If CStr(TheSource(i, 1)) = TheCode Then

Ce tableau (TheSource) est en fait la plage entière de Cellules de la feuille "Database", mais c'est beaucoup plus facile à manipuler (et surtout plus rapide) que les cellules elles-mêmes... Et je le scan avec une boucle pour savoir si (TheCode) correspond avec les données de (TheSource(i, 1)) qui est en fait la Ligne scannée (i) de la Colonne 1 ("A" sur la feuille)... Et donc si çà match et bien ce sont les explications plus haut...

Voilà Salim un Dimanche bien rempli et très fructueux si tu as analysé et compris tout ceci

Bon Dimanche à Tous et à Toutes
@+Thierry
 
S

salim

Guest
Re tout le monde

Je te remercie @+Thierry pour avoir pris le temps de taper tout ce code, un dimanche bien rempli c'est vrai.

Analyser cela va être fait , comprendre je l'espère parceque beaucoup de notion me manque encore, j'ai commencer à apprendre sur tes demos des packs 1 et 2 et j'ai compris et appris pas mal de trucs depuis plusieurs mois que je les épeluches dans tous les sens mais y' a encore du chemin a parcourir.

mais bon qui va doucement va sainement et qui va sainement va loin.

Avec ta permission @+ Thierry je me reserve le droit de te joindre de nouveau sur ce fil au cas où pour de plus amples explications.

Merci encore d'avoir pris le temps de taper tout ça c'est gentil.

A+ Salim
 
W

wachoo31

Guest
Bonjour a tous

Un grand merci a vous tous pour les renseignements et propositions,

je réinstalle mon ordi car ho malheur celui-ci a planter et je regarde toute vos pieces jointe et vous tien au courrant

A+ et grand merci

Wachoo31
 

Discussions similaires

Réponses
8
Affichages
506
Réponses
28
Affichages
1 K

Statistiques des forums

Discussions
312 231
Messages
2 086 440
Membres
103 210
dernier inscrit
Bay onais