PC Review


Reply
Thread Tools Rate Thread

how to design a form in Excel like this?

 
 
EMR
Guest
Posts: n/a
 
      5th Aug 2007
Dear all

I want design a questionnaire in Excel with form programming.

there are about twenty questions and one question in one form. User click
button "Next" and "back" to complete those questions.

Now, my question is how to design those forms?

insert 20 forms or insert 1 forms and others created in the code??

thanks.


 
Reply With Quote
 
 
 
 
Rick Rothstein \(MVP - VB\)
Guest
Posts: n/a
 
      5th Aug 2007
> I want design a questionnaire in Excel with form programming.
>
> there are about twenty questions and one question in one form. User click
> button "Next" and "back" to complete those questions.
>
> Now, my question is how to design those forms?
>
> insert 20 forms or insert 1 forms and others created in the code??


I wouldn't do it that way. I would use one UserForm, one Label, four
OptionButtons (I'm assuming a multiple choice test) and three
CommandButtons... and that's all. I would use arrays inside the code to
track the current question and answers and simply change what is displayed
in response to the user's actions. Here is a simple framework from which you
can build such a project. Add a UserForm to the project and place the
controls (in the numbers I indicated above) on the UserForm. Put the Label
at the top of the form, place the four OptionButtons (in numerical order
according to their default names), one under the other, beneath the Label
and place the three CommandButtons at the bottom of the form, in numerical
order according to their default names) from left to right. Finally,
copy/paste the code below my signature into the UserForm's code window.
That's it... run the UserForm and take the test. Note that for this example,
I used only 3 questions, but you should be able to see how to extend that if
you look at the layout I provided. Oh, and normally, I would store the test
questions and answer in an encrypted text file to be read in and decoded in
the UserForm's Initialize event.

Rick

Dim CurrentQuestion As Long
Dim UsersAnswers() As Long
Dim TestAnswers() As String
Dim TestQuestions() As String
Const cTotalTestQuestions = 3
Const cAnswersPerQuestion = 4

Private Sub UserForm_Initialize()
' Set up stuff for this example...
' these can be done at design time
CommandButton1.Caption = "Previous"
CommandButton2.Caption = "Next"
CommandButton3.Caption = "Done"
' Set up stuff required for the program
CurrentQuestion = 1
ReDim TestQuestions(1 To cTotalTestQuestions)
ReDim TestAnswers(1 To cTotalTestQuestions, 1 To cAnswersPerQuestion)
ReDim UsersAnswers(1 To cTotalTestQuestions)
TestQuestions(1) = "1. Which country is the largest in area?"
TestAnswers(1, 1) = "Cuba"
TestAnswers(1, 2) = "United States"
TestAnswers(1, 3) = "China"
TestAnswers(1, 4) = "Brazil"
TestQuestions(2) = "2. What is the nearest value to PI?"
TestAnswers(2, 1) = "3-1/7"
TestAnswers(2, 2) = "4*ArcTan(1)"
TestAnswers(2, 3) = "3.1416"
TestAnswers(2, 4) = "22/7"
TestQuestions(3) = "3. How many sides are in an octagon?"
TestAnswers(3, 1) = "2"
TestAnswers(3, 2) = "4"
TestAnswers(3, 3) = "6"
TestAnswers(3, 4) = "8"
Call UpdateDisplay
End Sub

Private Sub CommandButton1_Click()
Call StoreCurrentAnswer
CurrentQuestion = CurrentQuestion - 1
If CurrentQuestion = 0 Then CurrentQuestion = cTotalTestQuestions
Call UpdateDisplay
End Sub

Private Sub CommandButton2_Click()
Call StoreCurrentAnswer
CurrentQuestion = CurrentQuestion + 1
If CurrentQuestion = cTotalTestQuestions + 1 Then CurrentQuestion = 1
Call UpdateDisplay
End Sub

