Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3573 / 13646 ツリー ←次へ | 前へ→

【61314】【61303】の追記1 超初心者 09/4/25(土) 0:50 質問[未読]
【61315】Re:【61303】の追記1 Hirofumi 09/4/25(土) 5:04 発言[未読]
【61342】Re:【61303】の追記1 超初心者 09/4/28(火) 13:35 質問[未読]
【61343】Re:【61303】の追記1 超初心者 09/4/28(火) 14:04 発言[未読]
【61345】Re:【61303】の追記1 Hirofumi 09/4/28(火) 16:43 回答[未読]
【61346】Re:【61303】の追記1 Hirofumi 09/4/28(火) 16:49 回答[未読]
【61349】Re:【61303】の追記1 超初心者 09/4/29(水) 11:16 お礼[未読]

【61314】【61303】の追記1
質問  超初心者 E-MAIL  - 09/4/25(土) 0:50 -

引用なし
パスワード
   何度も質問申し訳ございません。

前回のコードを修正し、質問1は何とか表示できる様になりましたが、
質問2、3のオプションボタンを入力してしまうと
質問1が消えてしまいます。

質問1、2、3のオプションボタンを分けて表示させるコードがどのサイトを
探しても不明ですので失礼承知で質問致します。

具体的にしたい作業は質問1、2、3の答えをオプションボタンから選び、
オプションボタンをクリックし、コマンドボタンを押したら質問1,2,3の
=の横に表示させ、
各質問でオプションボタンを押さずにコマンドボタンを押した場合に★★未選択★★を表示させるコードになります。
その上でテキストボックス内をコピーするコマンドを用意すると言ったコードです。


ユーザーフォーム↓

CommandButton1_Click

質問1
1+1=
OptionButton1 OptionButton2 OptionButton3

質問2
2+2=
OptionButton4 OptionButton5 OptionButton6

質問3
3+1=
OptionButton7 OptionButton8 OptionButton9

CommandButton2_Click


↓オプションボタンを何も押さずにコマンドボックスを押した場合のテキストボックス
−−−−−−−−−−−−−−−−−−
質問1
=★★未選択★★

質問2           
=★★未選択★★                             

質問3      
=★★未選択★★
−−−−−−−−−−−−−−−−−−


↓自分で入力したコード

Private Sub CommandButton1_Click()
  Dim varType1 As Variant
  Dim varType2 As Variant
  Dim varType3 As Variant
  Dim varType4 As Variant
  Dim varType5 As Variant
  Dim varType6 As Variant
  Dim varType7 As Variant
  Dim varType8 As Variant
  Dim varType9 As Variant
 
  varType1 = Userform1.OptionButton1.Value
  varType2 = Userform1.OptionButton2.Value
  varType3 = Userform1.OptionButton3.Value
  varType4 = Userform1.OptionButton4.Value
  varType5 = Userform1.OptionButton5.Value
  varType6 = Userform1.OptionButton6.Value
  varType7 = Userform1.OptionButton7.Value
  varType8 = Userform1.OptionButton8.Value
  varType9 = Userform1.OptionButton9.Value

  If varType1 = True Then
   Userform1.TextBox1.Value = "質問1" & vbCrLf & "→" & "2"
  ElseIf varType2 = True Then
   Userform1.TextBox1.Value = "質問1" & vbCrLf & "→" & "3"
  ElseIf varType3 = True Then
   Userform1.TextBox1.Value = "質問1" & vbCrLf & "→" & "4"
  ElseIf varType4 = True Then
   Userform1.TextBox1.Value = "質問2" & vbCrLf & "→" & "4"
  ElseIf varType5 = True Then
   Userform1.TextBox1.Value = "質問2" & vbCrLf & "→" & "5"
  ElseIf varType6 = True Then
   Userform1.TextBox1.Value = "質問2" & vbCrLf & "→" & "6"
  ElseIf varType7 = True Then
   Userform1.TextBox1.Value = "質問3" & vbCrLf & "→" & "4"
  ElseIf varType8 = True Then
   Userform1.TextBox1.Value = "質問3" & vbCrLf & "→" & "5"
  ElseIf varType9 = True Then
   Userform1.TextBox1.Value = "質問3" & vbCrLf & "→" & "6"
  Else
   Userform1.TextBox1.Value = "質問1" & vbCrLf & "→" & "★★未選択★★" & vbCrLf & "質問2" & vbCrLf & "→" & "★★未選択★★" "質問3" & vbCrLf & "→" & "★★未選択★★"

  End If
  
End Sub

Private Sub CommandButton2_Click()
Set MyData = New DataObject
MyData.SetText TextBox1.Text
MyData.PutInClipboard
End Sub

【61315】Re:【61303】の追記1
発言  Hirofumi  - 09/4/25(土) 5:04 -

