VBA je suis BLOQUER :'(
RésoluVoila maintenant 6h que je cherche une solution et je me decide enfin a demander de l'aide.
Tous d'abords je suis un tout nouvequ dans le monde du Vba... Pardon d'avance de mon ignorance ou des questions bete que je pourais poser.
Je vous explique mon probleme:
Je suis sous exel j'ai programmer un ComboBox afin de repertorier une liste de client (A, B, C, ...) une fois le client choisis, j'aimerai qu'en fonction du choix je puisse mettre dans une autre cellule une texte associe
ex:
Client A paiement sous 10 jours
Client B paiement sous 30 jours
Client C paiement sous 15 jours
...
If Range("A1") = "Client A" then
Range ("D4") = "paiement sous 10 jours"
End If
Ceci etai le premier probleme.
Voici le second:
Suite a un choix dans une ComboBox encore une fois il faudrait y associer une formule
ex:
Cuivre dia 8mm lg 1000m POIDS?
Alu
...
If Range("A1") = Cuivre then
Range("POIDS") = aire du cercle par la lg .... x densité !!! (ya que sa qui change) / ......
j'espere que je me suis fais comprendre.
Merci d'avance pour vos reponses
Configuration: Windows XP Internet Explorer 7.0
24 réponses
Un utilisateur débutant en VBA cherche, via une ComboBox dans Excel, à afficher dans une cellule le texte associé à chaque client et, d’un deuxième choix, à calculer une formule. La solution retenue propose d’utiliser les fonctions INDEX et EQUIV pour retrouver la donnée associée au client dans une colonne et la renvoyer dans la cellule cible. D’autres réponses évoquent une approche via une fonction personnalisée fReturnConditionForClient, en s’appuyant sur Range(A1).Text pour éviter les soucis de comparaison entre objet et texte, et faciliter les mises à jour sans modifier le code. En complément, la discussion rappelle l’usage de la propriété Text et la possibilité d’intégrer des calculs lorsque les données ou les conditions évoluent, pour les scénarios avancés.
-
Les fonctions INDEX et EQUIV
La fonction précédente comme vous le constatez à ces limites : la colonne de recherche doit se trouver à gauche de la colonne de résultat. Pour palier à ceci vous pouvez utilisez conjointement 2 fonctions :
EQUIV, qui va vous donner l'emplacement d'une valeur dans une colonne ou une ligne,
INDEX, qui renvoie une donnée d'une liste (en ligne ou colonne) à partir de sa position dans la liste.
Reprenons l'exemple précédent :
Date Produit Prix unitaire Taux TVA Nombre
01/10/2004 aa 10,50 5,5% 10
02/10/2004 zz 2,50 5,5% 125
05/11/2004 bb 3,00 19,6% 23
03/10/2004 dd 50,25 19,6% 5
Si vous voulez savoir quel est le produit vendu à 3,00 € (attention cela ne me donnera que le 1er produit à ce prix s'il y en a plusieurs tout comme RECHERCHEV), procédez ainsi :
Dans une cellule, par exemple F1, tapez 3 (c'est à dire la valeur à rechercher)
Dans une autre cellule, par exemple G1, tapez la formule suivante en considérant que le tableau ci-dessus se trouve en A1:E5 :
=EQUIV(F1;C1:C5;0)
F1 est la valeur que vous recherchez
C2:C5 est le tableau dans lequel vous recherchez la valeur, ici je n'inclue pas les titres
0 doit être mis pour rechercher une valeur exacte (pour les autres valeurs voir l'aide)
Cette formule vous renverra 3 car la valeur 3 se trouve en 3ème position dans la plage C2:C5
Dans une cellule, par exemple H1, tapez la formule suivante :
=INDEX(B2:B5;G1)
B2:B5 est le tableau dans lequel je veux lire le résultat (tout comme pour la recherche je n'inclue pas les titres). Ce tableau doit avoir la même dimension que celui dans lequel on a effectué la recherche.
G1 représente la position où je dois lire la donnée dans ce tableau, ici la 3ème position. Ce qui vous donne bien bb
Vous pouvez combiner ces 2 fonctions en utilisant la formule suivante :
=INDEX(B2:B5;EQUIV(F1;C1:C5;0))
SOURCE : https://www.excel-exercice.com/
Ben je me suis pris la tete pour rien :s
Merci a tout le monde !!!
Grace a vous j'en ai appris beaucoup -
ContributeurBonjour,
Tu sais, le plus simple pour démarrer en VBA est d'enregistrer une macro et d'adapter le bout de code ensuite.
Pour avoir les outils sous la main: menu "Affichage/Barre d'outils" où tu coches "Visual Basic".
Le rond rouge lance l'enregistrement de la macro.
Une petite fenetre de contrôle s'ouvre où tu peux arreter l'enregistrement et choisir entre references absolues ou relatives (ne la ferme jamais, elle n'est pas évidente à faire revenir).
Là toutes tes actions vont etre enregistrées.
Par exemple dans ta feuille client fais "edition/rechercher" paul (nom du client)
Arreter l'enregistrement de la macro.
et tu obtiens :
Range("A1").Select
Cells.Find(What:="paul", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
A toi de modifier/supprimer les parametre selon tes besoins.
Par exemple activer la cellule (.activate à la fin) ne t'interesse pas, par contre .offset(ligne,colonne) te permet de decaler ta reference pour récuperer une valeur avec le .value
Dim nomClient As String
nomClient = "paul"
conditionPaiement = Cells.Find(What:=nomClient, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Offset(0, 1).Value
MsgBox (nomClient & ": " & conditionPaiement)
Les erreurs ne sont pas gérées, il faut que le client existe !
J'espère t'avoir mis le pied à l'étrier, à toi de t'amuser ;-) -
Comme je te l'ai dit précédemment, je ne suis pas une bete de vba.
Voici une piste.
Range("D4") = fReturnConditionForClient(Range("A1").Text)
La fonction serait de ce style
Function fReturnConditionForClient(sClient As String) As String
Dim oCell As Range
Dim iCpt As Variant
iCpt = 0
'liste des clients
Range("Feuil1!A1:A500").Select
For Each oCell In Selection
iCpt = iCpt + 1
If (oCell.Value = sClient) Then
Exit For
End If
Next
Return Range("Feuil1!B"&iCpt).text
EndFunction
(au passage je remercie BoOst pour son aide) -
Bonjour,
Voila ou jen suis:
Dim Plage As Range
Dim sClient As String
Range("R1") = sClient
Set Plage = sClient.Find("Feuil3!J1:J500")
Plage.Select
Do Until Plage Is Nothing
If Plage Is Nothing Then
Exit Do
Else
Set Plage = sClient.FindNext(Plage)
Plage.Select
Loop
Range("D17") = Range("Feuil3!K(Plage)")
End Sub
Mais sa bug grave !!!! -
'Sub Recherche()
'Dim Plage As Range
'Dim sClient As String
'Range("R1")=sClient
'Set Plage = sClient.Find("Feuil3!J1:J500")
'Plage.Select
'Do Until Plage Is Nothing
'If Is Nothing Then
'Exit Do
''Set Plage = sclient.FindNext(Plage)
'Plage.Select
'Loop
'End Sub
euh ... mieu pas infini ?
et pour le +1 colonne? :s -
'Sub Recherche()
'Dim Plage As Range
'Dim sClient As String
'Range("R1")=sClient
'Set Plage = sClient.Find("Feuil3!J1:J500")
'Plage.Select
'Do Until Plage Is Nothing
'If Is Nothing Then
'Exit Do
'Loop
'End Sub
Bon j'espere que je progresse :s -
lool je ne me connecterai plus jamais avec ce pseudo quand je taurai montrer ou j'en suis ^^ :
Private Sub Recherche()
Dim sClient As String
Range("R1").Text = sClient
sClient.Find ("feuil3!J1:J500")
If sClient = Range("Feuil3!J(i)").Text Then
With 0 < i < 500
End If
End sub
laisser moi au moin une excuse:
Je me suis mis au vb depuis moin de 10 jours mais je vais y arriver ... -
en pseudo code cela devrait te donner ceci :
Range("D4") = fReturnConditionForClient(ValeurChoixTexteDeLaComBoxClient)
avec
Function fReturnConditionForClient(sClient As String) As String
'sClient = ChoixValeurTexteDansComboClient
Dim sCondition
'Rechercher dans la feuille pour la colonne A (liste des Clients) l'occurence sClient
'utilisation boucle : For, While, Until ... au choix ...
'lorsque l'occurence est trouvé ;
'if sClient = Range("Feuil(n)!A(i)").text => n = numero de la feuille, i numero de la cellule
'sCondition = Range("Feuil(n)!B(i)").text
' Break
'EndIf
'Return sCondition
EndFunction
CQFD ? avec un p'tit RTFM quand meme -
Sa ma lair correct mais je ne sais pas le faire en vb
J'espere que quelqu'un pourra me le traduire en tout cas merci bcp ShaBoo. -
Aïe ...
Je ne suis pas très expert en VBA ...
Mais grosso modo cela devrait donner ceci :
- Choix dans la ComboBox du Client te retourne la valeur texte.
- Avec cette valeur texte, rechercher en colonne A de la feuille contenant la liste des Clients la ligne correspondante.
- Lorsque la ligne est trouvé, incrémenté de +1 sur la colonne pour se positionné en colonne B => correspondance avec la condition associé à ce Client.
- retourné la valeur texte de la colonne B dans la celulle spécifique.
CQFD ? -
CQFD Tu as trouver la reponse mais ... tu le traduit comment en language vb :s
Merci Merci Merci pour ton aide -
Eh bien voilà ... tt les éléments sont rassemblés ...
Le choix dans la ComboBox te retourne le Client. Avec le Client retourné tu recherches la ligne correspondante dans la colonne A. Lorsque tu as la ligne correspondante tu te deplace de +1 pour etre sur la colonne B et d'avoir la condition associée pour ce Client. Il te suffit de recupérer cette valeur pour l'afficher dans la cellule spécifique ... CQFD -
Tout a fait
-
Je viens de relire ton pb de depart et je l'associe à ton dernier post. Voilà ce que j'en ai compris :
- Dans la meme feuille excel tu as une liste de client en colonne A associé à des conditions en colonne B. La colonne A permet de construire ta ComboBox.
- Le Choix d'un client effectué dans la ComboBox doit te retourner la condition associé de la colonne B qui doit etre affiché dans une cellule spécifique.
Ai je compris ton pb ? -
Pas trouver de solution :'(
Je me tape les 500 a ecrire :s
Et je vous avoue... C'est long et emm....
Merci pour votre aide en tout cas -
j'ai une liste de client sous exel en feuil3!A1:A500
En Feuil3!B1:B500 jai leurs conditions de paiement
En Feuil3!C1:C500 j'ai encore une donnee
j'ai construit la combobox sous exel afin que le choix defini par l'operateur remplisse un tableau sous la feuille 2 -
Sûr que tu peux le faire, mais je ne t'explique pas la lisibilté et le maintient de ton code par la suite.
Si je comprend bien tu as plusieurs Clients auquels tu veux accorder une et une seule condition.
Tu as une liste de Client dans une combobox. A partir de Quoi construis cette combo (fichier Excel, Table Clients d'une Base de donnée, ...) ? -
Ou peu etre me mettre en relation avec les données de la combobox non ?
Existe il un code pour:
Combobox ---> Rowsource Feuil1!A1:A500
et mettre en relation avec Feuil1!B1:B500
Avec A1 correspond a B1
J'espere que je me suis fais comprendre :s -
Sa m'eleve deja beaucoup de ligne je te remercie.
Helas il me reste tou de meme 500 clientS a taper
Existe il une limite de taille (je m'explique):
If Range("A1").Text = "Client A" Or Range("A1").Text= "Client Z" Or Range("A1").Text ="Client DE" ... Then
Range("D4") = "paiement sous 10 jours"
End If
j'ai vu que cela marchait pour 10 x Or mais puis je mettre les 500 ? -
Bonjour,
Tu peux essayer d'automatiser ta recherche de condition en passant par une fonction :
ex :
dans ton code générale tu aurais ceci :
Range("D4") = fReturnCondition (Range("D1").Text)
et la fonction aurait cette tete :
Function fReturnCondition (sClient As String) As String
Dim sCondition As String
Evaluate sClient
When "Client A"
sCondition = "paiement sous 10 jours"
When "Client B"
sCondition = "paiement sous 20 jours"
When "Client C"
sCondition = "paiement sous 10 jours"
.
.
.
.
When "Client Z"
sCondition = "paiement sous 10 jours"
Else
sCondition = "Client inexistant"
EndEvaluate
Return sCondition
EndFunction
- 1
- 2