Variable composée

Résolu
Bonjour,

Je prépare une appli pour gérer des questions et des réponses. Voici le modèle souhaité :

Numéro de la question = Num_MS (variable définie dans le code)
Identification de la réponse : MS_x (x étant la valeur de Num_MS)

Je souhaite pouvoir incrémenter le numéro de la réponse en fonction du numéro de la question ex :

Num_MS = 3
MS_ & Num_MS = Range("A1")

qui se traduira par MS_3 = Range("A1")

Si besoin, voici le code préparé :

' Positionnement sur la feuille QCM_MS
Sub MS_AFF()
screen_non
Sheets("QCM_MS").Select
Num_MS = 1
Range("D3") = Num_MS
screen_oui
End Sub

' Gestion des réponses : au clic sur bouton, la réponse s'affiche dans la cellule C6
Sub MS_B1()
Range("C6") = 1
End Sub
Sub MS_B2()
Range("C6") = 2
End Sub
Sub MS_B3()
Range("C6") = 3
End Sub
Sub MS_B4()
Range("C6") = 4
End Sub
Sub MS_BPASS()
Range("C6") = "Je passe"
End Sub

' Mise en variable de la réponse

Sub MS_REP()
MS_ & Num_MS = Range("C6").Value => C'est cette partie là du code qui ne fonctionne pas

reset 'effacer C6 et incrémenter numéro de question
Num_MS = Num_MS + 1
End Sub

J'imagine que ce n'est qu'une question de syntaxe, j'ai essayé de poser des parenthèses mais je bug...

D'avance, je vous remercie pour votre aide.
Cdt,
Jimmy

