VBA report questions

Bonjour à tous,

Je suis novice et autodidacte en vba et j'ai besoin de votre aide.

J'ai crée un bouton avec lequel je pose différentes questions (qui s'affichent dans la colonne A de la feuille 2) par le biais de msgbox. Les réponses à ces questions sont simples (oui ou non) et s'affiche dans la colonne B de la feuille 2.

Je souhaite désormais créer un bouton avec lequel je revoie dans la feuille 3 toutes les questions pour lesquelles la réponse est non et qu'il m'affiche ces questions à la suite (voire avec une ligne d'espace entre chaque si possible). Je n'arrive pas à trouver la formule à appliquer et c'est pourquoi je vous demande votre aide.

Bonjour,

Sans aucun élément, c'est difficile d'apporter une solution. Néanmoins, vous pouvez stocker les questions dans un tableau si la réponse est non et renvoyer la tableau dans la feuille 3 :

Sub QuestRep()

dim negations(), n%

questions = application.transpose(sheets(1).range("A1:A10")) 'questions se trouvant en A1:A10 (exemple, à adapter)

for i = lbound(questions) to ubound(questions) 'pour chaque question
    answer = msgbox(questions(i), vbyesno) 'answer stocke reponse à la msgbox
    if not answer = vbyes then 'si la reponse est autre que oui
        redim preserve negations(n) 'redimension tableau des questions à réponse négative
        negations(n) = questions(i) 'le nouvel item de negations prend la question en cours
        n = n + 1 'incrementation
    end if
next i

sheets(3).range("A1").resize(n, 1) = application.transpose(negations) 'on colle en A1 les questions à rep. negative

end sub

Cdlt,

Bonjour,

D'abord je vous remercie pour votre réponse si rapide ! J'ai essayer d'appliquer le code que vous m'avez transmis mais je galère un peu... (je suis vraiment novice). Vous avez raison c'est un peu compliqué de comprendre sans le code de base. Je vous détails donc ci-dessous un exemple du code (très simple). J'ai dans ma feuille 1 un bouton qui me permet de lancer le programme, en feuille 2 les questions et les réponses qui s'affichent (sachant que la réponse oui non se traduit par un 6 ou un 7), j'ai ajouté dans la colonne C une formule si (si b1=6;"oui";"non"). Ce que j'aimerai c'est que si une ou plusieurs réponse sont "non" alors je les affichent en feuille 3 mais sans qu'il y ai d'espace entre les questions (mon fichier de base comprend une trentaine de question)

Sub testdialogue()

Dim échange As Byte

Range("a1") = "question 1"
échange = MsgBox("questions 1 ?", vbYesNo)
Range("b1") = échange

Range("a2") = "question 2"
échange = MsgBox("question2 ?", vbYesNo)
Range("b2") = échange

Range("a3") = "question 3"
échange = MsgBox("question3 ?", vbYesNo)
Range("b3") = échange

Range("a4") = "question 4"
échange = MsgBox("question4 ?", vbYesNo)
Range("b4") = échange

Range("a5") = "question 5"
échange = MsgBox("question5 ?", vbYesNo)
Range("b5") = échange

End Sub

J'ai pensé ajouter des if dans la fonction pour qu'il m'affiche ces question en feuille 3 dans des cellules bien définies et d'ajouter à la fin du codage une formule de suppression des lignes vides du style,

On Error Resume Next
    [A:A].SpecialCells(xlCellTypeBlanks).EntireRow.Delete

mais je n'arrive pas à lui dire que cette formule s'applique à la feuille 3...

Je vous remercie sincèrement pour votre aide.

Cordialement

Bonjour GAGOU et bonne année !

Voici le code adapté aux infos transmises :

Sub QuestRep()

Dim negations(), reponses(), n%

questions = Application.Transpose(Sheets(2).Range("A1:A5")) 'tableau dynamique alimenté par A1:A5 de la feuille n°2
ReDim reponses(1 To UBound(questions)) 'redimension du tableau des réponses (même dim que questions())

For i = LBound(questions) To UBound(questions) 'pour chaque question
    reponses(i) = MsgBox(questions(i) & " ?", vbYesNo) 'item i de reponses stocke reponse à la question i
    If reponses(i) = vbNo Then 'si la reponse est non
        ReDim Preserve negations(n) 'redimension, avec préservation des valeurs, du tableau des questions à réponse négative
        negations(n) = questions(i) 'le nouvel item de negations prend la question en cours
        n = n + 1 'incrementation de n
    End If
    reponses(i) = IIf(reponses(i) = vbYes, "Oui", "Non") 'item i de reponses devient "Oui" si vaut vbyes et "Non" sinon
Next i

Sheets(2).Range("B1").Resize(UBound(reponses), 1) = Application.Transpose(reponses) 'colle reponses en B1 de feuille 2
if n > 0 then
    Sheets(3).Range("A1").Resize(n, 1) = Application.Transpose(negations) 'colle questions (à reponses negatives) en A1 de feuille 3
end if

End Sub

Il y aura peut-être encore 1 ou 2 adaptations à faire, notamment sur la façon de coller les questions à réponse négative sur la feuille 3 (il faut peut-être les coller à la suite des résultats précédents ?).

J'ai commenté du mieux que j'ai pu mais n'hésitez pas si vous avez des questions.

En revanche, je n'ai rien fait pour le second problème des cellules vides car je n'ai pas bien compris et il ne sera peut-être plus d'actualité avec cette façon de faire.

Mais, pour préciser une feuille (ce qu'il faut en principe faire à chaque fois qu'on agit sur une range), il faut faire :

Sheets("nomdelafeuille").range("refdelaplage")
'ou bien par exemple
sheets(IndexFeuille).columns(IndexColonne) 'où les index sont les numéros de position resp. de la feuille et de la colonne ciblées

Cdlt,

10gagou-qr.xlsm (21.03 Ko)

Merci 3 GB !!!!!

ça fonctionne très bien, vous venez de me faire gagner des heures voire des jours de recherches !!!!

Bonne année à vous.

Cordialement,

Rechercher des sujets similaires à "vba report questions"