引用なし
パスワード
   【53117】Re:Optionbuttonのチックしていないメッセージを出す方法 
 
  Hirofumi - 07/12/16(日) 1:57 - 

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=53117;id=excel

上記の過去ログの「Private Sub CommandButton1_Click()」を
以下の様にすれば善いかも

Private Sub CommandButton1_Click()

  Dim i As Long
  
  TextBox1.Text = ""
  
  For i = 1 To 3
    TextBox1.Text = TextBox1.Text & "質問" & i & vbCrLf & " = "
    With Me.Controls("Frame" & i)
      If .Tag <> "" Then
        TextBox1.Text = TextBox1.Text & .Tag
      Else
        TextBox1.Text = TextBox1.Text & "★★未選択★★"
      End If
    End With
    TextBox1.Text = TextBox1.Text & vbCrLf
  Next i
  
End Sub

【61342】Re:【61303】の追記1
質問  超初心者  - 09/4/28(火) 13:35 -

引用なし
パスワード
   ▼Hirofumi さん:
> 【53117】Re:Optionbuttonのチックしていないメッセージを出す方法 
> 
>  Hirofumi - 07/12/16(日) 1:57 - 
>
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=53117;id=excel
>
>上記の過去ログの「Private Sub CommandButton1_Click()」を
>以下の様にすれば善いかも
>
>Private Sub CommandButton1_Click()
>
>  Dim i As Long
>  
>  TextBox1.Text = ""
>  
>  For i = 1 To 3
>    TextBox1.Text = TextBox1.Text & "質問" & i & vbCrLf & " = "
>    With Me.Controls("Frame" & i)
>      If .Tag <> "" Then
>        TextBox1.Text = TextBox1.Text & .Tag
>      Else
>        TextBox1.Text = TextBox1.Text & "★★未選択★★"
>      End If
>    End With
>    TextBox1.Text = TextBox1.Text & vbCrLf
>  Next i
>  
>End Sub


ありがとうございます。

今度はオプションボックスを選択しても選択しない場合のみの表示が出てしまいます・・・

【61343】Re:【61303】の追記1
発言  超初心者  - 09/4/28(火) 14:04 -

引用なし
パスワード
   ▼超初心者 さん:
>▼Hirofumi さん:
>> 【53117】Re:Optionbuttonのチックしていないメッセージを出す方法 
>> 
>>  Hirofumi - 07/12/16(日) 1:57 - 
>>
>>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=53117;id=excel
>>
>>上記の過去ログの「Private Sub CommandButton1_Click()」を
>>以下の様にすれば善いかも
>>
>>Private Sub CommandButton1_Click()
>>
>>  Dim i As Long
>>  
>>  TextBox1.Text = ""
>>  
>>  For i = 1 To 3
>>    TextBox1.Text = TextBox1.Text & "質問" & i & vbCrLf & " = "
>>    With Me.Controls("Frame" & i)
>>      If .Tag <> "" Then
>>        TextBox1.Text = TextBox1.Text & .Tag
>>      Else
>>        TextBox1.Text = TextBox1.Text & "★★未選択★★"
>>      End If
>>    End With
>>    TextBox1.Text = TextBox1.Text & vbCrLf
>>  Next i
>>  
>>End Sub
>
>
>ありがとうございます。
>
>今度はオプションボックスを選択しても選択しない場合のみの表示が出てしまいます・・・


Option Explicit

'Groupの値取得クラスの配列
Private clsGroup() As Class1

Private Sub UserForm_Initialize()
  
  Dim i As Long
  Dim j As Long
  
  'ClassにOptionButtonを設定
  For i = 0 To Controls.Count - 1
    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
  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


上記コードを追加するとコンパイル時に

User-Defined type not Defined

が表示されてしまいます

【61345】Re:【61303】の追記1
回答  Hirofumi  - 09/4/28(火) 16:43 -

引用なし
パスワード
   紹介した過去ログをキチント見て居ないのですね?
紹介した過去ログのコード全てが必要のなのですよ
ただし、その中の「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のコードは全く弄らないで済みます

【61346】Re:【61303】の追記1
回答  Hirofumi  - 09/4/28(火) 16:49 -

引用なし
パスワード
   オット!
ごめん、後、UserFormにTextBox1も配置する事を書き忘れました

【61349】Re:【61303】の追記1
お礼  超初心者  - 09/4/29(水) 11:16 -

引用なし
パスワード
   ▼Hirofumi さん:
>オット!
>ごめん、後、UserFormにTextBox1も配置する事を書き忘れました

hirofumi様またサポート頂いた方々

ありがとうございます。一つ一つ丁寧にご指導頂きほんとに感謝感謝です。じっくりやってみたいと思います。完成したらご報告致します。
ありがとうございました。

3573 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free