5 réponses

  1. Modérateur
    Bonjour,

    J'avoue ne pas saisir la question, mais cela ressemble fortement à une variable tableau.

    Exemple :

    'dimensionnement de la variable tableau, 
    'ici elle n'acceptera que 4 "indices", de 0 à 3
    Dim monTab(3)
    monTab(0) =  Range("C6").Value 
    monTab(1) =  Range("C7").Value 
    monTab(2) =  Range("C8").Value 
    monTab(3) =  Range("C9").Value

    En savoir plus...
    0
    1. Modérateur
      Salut,

      si c'est juste une variable, alors ce n'est pas possible (il faut passer, comme l'a justement dit pijaku, par un tableau).

      Si c'est un objet, c'est possible grâce aux collections VBA, un exemple :

      Feuill1.Controls("MS_" & i).text = "toto".

      A+ blux
       "Les cons, ça ose tout. 
      C'est même à ça qu'on les reconnait"
      0
      1. Bonjour,

        Je vous remercie pour la promptitude de vos réponses.

        Je crains effectivement ne pas avoir été clair.

        Pour plus de précisions : il s'agit d'un QCM de "matières scolaires", d'ou le MS qui précède tous les noms utilisés dans le code. Les questions sont posées à l'oral, le candidat répond sur un excel en cliquant sur des boutons (1,2,3,4, je passe).

        Pour savoir où il en est dans le jeu, le numéro de la question "Num_MS" est affichée sur la feuille. Le but est de rester sur cette même feuille pour les 8 questions.

        La réponse du candidat s'affiche en C6 à chaque fois. C'est ce résultat que je souhaite récupérer en variable. Le nom de cette variable doit être composée de (MS_) et suivie du numéro de la question. Ainsi, j'obtiens les réponses MS_1 ; MS_2...

        A la fin des 8 questions, je récupère les réponses et les enregistres dans un autre fichier (le "temp").

        Voici le code d'une réponse :
        ' Au clic sur le bouton MS_B1, un "1" s'affiche en C6
        Sub MS_B1()
        Range("C6") = 1
        End Sub

        Ensuite, pour aller à la question suivante, je passe par ces étapes :
        - Enregistrer la réponse en variable
        - Tester si on est à la fin du jeu (si oui, on passe à la section "fin")
        - Effacer le champ dans lequel est apparue la réponse
        - Incrémenter le numéro de question

        '______________________________
        ' Récupération des réponses

        Sub MS_REP()

        ' Mise en variable de la réponse
        MS_x = Range("C6")
        ' Où "x" = Num_MS => l'étape que je ne parviens pas à résoudre

        ' Test du numéro de question
        If Num_MS = 8 Then GoTo fin

        ' Passage à la question suivante
        Range("C6") = ""

        ' Incrémentation du numéro de question
        Num_MS = Num_MS + 1
        ' Affichage du nouveau numéro de question
        Range("D3") = Num_MS
        Exit Sub

        ' Au bout de 8 questions, enregistrement des réponses dans le temp "C1"
        fin:
        ACTIV_C1
        Range("B10") = MS_1
        Range("B11") = MS_2
        Range("B12") = MS_3
        Range("B13") = MS_4
        Range("B14") = MS_5
        Range("B15") = MS_6
        Range("B16") = MS_7
        Range("B17") = MS_8
        FERMER

        ' Affichage d'une page d'attente
        Sheets("ATT").Select
        Application.Wait Now + TimeValue("00:00:02")

        ' Retour à la page Menu
        Sheets("menu").Select

        End Sub

        Il y a peut-être plus simple à faire, mais en fait, il y a plusieurs candidats simultanés et plusieurs QCM à gérer, d'où mon essai de "compactage" du code.

        J'espère que ces éclaicissements vous aideront à comprendre ma question, si besoin je peux mettre le fichier excel en ligne pour d'éventuels tests.

        Une fois encore, je vous remercie pour vos brillantes idées !

        Cdt,
        Jimmy
        0
        1. Modérateur
          Et bien en fait, c'est bien une variable tableau dont tu as besoin.
          En tête de module, je mettrais :
          Option Explicit
          Option Base 1
          Dim MS_(8)
          Dim Num As Integer

          Regarde ce test à copier-coller dans un module standard :
          Option Explicit 
          
          Option Base 1 
          
          Dim MS_(8) 
          Dim Num As Integer 
          
          Sub Incremente() 
          Dim i As Integer 
          
          Num = Num + 1 
          If Num = 9 Then Num = 1 'ici on empêche simplement d'aller + loin que 8 
          MS_(Num) = "poireau " & Num 
          For i = 1 To 8 'For i = LBound(MS_()) To UBound(MS_()) 
              If MS_(i) <> "" Then MsgBox MS_(i) & " attribué à MS_ n° " & i 
          Next i 
          End Sub
          0
        2. Modérateur
          Je plussoie : un tableau est l'arme absolue pour ce genre de problème...
          0
      2. Bonjour,

        Merci pour votre aide, mais je suis un peu dépassé. J'ai regardé des tutos sur l'exploitation des tableaux, mais ils m'ont juste appris à afficher les données dans des msgbox...

        Je ne comprends pas bien comment remplir le tableau à chaque validation du candidat et tout restituer à la fin dans mon "temp".

        Voilà un sujet qu'il me faudra creuser. Quoi qu'à force de ramer sur le sable, je suis déjà en train de creuser :)

        Avant de lire vos réponses, j'ai pensé à un subterfuge en mangeant : enregistrer dans le temp au fur et à mesure et le fermer ensuite, en me servant du numéro de la question pour définir la cellule de destination dans le temp.

        Voici donc un code moins propre que la solution que vous me proposez, mais qui fonctionne... même si ce n'est pas l'idéal que je recherchais !

        Je serais enchanté de voir comment intégrer la notion de tableau dans la routine du jeu, mais mon cerveau semble faire obstruction. Si vous avez la patience et le temps de corriger ce code avec la mise en application d'un tableau, j'en apprendrais un peu plus et me coucherais moins bête.

        Cependant, je comprendrais fort bien que vous considériez à juste titre la question comme résolue.

        Quoi qu'il en soit, plus je pratique Excel, plus je me rends compte que chaque petit bout de code appris révèle l'ampleur de ce que j'ignorais !

        Trêve de bavardage, voici ma solution :

        '______________________________
        ' Gestion des réponses

        Sub MS_REP()
        screen_non ' application.screenupdating = false

        ' Récupération de la réponse
        MS_R = Range("C6")

        ' Définition de la destination dans le temp
        MS_D = MS_Num + 10

        ' Activation du fichier "temp" dans lequel je range les réponses (ouvert en début de routine)
        ACTIV_C1

        ' Remplissage du temp
        Cells(MS_D, 2) = MS_R

        ' Ménage des variables temporaires
        MS_R = ""
        MS_D = ""

        ' Retour à l'interface utilisée par les joueurs
        ACTIV_Cand1

        ' Test du numéro de question
        If MS_Num = 8 Then GoTo fin

        ' Passage à la question suivante
        Range("C6") = ""
        MS_Num = MS_Num + 1
        Range("D3") = MS_Num
        screen_oui ' rétablissement de l'affichage

        Exit Sub

        ' Fin du jeu
        fin:
        screen_non ' masquage de l'affichage

        ' Fermeture du temp
        ACTIV_C1
        FERMER ' save and close

        ' Affichage d'une page d'attente
        Sheets("ATT").Select
        screen_oui ' rétablissement de l'affichage
        Application.Wait Now + TimeValue("00:00:02")

        ' Retour à la page Menu
        Sheets("menu").Select

        End Sub

        Encore merci pour le temps que vous avez consacré à ce sujet et bon clavardage !

        Cdt,
        Jimmy
        0
        1. Modérateur
          J'avoues une fois de plus ne pas tout saisir.
          Si tu veux que l'on continues, le fichier ne serait pas de trop...
          Pour joindre un fichier, utilisez cjoint.com et revenez coller le lien créé dans une réponse ici même...
          0
        2. Oui, forcément, sans les déclarations de variables et l'usage que j'en fais, ce n'est pas clair. Je viens de relire le code, si on a pas le contexte, c'est incompréhensible !
          0
      3. Re-bonjour,

        Voici le lien : https://www.cjoint.com/?0AEp5S9s0cn

        L'appli (qui se résume à 3 boutons pour le moment) est en feuille "QCM_MS".
        Pour retrouver un affichage normal, utiliser la macro "DEV" (affichage des onglets, de la barre de formule...)

        Bouton 1 : MS_AFF => initialisation du jeu (Affichage du numéro de question = N°1)
        Bouton 2 : MS_B3 => Vous répondez "3" au CQM (c'est la bonne réponse, mais il ne faut pas le dire aux candidatns :))
        Bouton 3 : MS_REP => Envoyer la réponse dans le temporaire.

        Le fichier temporaire n'est pas en lien sur cijoint.com, mail il suffit d'utiliser une feuille vierge excel nommée C1_temp.xlsx

        Attention, le code demande l'ouverture du fichier temp lorsque l'on clique sur "MS_AFF", il faut donc avoir créé le fichier et vérifier son adresse pour pouvoir exécuter.

        Je n'en suis qu'à la carcasse du jeu, une fois celle-ci posée, je ferais la mise en forme. Pour le moment, je cherche à ce que le principe fonctionne avant d'aller plus loin.

        L'exploitation des résultats compilés dans le temp est réalisée par un autre développeur, ce n'est qu'un fichier de "transit" des données.

        Vous souhaitant une bonne journée.

        Cdt,
        Jimmy
        0
        1. Modérateur
          Je ne penses pas pouvoir t'aider davantage...
          Désolé.
          Si ta solution fonctionne alors... utilises là.
          A+
          0
        2. Je me doutais un peu... Mais au moins, en posant cette question je résous sans doute un problème pour l'avenir, puisque je dispose d'une arme nouvelle : les tableaux.
          Merci pour ta patience te bonne journée.
          Cdt,
          Jimmy
          0