Excel VBA質問箱 IV

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

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


4997 / 13644 ツリー ←次へ | 前へ→

【53115】Optionbuttonのチックしていないメッセージを出す方法 Yoshida 07/12/15(土) 21:08 質問[未読]
【53116】Re:Optionbuttonのチックしていないメッセ... bykin 07/12/16(日) 0:04 回答[未読]
【53121】Re:Optionbuttonのチックしていないメッセ... Yoshida 07/12/16(日) 11:08 質問[未読]
【53129】Re:Optionbuttonのチックしていないメッセ... りん 07/12/16(日) 15:58 発言[未読]
【53130】Re:Optionbuttonのチックしていないメッセ... bykin 07/12/16(日) 16:41 回答[未読]
【53151】Re:Optionbuttonのチックしていないメッセ... Yoshida 07/12/17(月) 19:04 お礼[未読]
【53167】Re:Optionbuttonのチックしていないメッセ... りん 07/12/18(火) 8:07 発言[未読]
【53187】Re:Optionbuttonのチックしていないメッセ... Yoshida 07/12/19(水) 7:18 お礼[未読]
【53117】Re:Optionbuttonのチックしていないメッセ... Hirofumi 07/12/16(日) 1:57 発言[未読]

【53115】Optionbuttonのチックしていないメッセー...
質問  Yoshida  - 07/12/15(土) 21:08 -

引用なし
パスワード
   フォーム上に
OptionButtonを3ヶ作成し
コマンドボタンで選択されているOptionbuttonのチェックをさせて
います。
しかし、Optionbuttonを選択せずコマンドボタンを押すと、
「選択されていません」とMsgboxで出そうとしましたが、
美味く行きません。アドバイスお願いいただけませんでしょうか。

Private Sub commandbutton1_click()
  Dim i As Long
  For i = 1 To 3
   If Controls("optionbutton" & i).Value Then
     MsgBox "OptionButtonの" & Chr(10) & _
         "Groupe1の" & i & "が選択されています"
     Exit For
     End If
   Next
End Sub

【53116】Re:Optionbuttonのチックしていないメッ...
回答  bykin  - 07/12/16(日) 0:04 -

引用なし
パスワード
   こんばんわ。

変数をもう1個用意して、こんな感じ?

Private Sub CommandButton1_Click()
  Dim Flg As Long
  Dim i As Long
  For i = 1 To 3
    If Me.Controls("OptionButton" & i).Value Then
      Flg = i
      Exit For
    End If
  Next
  If Flg = 0 Then
    MsgBox "OptionButonが選択されていません"
  Else
    MsgBox "OptionButon" & Flg & "が選択されています"
  End If
End Sub

試してみてな。
ほな。

【53117】Re:Optionbuttonのチックしていないメッ...
発言  Hirofumi  - 07/12/16(日) 1:57 -

引用なし
パスワード
   UserFormに、OptionButtonで選択するグループが複数有る場合なんか
こんな事をすると楽かも?

例えば、UserFormに、Frame1が有り、その中にOptionButton1〜OptionButton3
Frame2が有り、その中にOptionButton4〜OptionButton6が有るとします

UserFormのコードモジュルールに記述

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

Private Sub CommandButton1_Click()

  With Frame1
    If .Tag<>"" then
      MsgBox .Caption & "Groupの" & .Tag & "が選択されています"
    Else
      MsgBox .Caption & "GroupのOptionが選択されていません"
    End if
  End With
  
  With Frame2
    If .Tag<>"" then
      MsgBox .Caption & "Groupの" & .Tag & "が選択されています"
    Else
      MsgBox .Caption & "GroupのOptionが選択されていません"
    End if
  End With
    
End Sub

VBEの「挿入」→「Classモジュール」でClassモジュールを追加し
Classモジュールの名前を「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


上記のコードでは、OptionButtonが選択されると、
選択されたOptionButtonの有るFrameのTagに、選択されたOptionButtonのCaptionが代入されますので、
FrameのTagを調べ、Tagが""の場合OptionButtonが選択がされていず、
Tagが""でないなら、OptionButtonが選択がされている事に成ります

【53121】Re:Optionbuttonのチックしていないメッ...
質問  Yoshida  - 07/12/16(日) 11:08 -

引用なし
パスワード
   ▼bykin さん:

>変数をもう1個用意して、こんな感じ?
変数を増やすアイディアが出ませんでした。
またflgを思いついたのですが、TrueとFalseのBooleanで試したのですが、
美味く動作しませんでした。flgをlongでしかも変数処理には感激しました。
大変勉強になりました。

