Liste déroulante et saisie manuelle

JB33

XLDnaute Nouveau
Bonjour à tous,


J'ai parcouru les sujets du forum mais je ne parviens pas à trouver une solution à mon problème.
Je vous explique.

Je conçoit actuellement une feuille de calcul (Excel 2010) qui servira à tous nos conducteurs de travaux (Excel2007) pour faire des commandes auprès de nos fournisseurs.

Entre autres choses sur mon premier onglet, il faut indiquer les coordonnées dudit fournisseur. Dans le but de leur faire gagner du temps, j'ai noté dans un deuxième onglet, sous forme de tableau, les coordonnées de nos principaux fournisseurs avec dans la première page, un menu déroulant pour saisir le nom de la société et des formules index pour rapatrier toutes les données concernant ce fournisseur (adresse, téléphone...).
Là où ça se complique, c'est qu'il y aura toujours des fournisseurs qui ne seront pas listés dans mon deuxième onglet.

Est-il possible par exemple de créer une entrée 'autre fournisseur' dans la liste déroulante qui permette alors une saisie manuelle tout en gardant la possibilité après de revenir à un fournisseur listé dans le tableau et conserver les formules index qui vont chercher les données de ce fournisseur ? Ou alors, peut-être plus simple, une sorte d'invite de commande qui invite les utilisateurs à entrer les données pour qu'elles soient automatiquement ajoutées au tableau des données dans une ligne vide ?

J'imagine que de toute façon il va me falloir recourir à une macro... Si vous pouviez m'aiguiller un peu, j'en serais ravi car je ne suis pas familier de VBA !
 

Pièces jointes

  • test.xls
    26 KB · Affichages: 103
  • test.xls
    26 KB · Affichages: 109
  • test.xls
    26 KB · Affichages: 110

Dranreb

XLDnaute Barbatruc
Re : Liste déroulante et saisie manuelle

Bonjour
Je propose une validation de donnée par liste "nom" dans la cellule B2, mais sans message si on tape autre chose,
en B3 :
Code:
=EQUIV(B2;nom;0)
et des macros dans la feuille qui gèrent l'ajout du nouveau nom.

P.S. Comme dans le classeur joint, en rendant les noms dynamiques. Mais à partir du moment où il y a de la programmation, on pourrait tout aussi bien gérer des noms statiques en agrandissant les plages référencées.
À +
 

Pièces jointes

  • TEST3.xls
    23.5 KB · Affichages: 162
  • TEST3.xls
    23.5 KB · Affichages: 176
  • TEST3.xls
    23.5 KB · Affichages: 187
Dernière édition:

JB33

XLDnaute Nouveau
Re : Liste déroulante et saisie manuelle

Merci Dranreb !


La première partie me convient tout à fait puisqu'il suffit de taper ne nouveau nom pour qu'il s'incrémente dans la table des fournisseurs. C'est parfait !

J'ai plus de mal avec la suite. Je ne comprend pas le rôle de la formule EQUIV puisqu'elle se contente de renvoyer la "position" de l'argument dans la colonne. Or, j'ai déjà cette valeur dans la case B1 ?

il faut à présent que je trouve comment faire en sorte qu'Excel, lorsque je tape un nouveau nom, de me demander de renseigner les autres données du fournisseur. Je vais plancher là dessus ce WE. Si je n'y arrive pas, je reviendrais vers vous ;) !

Merci encore et bon weekend.


JB33
 

Dranreb

XLDnaute Barbatruc
Re : Liste déroulante et saisie manuelle

Or, j'ai déjà cette valeur dans la case B1
Vous ne l'avez plus puisque c'était la cellule liée d'un contrôle de formulaire que j'ai remplacé par une validation.
me demander de renseigner les autres données du fournisseur
Vous pouvez peut être étoffer un peu le 1er Case dans la Worksheet_Change que je vous ai mis. Comme ceci par exemple:
VB:
Case "$B$2":
      If IsError(Me.[B1].Value) Then
         With Feuil2.[nom]: .Rows(.Rows.Count + 1).Value = Target.Value: End With
         Me.[B3:B5].ClearContents
         MsgBox "Veuillez saisir les autres informations.", vbInformation, "Nouveau nom entré"
      Else
         Me.[B3].Formula = "=INDEX(adresse,$B$1)"
         Me.[B4].Formula = "=INDEX(code,$B$1)"
         Me.[B5].Formula = "=INDEX(commune,$B$1)"
         End If
 
Dernière édition:

JB33

XLDnaute Nouveau
Re : Liste déroulante et saisie manuelle

Bonjour,


Vous ne l'avez plus puisque c'était la cellule liée d'un contrôle de formulaire que j'ai remplacé par une validation.