Private Sub CommandButton3_Click()
Dim X As Long
Dim Answer As Long
Dim Message As String
Call StoreCurrentAnswer
Answer = MsgBox("Have you reviewed your answers and are you " & _
"satisfied with them?", vbYesNo, "Test Completed?")
If Answer = vbYes Then
CommandButton1.Enabled = False
CommandButton2.Enabled = False
' Here I am simply displaying the answers. You,
' of course, would score the test at this point.
For X = 1 To cTotalTestQuestions
If UsersAnswers(X) = 0 Then
Message = Message & "Question " & CStr(X) & ": <<BLANK>>"
Else
Message = Message & "Question " & CStr(X) & ": " & _
TestAnswers(X, UsersAnswers(X))
End If
If X < cTotalTestQuestions Then Message = Message & vbNewLine
Next
MsgBox Message
Unload Me
End If
End Sub

Sub StoreCurrentAnswer()
Dim X As Long
For X = 1 To cAnswersPerQuestion
If Controls("OptionButton" & CStr(X)).Value = True Then
UsersAnswers(CurrentQuestion) = CLng(Right$(Controls( _
"OptionButton" & CStr(X)).Name, 1))
Exit For
End If
Next
End Sub

Sub UpdateDisplay()
Dim X As Long
If UsersAnswers(CurrentQuestion) = 0 Then
For X = 1 To cAnswersPerQuestion
Controls("OptionButton" & CStr(X)).Value = False
Next
Else
Controls("OptionButton" & CStr(UsersAnswers( _
CurrentQuestion))).Value = True
End If
Label1.Caption = TestQuestions(CurrentQuestion)
For X = 1 To cAnswersPerQuestion
Controls("OptionButton" & CStr(X)).Caption = _
TestAnswers(CurrentQuestion, X)
Next
End Sub

 
Reply With Quote
 
EMR
Guest
Posts: n/a
 
      5th Aug 2007
thanks Rick!
it's very kind help.

and, as I told, it's for a customer survey project.
and customers will complete this form in separate PCs.

So I would like to store the questions and answers in the spreadsheets.
at the end of this project, I'll collect those spreadsheets to my PC and
employ ADO (this module is embedded in the spreadsheets) to transfer those
data to the Access database.

yes, you suggest to store the questions and answers in an encrypted text
file.
It seems clearer in the system structure.
So, it raises new question:
1) sorry, I don't know what's an encrypted text file? could you kindly
please give me a simple example?
2) use vba to read & write & delete & modify this file both in Excel and
Access. (I only have the experience of ADO)
3) my questions are not one by one, it means the next question is determined
by the previous answer.
in other words, every defined answer has an important attribute: the
index of next question.
could an encrypted text file handle such a table??

thanks for your attention

GF Dong

"Rick Rothstein (MVP - VB)" <(E-Mail Removed)>
??????:%(E-Mail Removed)...
>> I want design a questionnaire in Excel with form programming.
>>
>> there are about twenty questions and one question in one form. User click
>> button "Next" and "back" to complete those questions.
>>
>> Now, my question is how to design those forms?
>>
>> insert 20 forms or insert 1 forms and others created in the code??

