combobox ecriture intuitive avec choix en dehors de la liste

punk_sportif

XLDnaute Nouveau
Bonjour tout le monde
Dans un combobox, une liste de noms est chargée venant d'un tableau d'une autre feuille.
Voulant une écriture intuitive, j'ai pompé un code de Jacques Boisgontier sur son site (merci à la lui au passage.
L'écriture intuitive dans le combox marche niquel, par contre, ca ne réagit pas exactement comme je le voudrais :
Je souhaite pouvoir écrire un nom qui n'est pas dans la liste.
Mon but :
Admettons un combobox qui comprend :
- tata
- toto
- tutu

Je voudrais quand meme pouvoir écrire "titi" et qu'il me le garde dans mon combobox et donc ma cellule. Or pour le moment, si le texte n'est pas dans la liste, il revient à la liste vide.

Voici le code :
Code:
Dim a()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect([e7:e7], Target) Is Nothing And Target.Count = 1 Then
    a = Application.Transpose(Sheets("adresses").Range("Tableau1[nom]").Value)
    Me.ComboBox1.List = a
    Me.ComboBox1.Height = Target.Height + 3
    Me.ComboBox1.Width = Target.Width
    Me.ComboBox1.Top = Target.Top
    Me.ComboBox1.Left = Target.Left
    Me.ComboBox1 = Target
    Me.ComboBox1.Visible = True
    Me.ComboBox1.Activate
    Me.ComboBox1.DropDown ' ouverture automatique au clic dans la cellule (optionel)
   
  Else
    Me.ComboBox1.Visible = False
  End If
End Sub
Private Sub ComboBox1_Change()
  If Me.ComboBox1 <> "" And IsError(Application.Match(Me.ComboBox1, a, 0)) Then
     Me.ComboBox1.List = Filter(a, Me.ComboBox1.Text, True, vbTextCompare)
     Me.ComboBox1.DropDown
   Else
    ActiveCell = Me.ComboBox1
  
  End If
End Sub
Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Me.ComboBox1.List = a
  Me.ComboBox1.Activate
  Me.ComboBox1.DropDown
End Sub
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then ActiveCell.Offset(1).Select
End Sub

J'ai essayé de changer la propriété du combobox MatchRequired, mais c'est sans effet.

J'ai essayé en supprimant des lignes du code, mais rien à faire...
Bref, je seche.
Je ne sais pas si je suis très clair dans mon explication, mais si quelqu'un peut m'aider, je suis preneur.
Merci.
 

Roland_M

XLDnaute Barbatruc
re

je ne vois pas très bien ce que tu veux faire !?
déjà pour que ta combo fonctionne correctement il faut que tu tries (A-Z) sur base des noms ton tableau dans feuil 'adresses'
si tu veux rajouter des noms il suffit de tirer le tableau vers le bas d'une ou plusieurs lignes
en n'oubliant pas de trier sur base des noms après avoir entré tes données !
ensuite si tu veux voir avant d'envoyer à l'imprimante directement, tu modifies ceci:
ActiveWorkbook.Sheets("bordereau").PrintPreview 'PrintOut
 

punk_sportif

XLDnaute Nouveau
D'après mes tests, ca marchait sans être trié. A voir...

Voici ce que je veux faire :
Je veux que si c'est la première fois que l'adresse est saisie, elle soit ensuite enregistrée dans mon tableau d'adresses. (une macro fera ca ensuite).
Donc pour ca, je veux pouvoir rentrer un choix inexistant dans le combobox. C'est actuellement impossible, le code refuse une saisie qui n'existe pas dans la liste.

Si l'adresse existe, alors, j'ai juste à choisir le nom dans le combobox, et le bloc adresse sera ensuite automatiquement rempli par macro.

(Pour le moment, j'ai fait un test de rentrée d'adresse avec RechercheV, mais faudra le faire en fait en macro, puisque si c'est la première fois que l'adresse est saisie, je vais écraser mes formules rechercheV en saisissant le bloc adresse.)

En gros, je veux un tableau d'adresses qui se remplira au fur et à mesure de mes saisies. Logiquement, une adresse sera saisie une seule fois, et la prochaine fois que je veux utiliser cette adresse, j'aurais donc juste à saisir le nom dans le combobox en saisie intuitive.

Dans ta solution proposée, il faut que je sache si l'adresse existe ou non dans le tableau pour la saisir dans le tableau si ce n'est pas le cas. Et ca, ca ne m'arrange pas. Dans 2 ans, j'aurais peut-être environ 500 adresses enregistrées... Difficile de savoir si une adresse existe déja ou pas sans perdre de temps.
 

Roland_M

XLDnaute Barbatruc
re

tu veux travailler à l'envers !
c'est la base de données qu'il te faut remplir pour alimenter la combo et pas le contraire !
ensuite le tri de noms ou d'adresses te permet de voir si cette adresse existe ou pas !?

