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 subCdlt,
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 SubJ'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.Deletemais 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 SubIl 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éesCdlt,
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,