|
紹介した過去ログをキチント見て居ないのですね?
紹介した過去ログのコード全てが必要のなのですよ
ただし、その中の「Private Sub CommandButton1_Click()」のコードを
変更すれば使えるのではと言う事なんですがね
訳が解らなくなるといけないので、全文をUpします(少し修正も更け埋めて)
新しいBookで試して下さい
1、先ず、UserFormをプロジェクトに追加して下さい
2、そのUserFormに以下のコントロールを追加して下さい
a、CommandButton1を配置します
b、フレームFrame1を配置:Captionプロパティを「質問1」とします
Frame1の中に、OptionButton1〜3(特にOptionButton1〜3の必要は有りません)を配置します
各OptionButtonのCaptionプロパティにOptionButtonをClickした時に得たい値を設定します
c、フレームFrame2を配置:Captionプロパティを「質問2」とします
Frame2の中に、OptionButton4〜6(特にOptionButton4〜6の必要は有りません)を配置します
各OptionButtonのCaptionプロパティにOptionButtonをClickした時に得たい値を設定します
d、フレームFrame3を配置:Captionプロパティを「質問3」とします
Frame3の中に、OptionButton7〜9(特にOptionButton7〜9の必要は有りません)を配置します
各OptionButtonのCaptionプロパティにOptionButtonをClickした時に得たい値を設定します
e、CommandButton2を配置します
3、次に、UserFormのコードモジュールに以下のコードを其のまま記述します
Option Explicit
'Groupの値取得クラスの配列
Private clsGroup() As Class1
'フレームの数を格納
Private lngFrCount As Long
Private Sub UserForm_Initialize()
Dim i As Long
Dim j As Long
For i = 0 To Controls.Count - 1
'全てのOptionButtonにClassを設定
If TypeName(Controls(i)) _
= "OptionButton" Then
j = j + 1
ReDim Preserve clsGroup(1 To j)
Set clsGroup(j) = New Class1
clsGroup(j).Button = Controls(i)
End If
'フレームの数をカウント
If TypeName(Controls(i)) = "Frame" Then
lngFrCount = lngFrCount + 1
End If
Next i
End Sub
Private Sub UserForm_Terminate()
Dim i As Long
'Classを破棄
For i = 1 To UBound(clsGroup)
Set clsGroup(i) = Nothing
Next i
End Sub
Private Sub CommandButton1_Click()
Dim i As Long
Dim strResult As String
'Frame1〜3に就いて繰り返し
For i = 1 To lngFrCount
'出力用変数が""で無いなら
If strResult <> "" Then
'vbCrLf(改行コード)を追加
strResult = strResult & vbCrLf
End If
With Me.Controls("Frame" & i)
'出力用変数にFrameのCaptionと改行コードと" = "を追加
strResult = strResult & .Caption & vbCrLf & " = "
'OptionButtonが選択されている場合
If .Tag <> "" Then
'出力用変数に選択値を追加
strResult = strResult & .Tag
Else
'出力用変数に"★★未選択★★"を追加
strResult = strResult & "★★未選択★★"
End If
End With
Next i
'出力用変数をTextBox1に出力
TextBox1.Text = strResult
End Sub
4、次に、VBEのメニューから「挿入」→「クラスモジュール」を選択して
プロジェクトにClassモジュールを追加します
※初めてClassモジュールを追加した場合、
ディフォルトのオブジェクト名は「Class1」に成っています
今回はこのオブジェクト名「Class1」を使用しています
この名前が違う場合、UserFormのコードの以下の★印の「Class1」を修正して下さい
'Groupの値取得クラスの配列
Private clsGroup() As Class1 ★
For i = 0 To Controls.Count - 1
'全てのOptionButtonにClassを設定
If TypeName(Controls(i)) _
= "OptionButton" Then
j = j + 1
ReDim Preserve clsGroup(1 To j)
Set clsGroup(j) = New Class1 ★
clsGroup(j).Button = Controls(i)
5、次に、Class1のコードモジュールに以下をそのまま記述します
Option Explicit
Private WithEvents optButton As MSForms.OptionButton
Public Property Let Button(ByVal optNewValue As MSForms.OptionButton)
Set optButton = optNewValue
End Property
Private Sub Class_Terminate()
Set optButton = Nothing
End Sub
Private Sub optButton_Click()
'OptionButtonがClickされた場合、
'OptionButtonのCaptionをフレームのTagに代入
With optButton
.Parent.Tag = .Caption
End With
End Sub
6、以上が終わったら、コンパイルして保存して下さい
尚、此のコードを使用した場合質問の回答の増減、新しい質問の追加が簡単にできます
1、回答(OptionButton)を増やしたい場合
例えば、質問1に4番目のOptionButtonを増やすとすると
a、Frame1にOptionButtonを追加し
(この場合OptionButtonのオブジェクト名は構いません、OptionButton11でも可)
b、OptionButtonのCaptionプロパティを得たい値にする
2、回答(OptionButton)を減らしたい場合
例えば、質問2の2番目のOptionButtonを減らしたい場合
a、Frame2のOptionButton5を削除
3、新規の質問を作りたい場合
例えば、質問4を作りたい場合
a、UserFormにFrame4を追加(この場合、Frameのオブジェクト名は抜けの無い連番にして下さい)
b、Frame4OptionButtonを配置(OptionButtonのオブジェクト名は、構いません)
以上で、UserFormのコードは全く弄らないで済みます
|
|