あと一点教えてください。
全く同じような構文で、bykinさんのアドバイスをまねて
作成した下のコードが、又正確な動作をしません。
アドバイスをお願いします。
今回のflgはBooleanで良いと判断したのですが・・・

Private Sub CommandButton5_Click()
  Dim c As Object, buf As String, flg As Boolean
  For Each c In Controls
    If Left(c.Name, 12) = "OptionButton" Then
      If c.Value Then buf = buf & c.Caption & vbCrLf
      flg = True
     Exit For
    End If
  Next c
  If flg = False Then
    MsgBox "オンないです"
  Else
    MsgBox buf & "がオンです"
  End If
End Sub

【53129】Re:Optionbuttonのチックしていないメッ...
発言  りん E-MAIL  - 07/12/16(日) 15:58 -

引用なし
パスワード
   Yoshida さん、こんにちわ。

>全く同じような構文で、bykinさんのアドバイスをまねて
>作成した下のコードが、又正確な動作をしません。

>Private Sub CommandButton5_Click()
>  Dim c As Object, buf As String, flg As Boolean
'↓コレを追加してみてください
flg = False

>  For Each c In Controls
>    If Left(c.Name, 12) = "OptionButton" Then
>      If c.Value Then buf = buf & c.Caption & vbCrLf
>      flg = True
>     Exit For
>    End If
>  Next c
>  If flg = False Then
>    MsgBox "オンないです"
>  Else
>    MsgBox buf & "がオンです"
>  End If
>End Sub

また、
  If buf = "" Then
    MsgBox "オンないです"
  Else
    MsgBox buf & "がオンです"
  End If
これでもいいかも。

【53130】Re:Optionbuttonのチックしていないメッ...
回答  bykin  - 07/12/16(日) 16:41 -

引用なし
パスワード
   こんにちわ。

>全く同じような構文で、bykinさんのアドバイスをまねて
>作成した下のコードが、又正確な動作をしません。

Exit For の位置がおかしいんですわ。
↓これでどーでっか?

Private Sub CommandButton1_Click()
  Dim c As Object
  Dim Buf As String
  Dim Flg As Boolean

  For Each c In Me.Controls
    If TypeName(c) = "OptionButton" Then
      If c.Value Then
        Buf = c.Caption
        Flg = True
        Exit For
      End If
    End If
  Next c
  If Not Flg Then
    MsgBox "未選択です"
  Else
    MsgBox Buf & vbCrLf & "が選択されています"
  End If
End Sub

コードのインデント(字下げ)をきちんとやらんと、こういうミスしまっせ。
気ぃつけておくれやす。

ほな。

【53151】Re:Optionbuttonのチックしていないメッ...
お礼  Yoshida  - 07/12/17(月) 19:04 -

引用なし
パスワード
   ▼りん さん:

今晩は。
有難うございました。
この方法はうまくいきませんでしたが・・・
>'↓コレを追加してみてください
>flg = False

この方法はうまくいきました。
>  If buf = "" Then
>    MsgBox "オンないです"
>  Else
>    MsgBox buf & "がオンです"
>  End If

flgで何とか?っと思いましたが、色々しましたが
残念ながら、正しく動作しませんでした。
でも、有難うございました。

【53167】Re:Optionbuttonのチックしていないメッ...
発言  りん E-MAIL  - 07/12/18(火) 8:07 -

引用なし
パスワード
   Yoshida さん、おはようございます。

>flgで何とか?っと思いましたが、色々しましたが
>残念ながら、正しく動作しませんでした。

bykinさんが「Exit Forの位置がおかしい」と書いておられたので、それとコラボで。
Private Sub CommandButton1_Click()
  Dim c As Object
  Dim Buf As String
  Dim Flg As Boolean

  Flg = False
  For Each c In Me.Controls
    If TypeName(c) = "OptionButton" Then
      If c.Value Then
        Buf = c.Caption
        Flg = True
        Exit For '分岐の中に入れないと1回目で抜けちゃいます
      End If
    End If
  Next c
  If Not Flg Then
    MsgBox "未選択です"
  Else
    MsgBox Buf & vbCrLf & "が選択されています"
  End If
End Sub

【53187】Re:Optionbuttonのチックしていないメッ...
お礼  Yoshida  - 07/12/19(水) 7:18 -

引用なし
パスワード
   ▼りん さん:
Yoshida です、おはようございます。
回答を寄せていただいていた事を知りました。遅くなりました。
おかげさまでFlgの使い方に少しは理解が深まりました。
これから大いに活用したいと思います。
flgの入れる位置を認識することですね。

bykin さん:
お世話になりました。今後ともよろしくお願いします。

Hirofumiさん:
長文有難うございました。
私にはちょっと難解でした。これからもよろしくお願いします。

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