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