oui, effectivement ! il faudrait que je sois un peu plus attentif...

Encore une fois merci, j'ai intégré la suite de votre code et ça fonctionne très bien. Cependant, je voudrais que les valeurs que je saisi manuellement dans les champs (feuil1, cases B3 à B4) soient directement reportées dans le tableau de la feuil2...
J'ai tenté de faire ça ce weekend mais je sèche. Est-ce sur le principe même de ce que je tente de réaliser ou sur la syntaxe, je ne le sais même pas.
Je crois que je vais devoir insister pour que mon chef me paie une formation VBA !


JB33
 

Dranreb

XLDnaute Barbatruc
Re : Liste déroulante et saisie manuelle

Bonjour.
Mais ... normalement ça se fait déjà tout seul grâce aux autres Case du Select de la Worksheet_Change !
Même quand on écrase une formule, il inscrit la nouvelle valeur à la ligne indiquée en B1 puis remplace le contenu par la formule qui le restitue.
Actuellement c'est écrit comme ça dans mon TEST3.xls :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application: .EnableEvents = False: .Calculation = xlCalculationManual: End With
Select Case Target.Address
   Case "$B$2":
      If IsError(Me.[B1].Value) Then
         With Feuil2.[nom]: .Rows(.Rows.Count + 1).Value = Target.Value: End With
         Me.[B3:B5].Value = "?": Me.[B3].Select
         MsgBox "Veuillez saisir les autres informations.", vbInformation, "Nouveau nom entré"
      Else
         If Not Me.[B3].HasFormula Then Me.[B3].Formula = "=INDEX(adresse,$B$1)"
         If Not Me.[B4].HasFormula Then Me.[B4].Formula = "=INDEX(code,$B$1)"
         If Not Me.[B5].HasFormula Then Me.[B5].Formula = "=INDEX(commune,$B$1)"
         End If
   Case "$B$3": Feuil2.[adresse].Rows(Me.[B1].Value) = Target.Value: Target.Formula = "=INDEX(adresse,$B$1)"
   Case "$B$4": Feuil2.[code].Rows(Me.[B1].Value) = Target.Value:    Target.Formula = "=INDEX(code,$B$1)"
   Case "$B$5": Feuil2.[commune].Rows(Me.[B1].Value) = Target.Value: Target.Formula = "=INDEX(commune,$B$1)"
   End Select
With Application: .EnableEvents = True: .Calculation = xlCalculationAutomatic: End With
End Sub
Cordialement.
 

JB33

XLDnaute Nouveau
Re : Liste déroulante et saisie manuelle

Bonjour Dranreb !

Désolé de ne pas avoir répondu plus tôt, j'ai eu une foultitude de choses à faire au boulot et j'ai du remettre jusque là le développement de mon classeur.

Je vais tester ta proposition tout de suite, je ne l'avais pas exactement rédigé de cette façon. Ce qui expliquerait que ça ne fonctionnait pas parfaitement...

Merci.
 

elodieo123

XLDnaute Nouveau
Re : Liste déroulante et saisie manuelle

Bonjour,

Est-ce possible de mettre en place ces macros sur mon fichier ?
Car parfois j'ai des artciles que je n'ai pas besoin d'avoir dans ma base Article, donc je ne veux pas me servir de ma liste déroulante.
Pour inscrire une désignation sans aller dans ma liste déroulante je désactive manuellement ma liste déroulante mais j'ai toujours les formules Recherche V qui restent affichées.

Par contre je ne veux pas que la nouvelle désignation s'ajoute à ma base Articles. Est-ce possible ?


Je commence par la formule Décaler quand même?
 

Pièces jointes

  • Facturier - Copie.xlsm
    217.6 KB · Affichages: 129
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Liste déroulante et saisie manuelle

Vous avec un modèle de procédure au poste #6 de cette discussion.
Elle se met dans le module objet associé à la feuille concernée.
Le paramètre Target est l'objet représentant la plage modifiée.
 

Dranreb

XLDnaute Barbatruc
Re : Liste déroulante et saisie manuelle

Bonjour.
Ça par exemple :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim L As Long
If Target.Rows.Count <> 1 Then Exit Sub
If Intersect(Me.[B16:B41], Target) Is Nothing Then Exit Sub
On Error Resume Next
L = WorksheetFunction.Match(Target(1, 1).Value, [f_article], 1)
On Error GoTo 0
If L = 0 Then Exit Sub
Set Target = Target.EntireRow
With [f_article].Rows(L).EntireRow
   Target.Columns("E").Value = .Columns("C").Value
   Target.Columns("G").Value = .Columns("D").Value
   End With
End Sub
 

Discussions similaires

Réponses
43
Affichages
2 K

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 813
dernier inscrit
kaiyi