>
> I wouldn't do it that way. I would use one UserForm, one Label, four
> OptionButtons (I'm assuming a multiple choice test) and three
> CommandButtons... and that's all. I would use arrays inside the code to
> track the current question and answers and simply change what is displayed
> in response to the user's actions. Here is a simple framework from which
> you can build such a project. Add a UserForm to the project and place the
> controls (in the numbers I indicated above) on the UserForm. Put the Label
> at the top of the form, place the four OptionButtons (in numerical order
> according to their default names), one under the other, beneath the Label
> and place the three CommandButtons at the bottom of the form, in numerical
> order according to their default names) from left to right. Finally,
> copy/paste the code below my signature into the UserForm's code window.
> That's it... run the UserForm and take the test. Note that for this
> example, I used only 3 questions, but you should be able to see how to
> extend that if you look at the layout I provided. Oh, and normally, I
> would store the test questions and answer in an encrypted text file to be
> read in and decoded in the UserForm's Initialize event.
>
> Rick
>
> Dim CurrentQuestion As Long
> Dim UsersAnswers() As Long
> Dim TestAnswers() As String
> Dim TestQuestions() As String
> Const cTotalTestQuestions = 3
> Const cAnswersPerQuestion = 4
>
> Private Sub UserForm_Initialize()
> ' Set up stuff for this example...
> ' these can be done at design time
> CommandButton1.Caption = "Previous"
> CommandButton2.Caption = "Next"
> CommandButton3.Caption = "Done"
> ' Set up stuff required for the program
> CurrentQuestion = 1
> ReDim TestQuestions(1 To cTotalTestQuestions)
> ReDim TestAnswers(1 To cTotalTestQuestions, 1 To cAnswersPerQuestion)
> ReDim UsersAnswers(1 To cTotalTestQuestions)
> TestQuestions(1) = "1. Which country is the largest in area?"
> TestAnswers(1, 1) = "Cuba"
> TestAnswers(1, 2) = "United States"
> TestAnswers(1, 3) = "China"
> TestAnswers(1, 4) = "Brazil"
> TestQuestions(2) = "2. What is the nearest value to PI?"
> TestAnswers(2, 1) = "3-1/7"
> TestAnswers(2, 2) = "4*ArcTan(1)"
> TestAnswers(2, 3) = "3.1416"
> TestAnswers(2, 4) = "22/7"
> TestQuestions(3) = "3. How many sides are in an octagon?"
> TestAnswers(3, 1) = "2"
> TestAnswers(3, 2) = "4"
> TestAnswers(3, 3) = "6"
> TestAnswers(3, 4) = "8"
> Call UpdateDisplay
> End Sub
>
> Private Sub CommandButton1_Click()
> Call StoreCurrentAnswer
> CurrentQuestion = CurrentQuestion - 1
> If CurrentQuestion = 0 Then CurrentQuestion = cTotalTestQuestions
> Call UpdateDisplay
> End Sub
>
> Private Sub CommandButton2_Click()
> Call StoreCurrentAnswer
> CurrentQuestion = CurrentQuestion + 1
> If CurrentQuestion = cTotalTestQuestions + 1 Then CurrentQuestion = 1
> Call UpdateDisplay
> End Sub
>
> Private Sub CommandButton3_Click()
> Dim X As Long
> Dim Answer As Long
> Dim Message As String
> Call StoreCurrentAnswer
> Answer = MsgBox("Have you reviewed your answers and are you " & _
> "satisfied with them?", vbYesNo, "Test Completed?")
> If Answer = vbYes Then
> CommandButton1.Enabled = False
> CommandButton2.Enabled = False
> ' Here I am simply displaying the answers. You,
> ' of course, would score the test at this point.
> For X = 1 To cTotalTestQuestions
> If UsersAnswers(X) = 0 Then
> Message = Message & "Question " & CStr(X) & ": <<BLANK>>"
> Else
> Message = Message & "Question " & CStr(X) & ": " & _
> TestAnswers(X, UsersAnswers(X))
> End If
> If X < cTotalTestQuestions Then Message = Message & vbNewLine
> Next
> MsgBox Message
> Unload Me
> End If
> End Sub
>
> Sub StoreCurrentAnswer()
> Dim X As Long
> For X = 1 To cAnswersPerQuestion
> If Controls("OptionButton" & CStr(X)).Value = True Then
> UsersAnswers(CurrentQuestion) = CLng(Right$(Controls( _
> "OptionButton" & CStr(X)).Name, 1))
> Exit For
> End If
> Next
> End Sub
>
> Sub UpdateDisplay()
> Dim X As Long
> If UsersAnswers(CurrentQuestion) = 0 Then
> For X = 1 To cAnswersPerQuestion
> Controls("OptionButton" & CStr(X)).Value = False
> Next
> Else
> Controls("OptionButton" & CStr(UsersAnswers( _
> CurrentQuestion))).Value = True
> End If
> Label1.Caption = TestQuestions(CurrentQuestion)
> For X = 1 To cAnswersPerQuestion
> Controls("OptionButton" & CStr(X)).Caption = _
> TestAnswers(CurrentQuestion, X)
> Next
> End Sub



 
Reply With Quote
 
Rick Rothstein \(MVP - VB\)
Guest
Posts: n/a
 
      5th Aug 2007
