VBA

Résolu
rafi382 -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  3. rafi382
     
    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
  4. Gyrus Messages postés 3360 Statut Membre 526
     
    As-tu essayé d'écrire et de placer le bloc if comme je te l'ai indiqué ?

    A+
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. rafi382
     
    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
  7. rafi382
     
    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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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. rafi382
       
      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. rafi382
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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. rafi382
       
      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
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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. rafi382
       
      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. rafi382
       
      C'est quoi les ssmacro Michel ?
      0
    3. rafi382
       
      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. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,

      C'est l'adresse des range C11 et D11 qui varie ?
      0
    5. rafi382
       
      oui par exemple pour l'UK j'aurai C11 et D11 et pour Poland j'aurai C12 et D12
      0
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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. rafi382
       
      merci beaucoup Michel je vais regarder ça et je reviens te dire si ça a marché
      0
    2. rafi382
       
      ça marche nickel michel merci encore pout ton aide
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      content pour toi !
      peut-^tre à bientôt pour de nouvelles z'avantuuures...
      0