maintenant si tu veux créer une base de données sur la base de tes entrées nom,adresse, . . .
c'est tout à fait possible mais c'est une autre approche et ça demande une structure un peu différente !

un champ de saisie bien précis avec cellules nommées !
un bouton pour faire le rajout de ces données dans la base avec test si existe ou pas , tableau inutile dans ce cas !

mais là ce n'est plus une aide sur une macro qu'il te faut mais tout à refaire !
 

punk_sportif

XLDnaute Nouveau
Disons que c'est l'utilisation qui fait la fonction ;)

Mes cellules à rentrer dans le tableau sont définis (E7:E11), pour moi, ca ne me pose pas de problèmes de les rentrer dans mon tableau d'adresse. Je pensais mettre la fonction de vérifier si l'adresse existe et l'ajouter au tableau si elle n'existe pas dans la macro d'impression.

C'est juste cette histoire de combobox qui me gêne. Il est pour moi primordial d'avoir une saisie intuitive comme elle fonctionne actuellement, mais également de pouvoir y rentrer ce que je veux.
 

Roland_M

XLDnaute Barbatruc
re

mais tu ne peux utiliser ce champ E7 : E11 pour introduire des données manuellement puisqu'il y a déjà des formules exp
=SI(RECHERCHEV(E7;Tableau1;3)<>"";RECHERCHEV(E7;Tableau1;3);RECHERCHEV(E7;Tableau1;5) & " " & RECHERCHEV(E7;Tableau1;6))
 

punk_sportif

XLDnaute Nouveau
Non, ces formules en fait ne fonctionneront pas. J'ai oublié de les supprimer avant de transférer le fichier. Je n'ai pas assez réfléchis avant de les mettre. Car si elles fonctionnent dans le cas ou l'adresse est existante, elles seront supprimées si l'adresses n'existe pas, puisqu'il faudra que je remplisse le bloc adresse manuellement.
En cas d'adresse existante le bloc adresse sera dont rempli par macro.
 

Dranreb

XLDnaute Barbatruc
Moi c'est l'inverse.
Je n'ai pour ainsi dire jamais travaillé avec des contrôles dans la feuille. Je n'aime pas.
Et là, après quelques manœuvres, j'ai systématiquement permission refusée sur l'affectation à Me.ComboBox1.List et je ne comprends pas pourquoi.
En tout cas votre ActiveCell = Me.ComboBox1 n'est exécuté que si Me.ComboBox1 = "" ou si IsNumeric(Application.Match(Me.ComboBox1, a, 0) alors c'est normal qu'un nouveau n'est pas conservé.
Par ailleurs rien n'est fait pour ajouter la nouvelle adresse à la liste. Il faudrait un bouton OK pour ça.
Oui enfin bref, on peut dire que je ne sais pas faire sans UserForm, quoi…
Si de plus il fallait pouvoir trouver l'adresse aussi dans une sélection restreinte d'après d'autres critères que le nom (le ville par exemple), ça m'arrangerait plutôt.
Ce serait un prétexte pour installer une machinerie lourde mais qui se commande de façon très légère dans la programmation de l'UserForm…
Juste un tout petit peu moins légère s'il faut la recherche intuitive, mais à peine.
 

punk_sportif

XLDnaute Nouveau
Le bouton pour rajouter une adresse viendra plus tard, et encore, comme je le disais plus haut, je pense que ca sera rajouter à la macro d'impression (une fois qu'on lance l'impression, c'est donc que l'adresse est exact, on peut alors tester dans la feuille "adresses" si elle existe et l'ajouter si besoin.
 

punk_sportif

XLDnaute Nouveau
Bon, ben j'ai trouvé une manière par géniale, mais à défaut d'autre chose, devrait faire l'affaire :

J'ai rajouté cette ligne dans la fonction :
Sheets("bordereau").Range("E7") = Sheets("bordereau").ComboBox1.Value

Code:
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  Sheets("bordereau").Range("E7") = Sheets("bordereau").ComboBox1.Value
  If KeyCode = 13 Then ActiveCell.Offset(1).Select
End Sub

Le combobox passe en E6. E7 récupère la valeur du combobox même si le choix du combobox n'éxiste pas.
Ensuite, si je définis une zone d'impression en excluant E6. Je pense que ca va le faire.
 

Dranreb

XLDnaute Barbatruc
Oui, je pense que c'est surtout ça qui manquait.
Dois-je donc en conclure qu'une solution par UserForm ne vous intéresse en aucune façon ?

Remarque elle n'apporterait pas grand chose :
— Diversification de la recherche, d'après tous les éléments de l'adresse.
— Possibilité d'anticiper l'ajout de la nouvelle adresse, avant l'impression. Mais c'est l'UserForm qui le ferait, même lors de l'impression, quand bien même il ne serait pas affiché.
 
Dernière édition:

Statistiques des forums

Discussions
312 088
Messages
2 085 202
Membres
102 817
dernier inscrit
Nini668