Ouaf ! Ton classeur avait planté à ma première ouverture... j'avais donné une réponse de principe.
Comment fais-tu avec ce fouillis indescriptible, agrégats de code d'origine diverses... Tu m'excuseras de ne pas intervenir sur le code... Je me suis contenté de localiser ton problème et j'ai donc cru détecter :
1) qu'une proc. Change de CbbLocalités (source Curulis, que je salue !) semble avoir été conçue à cette fin, de façon que je trouve un peu contournée car on peut faire plus logique autrement...
2) tu as utilisée également cette proc. dans Initialize pensant, je pense, alimenter ainsi ta Combo, mais la proc. n'ayant pas cette vocation première, plus de liste dans la Combo et donc plus rien ne fonctionnait à cette égard.
Il faut d'abord rétablir l'alimentation normale de la Combo :
Dans Initialize sur cette partie de code Curulis ajoutée là, tu laisses subsister 3 lignes :
Dim iRow As Integer
iRow = Sheets("BD").Range("A" & Rows.Count).End(xlUp).Row '+ 1 celle-ci en éliminant le +1
Me.CbbLocalités.List = Sheets("BD").Range("A1:A" & iRow).Value
C'est pas vraiment joli, mais vu la "gueule" de la proc. en dehors de cette partie, cela ne lui nuiera pas plus ! et il y aura une liste dans la Combo.
Maintenant, si tu as une nouvelle localité à saisir qui ne figure pas dans la liste, tu vas la taper manuellement. La proc. Change n'est donc pas vraiment adaptée car elle se déclenchera à chaque caractère tapé (de la même façon que dans une TextBox), on va donc utiliser un autre évènement qui ne se déclenche qu'à validation de l'entrée.
Private Sub CbbLocalités_AfterUpdate()
Dim nvloc$, n%
With CbbLocalités
If .Value <> "" Then
If Not .MatchFound Then
nvloc = .Value
If nvloc Like "#### *" Then
.Clear
Else
.Value = "": Exit Sub
End If
Else
Exit Sub
End If
Else
Exit Sub
End If
End With
With Worksheets("BD")
n = .Range("A" & .Rows.Count).End(xlUp).Row + 1
.Range("A" & n) = nvloc
With .Range("A1:A" & n)
.Sort key1:=.Range("A1"), order1:=xlAscending, Header:=xlNo
CbbLocalités.List = .Value
End With
End With
End Sub
La méthode est simple : à validation d'une entrée on teste si une valeur à été entrée (sinon on sort), si cette value n'est pas dans la liste (Not .MatchFound, sinon on sort), si l'entrée est conforme aux critères d'écriture des localités et dans ce cas on supprime la liste de la Combo (Clear) sans effacer l'entrée (sinon on efface l'entrée et on sort).
Si on n'est pas sorti, c'est qu'on a une nouvelle localité conforme et on a déjà supprimé la liste de la Combo.
On ajoute la localité en fin de liste (BD), on retrie la liste des localités et on réaffecte une liste triée à la Combo, contenant la nouvelle localité.
Bien évidemment tu supprimes la procédure Change de la Combo...
Cordialement.