VBA

Résolu
Bonjour,

Je suis un débutant en vba et un code ne marche pas, le voilà:

If country = "UK" Then UK()
ElseIf country = "Austria" Then Austria()
... (avec d'autres pays)
End if

ici UK est une sous routine que j'ai défini par ailleurs et country provient d'une inputbox donc c'est l'utilisateur qui est censé choisir sont pays.

Quelqu'un a t-il une idée ? Merci d'avance à vous.

8 réponses

Résumé de la discussion

En VBA, une chaîne If country = "UK" Then UK() ElseIf country = "Austria" Then Austria() ..., alimentée par une InputBox, ne s’exécute pas comme attendu. Plusieurs répondants proposent d’utiliser Select Case pour simplifier, Call UK/Call Austria, et d’énumérer les types de variables (Double vs Variant) afin de clarifier le code. D’autres conseils mentionnent l’usage de la structure If sur plusieurs lignes et l’idée d’afficher le nom du pays dans des cellules pour simplifier la macro. D'autres échanges évoquent aussi des solutions pratiques comme placer les noms des pays en colonne et envisager des macros plus simples, tout en adaptant les contrôles d’entrée pour gérer OK/Annuler.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,

    excusez l'incruste

    plutôt que d'utiliser des elseif utilise plutôt select case

    Select Case country
    Case "uk"
    Call UK
    Case "austria"
    Call Austria
    'etc...
    End Select

    d'autre part et au passage:
    Dim salesnmrmri, salessg, saless, salesfo, volumenmrmri, volumesg, volumes, volumefo, aspnmrmri, aspsg, asps, aspfo As Double 
    seul aspfo est du type double, les autres sont du type variant/ Il faudrait énumérer le type de chaque variable d'où le pensum
    dim machin as double, truc as double...

    enfin ton code me parait bien compliqué: dès que j'aurai un moment je te proposerai autre chose si tu le désires (uniquement). a propos les macro appelées exécutent elles des actions similaires ?
    1
    1. Bonjour,

      Tu peux faire ce test
      Sub Test()
      Dim Country As String
      Country = InputBox("Veuillez saisir le nom du pays.", "CHOIX DU PAYS", "UK")
      If Country = "UK" Then
      UK
      ElseIf Country = "Austria" Then
      Austria
      End If
      End Sub
      Sub UK()
      MsgBox "Tu as choisi UK"
      End Sub
      Sub Austria()
      MsgBox "Tu as choisi Austria"
      End Sub

      A+
      0
      1. Bonsoir Gyrus, Merci pour ta réponse!
        Alors enfait jai déjà le code globale qui ressemble beaucoup a ce que tu as mis mais mon problème est que lorsque j'ouvre mon document la procédure commence comme ça, je choisis le pays et là message d'erreur sur le bloc if. Comme si juste le UK alors que c'est le nom de ma sous-routine ne suffisait pas ou n'est pas correcte pour la lancer.
        0
        1. As-tu essayé d'écrire et de placer le bloc if comme je te l'ai indiqué ?

          A+
          0
          1. Oui j'ai essayé mais j'ais un message d'erreur: Else sans if
            Voilà mon code:

            Sub Workbook_Open()
            Dim country As String
            Dim salesnmrmri, salessg, saless, salesfo, volumenmrmri, volumesg, volumes, volumefo, aspnmrmri, aspsg, asps, aspfo As Double
            Dim growth As Single

            country = InputBox("Choose your country in the following list:" & Chr(10) & "UK" & Chr(10) & "Austria" & Chr(10) & "Poland" & Chr(10) & "Greece" & Chr(10) & "Japan" & Chr(10) & "China" & Chr(10) & "Taiwan" & Chr(10) & "Korea" & Chr(10) & "Singapore" & Chr(10) & "The Philippines" & Chr(10) & "Malaysia" & Chr(10) & "Vietnam" & Chr(10) & "Indonesia" & Chr(10) & "U.S." & Chr(10) & "Canada" & Chr(10) & "Mexico" & Chr(10) & "UAE" & Chr(10) & "Egypt" & Chr(10) & "Saudi Arabia" & Chr(10) & "India" & Chr(10) & "Gabon" & Chr(10) & "South Africa" & Chr(10) & "Brazil" & Chr(10) & "Argentina" & Chr(10) & "French Guyanna", "Country")

            Do Until country = "UK" Or country = "Austria" Or country = "Poland" Or country = "Greece" Or country = "Japan" Or country = "China" Or country = "Taiwan" Or country = "Korea" Or country = "Singapore" Or country = "The Philippines" Or country = "Malaysia" Or country = "Vietnam" Or country = "Indonesia" Or country = "U.S." Or country = "Canada" Or country = "Mexico" Or country = "UAE" Or country = "Egypt" Or country = "Saudi Arabia" Or country = "India" Or country = "Gabon" Or country = "South Africa" Or country = "Brazil" Or country = "Argentina" Or country = "French Guyanna"

            MsgBox "Your country is not in the list: try again by paying attention to the given list or quit the document. We may send this to you by error"
            country = InputBox("Choose your country in the following list:" & Chr(10) & "UK" & Chr(10) & "Austria" & Chr(10) & "Poland" & Chr(10) & "Greece" & Chr(10) & "Japan" & Chr(10) & "China" & Chr(10) & "Taiwan" & Chr(10) & "Korea" & Chr(10) & "Singapore" & Chr(10) & "The Philippines" & Chr(10) & "Malaysia" & Chr(10) & "Vietnam" & Chr(10) & "Indonesia" & Chr(10) & "U.S." & Chr(10) & "Canada" & Chr(10) & "Mexico" & Chr(10) & "UAE" & Chr(10) & "Egypt" & Chr(10) & "Saudi Arabia" & Chr(10) & "India" & Chr(10) & "Gabon" & Chr(10) & "South Africa" & Chr(10) & "Brazil" & Chr(10) & "Argentina" & Chr(10) & "French Guyanna", "Country")

            Loop

            ElseIf country = "Austria" Then Application .Austria
            ElseIf country = "Poland" Then Application .Poland
            ElseIf country = "Greece" Then Application .Greece
            ElseIf country = "Japan" Then Application .Japan
            ElseIf country = "China" Then Application .China
            ElseIf country = "Taiwan" Then Application .Taiwan
            ElseIf country = "Korea" Then Application .Korea
            ElseIf country = "Singapore" Then Application .Singapore
            ElseIf country = "The Philippines" Then Application .The_Philippines
            ElseIf country = "Malaysia" Then Application .Malaysia
            ElseIf country = "Vietnam" Then Application .Vietnam
            ElseIf country = "Indonesia" Then Application .Indonesia
            ElseIf country = "U.S." Then Application .US
            ElseIf country = "Mexico" Then Application .Mexico
            ElseIf country = "UAE" Then Application .UAE
            ElseIf country = "South Africa" Then Application .South_Africa
            ElseIf country = "Saudi Arabia" Then Application .Saudi_Arabia
            ElseIf country = "India" Then Application .India
            ElseIf country = "Gabon" Then Call .Gabon
            ElseIf country = "Brazil" Then Call .Brazil
            ElseIf country = "Argentina" Then Call .Argentina
            ElseIf country = "French Guyanna" Then Call .French_Guyanna

            End sub

            Bon c'est un peu long mais c'est exactement le m^me principe que ce que tu me conseilles non ? (j'ai essayé avec ou sans le "Application" avant la sous routine mais ça ne marche pas)
            0
            1. Merci Michel oui ça marche en fait le message d'erreur que j'avais se résout simplement en revenant à la ligne après la première ligne:
              if country="UK" then
              UK
              Else if country...

              ET merci ça marche aussi avec le select. Pour les variables ok je croyais que toute la ligne prenait la dernière définition.

              J'accepte évidemment avec plaisir si vous me proposez quelque chose de moins grossier. Et enfin oui les actions sont similaires seul les cases d'enregistrement des résultats demandés changent.
              0
              1. Contributeur
                OK, je regarde...

                Montre moi le code d'une ou deux sous macro (UK et Austria par ex) pour étudier une simplification par macro paramétrée...
                pour joindre une pièce
                mettre le classeur sans données confidentielles en pièce jointe sur
                https://www.cjoint.com/
                puis copier l'adresse du lien et la coller dans le message de réponse
                0
              2. Ok je vous mets ça dès que j'ai fini mon code pour ces sous routines car je bloque encore sur certaines choses que je veux rajouter.
                Merci Michel
                0
              3. Est-ce que vous savez Michel comment faire pour imposer ce type de condition:
                si la valeur rentrée dans la input box est numerique ok, sinon réafficher le même message (ça ok je sais faire mais c'est après)
                si l'utilisateur clique sur ok après avoir rempli la case, on continue, s'il clique sur annuler on sort de tt le processus.
                0
              4. Contributeur
                dans ce que je vais te proposer on ne passa pas par un inputbox mais par un formulaire(userform) et un combobox: plus de saisie par l'utilisateur donc plus de faute de frappe(ca je sais faire)
                0
              5. ok mais l'utilisateur est obligé de saisir des choses car c'est un document qu'on lui envoie pour qu'il rende compte de son activité
                0
            2. Contributeur
              Ci joint maquette "pays"

              sans saisie de l'utilisateur on lance la sousmacro du pays

              codes dans thisworkbook (workbook_open), userform1,et module1

              après l'utilisateur peut ^tre amener à faire des saisies ce qui sort de mon intervention mais le choix du pays est obligatoirement fait dans la liste déroulante

              tu as aussi le principe des macros paramétrées certainement à modifier suivant tes prescriptions (pas d'appel par "call" avec les paramétrées)

              https://www.cjoint.com/?3CllHJaThl7

              0
              1. Je vois ton message maintenant car je n'étais pas là hier après midi. Il faut que je déchiffre tout ça parce que là vous m'avez laché Michel. Mais merci beaucoup de m'aider Michel.Je reviens quand j'en saurai un peu plus.
                0
              2. C'est quoi les ssmacro Michel ?
                0
              3. Pardon pour les ssmacro je n'avais pas vu la procédure. Voici mon code pour une procédure d'un pays et seules les cellules dans lesquelles je range les résultats changent d'un pays à l'autre.
                Sub UK()

                salesnmrmri = InputBox("What are your sales (in k€) for ...?", "NMR/MRI")

                Do Until IsNumeric(salesnmrmri) = True And salesnmrmri <> ""

                MsgBox "Be careful, a numeric value is expected"
                salesnmrmri = InputBox("What are your sales (in k€) for ...?", "NMR/MRI")

                Loop

                'Là j'aimerais faire dépendre la suite du bouton cliqué (si annuler on sort de la procédure, si ok on poursuit)

                Range("C11").Value = salesnmrmri

                growth = InputBox("What is the growth of your sales (in %) for ...? ", "NMR/MRI")

                'même principe que ci dessus ici
                Range("D11").Value = growth

                End Sub
                Voilà a quoi ressemble la procédure pour chaque pays
                0
              4. Contributeur
                Bonjour,

                C'est l'adresse des range C11 et D11 qui varie ?
                0
              5. oui par exemple pour l'UK j'aurai C11 et D11 et pour Poland j'aurai C12 et D12
                0
            3. Contributeur
              et voilà
              https://www.cjoint.com/?3CmoLw07TK4

              les macros
              module thisworkbook
              Option Explicit
              '-------
              'Michel_M sur forum CCM 12 Mars 2014 Version 2
              Private Sub Workbook_Open()
              UserForm1.Show
              End Sub
              userform
              Option Explicit
              'Michel_M sur forum CCM 12 Mars 2014 Version 2
              '-----
              Private Sub UserForm_Initialize()
              Cbx_country.RowSource = "B11:B33"
              End Sub
              '------
              Private Sub Cbx_country_Change()
              Dim Country As String
              Country = Cbx_country
              Unload UserForm1
              report Country
              End Sub

              module1
              Option Explicit
              'Michel_M sur forum CCM 12 Mars 2014 Version 2
              Sub report(state)
              Dim Sales, Growth, rep As Byte
              Dim Lig As Byte

              'saisies et vérification si nombre
              1: On Error GoTo erreur1
              Sales = InputBox("What are your sales (in k€) for ...?", "NMR/MRI")
              If Not IsNumeric(Sales) Or IsEmpty(Sales) Then GoTo erreur1

              2: On Error GoTo erreur2
              Growth = InputBox("What is the growth of your sales (in %) for ...?", "NMR/MRI")
              If Not IsNumeric(Growth) Or IsEmpty(Growth) Then GoTo erreur2

              'incriptions dans Excel
              With Sheets(1) 'A ADAPTER AU NOM DE LA FEUILLE
              Lig = .Columns("B").Find(state, .Range("B10"), xlValues).Row
              .Cells(Lig, "C") = CDbl(Sales) 'cdbl pour tenir compte nombre décimal
              .Cells(Lig, "D") = CDbl(Growth) / 100
              End With
              Exit Sub

              'gestionnaire erreurs
              erreur1:
              rep = MsgBox("Be careful, a numeric value is expected,retry ?", vbYesNo, "NMR/MRI")
              If rep = 6 Then GoTo 1
              Exit Sub

              erreur2:
              rep = MsgBox("Be careful, a numeric value is expected,retry ?", vbYesNo, "NMR/MRI")
              If rep = 6 Then GoTo 2
              End Sub
              Michel
              0
              1. merci beaucoup Michel je vais regarder ça et je reviens te dire si ça a marché
                0
              2. ça marche nickel michel merci encore pout ton aide
                0
              3. Contributeur
                content pour toi !
                peut-^tre à bientôt pour de nouvelles z'avantuuures...
                0