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
    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
  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. 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
  4. 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. 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. As-tu essayé d'écrire et de placer le bloc if comme je te l'ai indiqué ?

        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. 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