VBA je suis BLOQUER :'(

Résolu
Bonjour

Voila 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

Résumé de la discussion

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.

Bobot (l’IA à votre service)
  1. Bonsoir Katarinas,

    Pour le premier problème c'est parce que tu compares l'objet cellule avec le texte "Client A", ce qui fait qu'il n'entre jamais dans la condition. Tu devrais invoquer le texte de l'objet cellule par sa propriété Text :
     If Range("A1").Text = "Client A" Then
            Range("D4") = "paiement sous 10 jours"
     End If
    

    L'autre j'ai pas compris mais il souffre sûrement aussi du même problème ^^
    1. 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
      1. 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
        1. Sinon hein, de manière générale, écrire une formule dans une cellule par programmation se fait de la même façon que directement dans le tableur avec Range("la cellule") = "=A9*A11*A10" admettant que A9, A11 et A10 représentent respectivement l'aire, la longueur (ou largeur) et la densité...

          Et comme tu débutes en VB(A) je te conseille de commencer tous tes scripts par l'instruction
          Option Explicit
          qui force à déclarer les variables. Ainsi tu as moins de chances de faire une erreur de frappe, l'interpréteur te signalera une erreur là où tu utilises une variable que tu n'as pas déclarée.
          1. Merci bcp Posotaz
            tu m'aide beaucoup sur le point du : .text que je n'avais pas vu

            Maintenant dans le meme principe je voudrais:

            If Range("A1").Text = "Client A" Or "Client Z" Or "Client DE" ... Then
            Range("D4") = "paiement sous 10 jours"
            End If

            Helas cela ne fonctionne pas
            1. Me revoila en pleine recherche :)

              If Range("A1").Text = "Client A" Then
              Range("D4") = "paiement sous 10 jours"
              End If
              If Range("A1").Text = "Client Z" Then
              Range("D4") = "paiement sous 10 jours"
              End If

              Jusque la sa marche mais j'ai une liste de 500 Client y aurait il quelque chose de plus simple?

              Merci d'avance
              1. 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. 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 ?
                  1. 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
                    1. Le plus simple serait qu'a la création de ton client tu lui associe un code condition.

                      Lors de la creation de ta combo ce code lui serait affecté.

                      Il ne te suffiras plus qu'à faire une fonction qui te retourneras le libélle du code condition associé à ton Client.
                  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, ...) ?
                    1. 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
                      1. 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
                        1. 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 ?
                          1. 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
                            1. CQFD Tu as trouver la reponse mais ... tu le traduit comment en language vb :s
                              Merci Merci Merci pour ton aide
                              1. 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 ?
                                1. 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.
                                  1. rhooo ...

                                    Allez ... un ch'ti t'effort ... tu as tt les éléments ...

                                    il te suffit d'ecrire la fonction de recherche en utilisant une boucle de recherche d'un Client pour retrouver sa condition ...

                                    (Tape F1 pour plus de renseignement ... ;p)
                                2. 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 ...
                                  1. '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
                                    1. Pas mal pour un debut ... tu n'es pas loin de la boucle infini ... ;p
                                  • 1
                                  • 2