When I mentioned the encryption, I was (for some reason) thinking this might
be a test questionnaire where it would be necessary to keep the questions
and possible answer a secret before hand (unencrypted text can usually be
read from an EXE file in a plain text viewer program such as Notepad).
However, as I now see it, this is a simple customer questionnaire where
secrecy is not important. Given that, you can forget about my suggestion
regarding encryption. However, if you are still interested in "what it is",
then a Google search on the word 'encryption' should help.

I would still use an approach similar to the one I laid out for your forms
and control... there is no need to load up 20 different forms and attendant
controls just to present 20 questions to a user.

Rick



"EMR" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> thanks Rick!
> it's very kind help.
>
> and, as I told, it's for a customer survey project.
> and customers will complete this form in separate PCs.
>
> So I would like to store the questions and answers in the spreadsheets.
> at the end of this project, I'll collect those spreadsheets to my PC and
> employ ADO (this module is embedded in the spreadsheets) to transfer those
> data to the Access database.
>
> yes, you suggest to store the questions and answers in an encrypted text
> file.
> It seems clearer in the system structure.
> So, it raises new question:
> 1) sorry, I don't know what's an encrypted text file? could you kindly
> please give me a simple example?
> 2) use vba to read & write & delete & modify this file both in Excel and
> Access. (I only have the experience of ADO)
> 3) my questions are not one by one, it means the next question is
> determined by the previous answer.
> in other words, every defined answer has an important attribute: the
> index of next question.
> could an encrypted text file handle such a table??
>
> thanks for your attention
>
> GF Dong
>
> "Rick Rothstein (MVP - VB)" <(E-Mail Removed)>
> ??????:%(E-Mail Removed)...
>>> I want design a questionnaire in Excel with form programming.
>>>
>>> there are about twenty questions and one question in one form. User
>>> click button "Next" and "back" to complete those questions.
>>>
>>> Now, my question is how to design those forms?
>>>
>>> insert 20 forms or insert 1 forms and others created in the code??

>>
>> I wouldn't do it that way. I would use one UserForm, one Label, four
>> OptionButtons (I'm assuming a multiple choice test) and three
>> CommandButtons... and that's all. I would use arrays inside the code to
>> track the current question and answers and simply change what is
>> displayed in response to the user's actions. Here is a simple framework
>> from which you can build such a project. Add a UserForm to the project
>> and place the controls (in the numbers I indicated above) on the
>> UserForm. Put the Label at the top of the form, place the four
>> OptionButtons (in numerical order according to their default names), one
>> under the other, beneath the Label and place the three CommandButtons at
>> the bottom of the form, in numerical order according to their default
>> names) from left to right. Finally, copy/paste the code below my
>> signature into the UserForm's code window. That's it... run the UserForm
>> and take the test. Note that for this example, I used only 3 questions,
>> but you should be able to see how to extend that if you look at the
>> layout I provided. Oh, and normally, I would store the test questions and
>> answer in an encrypted text file to be read in and decoded in the
>> UserForm's Initialize event.
>>
>> Rick
>>
>> Dim CurrentQuestion As Long
>> Dim UsersAnswers() As Long
>> Dim TestAnswers() As String
>> Dim TestQuestions() As String
>> Const cTotalTestQuestions = 3
>> Const cAnswersPerQuestion = 4
>>
>> Private Sub UserForm_Initialize()
>> ' Set up stuff for this example...
>> ' these can be done at design time
>> CommandButton1.Caption = "Previous"
>> CommandButton2.Caption = "Next"
>> CommandButton3.Caption = "Done"
>> ' Set up stuff required for the program
>> CurrentQuestion = 1
>> ReDim TestQuestions(1 To cTotalTestQuestions)
>> ReDim TestAnswers(1 To cTotalTestQuestions, 1 To cAnswersPerQuestion)
>> ReDim UsersAnswers(1 To cTotalTestQuestions)
>> TestQuestions(1) = "1. Which country is the largest in area?"
>> TestAnswers(1, 1) = "Cuba"
>> TestAnswers(1, 2) = "United States"
>> TestAnswers(1, 3) = "China"
>> TestAnswers(1, 4) = "Brazil"
>> TestQuestions(2) = "2. What is the nearest value to PI?"
>> TestAnswers(2, 1) = "3-1/7"
>> TestAnswers(2, 2) = "4*ArcTan(1)"
>> TestAnswers(2, 3) = "3.1416"
>> TestAnswers(2, 4) = "22/7"
>> TestQuestions(3) = "3. How many sides are in an octagon?"
>> TestAnswers(3, 1) = "2"
>> TestAnswers(3, 2) = "4"
>> TestAnswers(3, 3) = "6"
>> TestAnswers(3, 4) = "8"
>> Call UpdateDisplay
>> End Sub
>>
>> Private Sub CommandButton1_Click()
>> Call StoreCurrentAnswer
>> CurrentQuestion = CurrentQuestion - 1
>> If CurrentQuestion = 0 Then CurrentQuestion = cTotalTestQuestions
>> Call UpdateDisplay
>> End Sub
>>
>> Private Sub CommandButton2_Click()
>> Call StoreCurrentAnswer
>> CurrentQuestion = CurrentQuestion + 1
>> If CurrentQuestion = cTotalTestQuestions + 1 Then CurrentQuestion = 1
>> Call UpdateDisplay
>> End Sub
>>
>> Private Sub CommandButton3_Click()
>> Dim X As Long
>> Dim Answer As Long
>> Dim Message As String
>> Call StoreCurrentAnswer
>> Answer = MsgBox("Have you reviewed your answers and are you " & _
>> "satisfied with them?", vbYesNo, "Test Completed?")
>> If Answer = vbYes Then
>> CommandButton1.Enabled = False
>> CommandButton2.Enabled = False
>> ' Here I am simply displaying the answers. You,
>> ' of course, would score the test at this point.
>> For X = 1 To cTotalTestQuestions
>> If UsersAnswers(X) = 0 Then
>> Message = Message & "Question " & CStr(X) & ": <<BLANK>>"
>> Else
>> Message = Message & "Question " & CStr(X) & ": " & _
>> TestAnswers(X, UsersAnswers(X))
>> End If
>> If X < cTotalTestQuestions Then Message = Message & vbNewLine
>> Next
>> MsgBox Message
>> Unload Me
>> End If
>> End Sub
>>
>> Sub StoreCurrentAnswer()
>> Dim X As Long
>> For X = 1 To cAnswersPerQuestion
>> If Controls("OptionButton" & CStr(X)).Value = True Then
>> UsersAnswers(CurrentQuestion) = CLng(Right$(Controls( _
>> "OptionButton" & CStr(X)).Name, 1))
>> Exit For
>> End If
>> Next
>> End Sub
>>
>> Sub UpdateDisplay()
>> Dim X As Long
>> If UsersAnswers(CurrentQuestion) = 0 Then
>> For X = 1 To cAnswersPerQuestion
>> Controls("OptionButton" & CStr(X)).Value = False
>> Next
>> Else
>> Controls("OptionButton" & CStr(UsersAnswers( _
>> CurrentQuestion))).Value = True
>> End If
>> Label1.Caption = TestQuestions(CurrentQuestion)
>> For X = 1 To cAnswersPerQuestion
>> Controls("OptionButton" & CStr(X)).Caption = _
>> TestAnswers(CurrentQuestion, X)
>> Next
>> End Sub

>
>


 
Reply With Quote
 
 
 
Reply

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Form design - Best design method for large number of fields KM Microsoft Access Forms 0 11th Feb 2009 07:45 PM
Design a Form for Excel =?Utf-8?B?R3JhbmRNYU1h?= Microsoft Excel Programming 0 26th Jun 2007 08:02 PM
Form design using Excel VBA skulkrinbait@googlemail.com Microsoft Excel Programming 2 25th Jul 2006 11:28 AM
Office2003 design access form for excel list =?Utf-8?B?VG9ueU8=?= Microsoft Access Security 0 19th Jan 2006 04:46 AM
Table Design / Form design - How to manage vertical structures Qhalis Microsoft Access Forms 1 11th Dec 2003 08:02 PM


Features
 

Advertising
 

Newsgroups
 


All times are GMT +1. The time now is 07:41 PM.