Excel VBA質問箱 IV

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

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


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

【4844】オプションボタンについて ishy 03/4/10(木) 12:55 質問
【4846】Re:オプションボタンについて つん 03/4/10(木) 13:36 回答
【4848】Re:オプションボタンについて つん 03/4/10(木) 14:19 回答
【4865】Re:オプションボタンについて ishy 03/4/11(金) 10:23 質問
【4866】ごめんなさい(>_<) つん 03/4/11(金) 10:37 回答
【4867】Re:ありがとうございます。 ishy 03/4/11(金) 10:44 お礼

【4844】オプションボタンについて
質問  ishy E-MAIL  - 03/4/10(木) 12:55 -

引用なし
パスワード
   みんさんこんにちは。
さっそくですが、オプションボタンについての質問です。

オプションボタンが複数個あります。(ここでは2個とします。実際は
15個ほどです)
オプションボタン1を押すとオプションボタン1のbackcolorに色がつきます。
オプションボタン2にはつきません。
オプションボタン2を押すとオプションボタン2のbackcolorに色がつきます。
オプションボタン1にはつきません。

現在は
Private Sub OptionButton1_Click()
'オプションボタン
 For i = 1 To 2
  If i = 1 Then
  With Controls("OptionButton" & i)
    .Value = True
    .BackColor = RGB(176, 196, 222)
    .BackStyle = 1
  End With
  Else
  With Controls("OptionButton" & i)
    .Value = False
    .BackStyle = 0
  End With
  End If
 Next i
End Sub
このように書いていますが、これを15個も
書くと、同じようなコードがたくさんできてしまいます。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=848;id=excel
を参考にして、クラスモジュールでやってみようかと思いましたが
うまくいきません。

短くてすむ書き方があれば教えて下さい。
宜しくお願いします。

【4846】Re:オプションボタンについて
回答  つん E-MAIL  - 03/4/10(木) 13:36 -

引用なし
パスワード
   ▼ishy さん、こんにちは

クラスでも出来るかもしれませんが・・・(あとで考えてみよ)
とりあえず、こんな方法はどうですか?
サブルーチンにして・・・

Sub test(k As Long)

  Dim i As Long

 For i = 1 To 15
  If i = k Then
  With Controls("OptionButton" & i)
    .Value = True
    .BackColor = RGB(176, 196, 222)
    .BackStyle = 1
  End With
  Else
  With Controls("OptionButton" & i)
    .Value = False
    .BackStyle = 0
  End With
  End If
 Next i

End Sub

Private Sub OptionButton1_Click()

  Call test(1)

End Sub

↑この部分は、15個分書かないとだめですが、1行だけなんで、だいぶマシでしょう?ダメ?

クラスでもちょっと考えてみます。
・・・考える間に、誰か回答してくれるかもしれんけど・・・
私のはあてにせんといてなー(^^;

【4848】Re:オプションボタンについて
回答  つん E-MAIL  - 03/4/10(木) 14:19 -

引用なし
パスワード
   クラスで考えてみました。

'**クラスモジュール****************************************
Private WithEvents pr_optButton As MSForms.OptionButton

'==============================================
Public Property Get myButton() As MSForms.OptionButton
  Set myButton = pr_optButton
End Property

'==============================================
Public Property Let myButton(ByVal optNew As MSForms.OptionButton)
  Set pr_optButton = optNew
End Property

'==============================================
Private Sub Class_Terminate()
  Set pr_optButton = Nothing
End Sub

'==============================================
Private Sub pr_optButton_Change()
  With pr_optButton
    If .Value = True Then
      .BackColor = RGB(176, 196, 222)
      .BackStyle = 1
    Else
      .BackStyle = 0
    End If
  End With
End Sub

'**フォームモジュール****************************************
Private clsButton(15) As clsTest

'==============================================
Private Sub UserForm_Initialize()

  Dim i As Long
  For i = 1 To 4
    Set clsButton(i) = New clsTest
    clsButton(i).myButton = Me.Controls("OptionButton" & i)
  Next i
  
End Sub

'==============================================
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

  Dim i As Long
  
  For i = 1 To 4
    Set clsButton(i) = Nothing
  nexti

End Sub

どないでしょう?

【4865】Re:オプションボタンについて
質問  ishy E-MAIL  - 03/4/11(金) 10:23 -

引用なし
パスワード
   ▼つん さん:
さっそくのお返事ありがとうございます!
1回目の回答←コールで呼び出すようにすれば、少しは書く量が減るのですね。
       勉強になりました。
今回の回答←私の方ではうまくいきませんでした。(涙)


>'**フォームモジュール****************************************
>Private clsButton(15) As clsTest
この1文に対して「ユーザー定義型は定義されていません」とデバッグ
の段階ででます。置き場所は、Declarationsで宜しいのでしょうか。
後(15)の15はオプションボタンのボタンの数でいいのでしょうか。
  
>  For i = 1 To 4
>    Set clsButton(i) = Nothing
>  nexti
>
後このiでで表している4もオプションボタンの数ということでいいのでしょうか。

すいませんが教えて下さい。
宜しくお願いします。

【4866】ごめんなさい(>_<)
回答  つん E-MAIL  - 03/4/11(金) 10:37 -

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

大ちょんぼをかましてしまってました。
ishyさんとこで、上手く行かないのは私のちょんぼ&雑な回答のせいですー。
すみません(T_T)

>>'**フォームモジュール****************************************
>>Private clsButton(15) As clsTest
>この1文に対して「ユーザー定義型は定義されていません」とデバッグ
>の段階ででます。置き場所は、Declarationsで宜しいのでしょうか。
>後(15)の15はオプションボタンのボタンの数でいいのでしょうか。

「ユーザー定義型は定義されていません」というのは、クラス名の問題だと思います。
クラスモジュールの「オブジェクト名」を「clsTest」に変えてください。
デフォルトでは、「class1」になってると思います。
このへん、ちゃんと説明しなくてすみませんでした。
置き場所は、DeclarationsでOKです。

clsButton(15) の「15」は確かにオプションボタンの数なんですけど、
配列の最小値は「0」からなんで、これでは「16個」分になってしまいますね。
clsButton(1 to 15) としてください。

>>  For i = 1 To 4
>>    Set clsButton(i) = Nothing
>>  nexti
>>
>後このiでで表している4もオプションボタンの数ということでいいのでしょうか。

すんません。これは、私がテスト的に作ったときに、オプションボタンを4個作成して作ったからです。
なので、For i = 1 To 15 に変更してください。
変数の宣言部分と、この部分がちぐはぐだったので、よけいに混乱させたと思います。
ごめんしゃい(>_<)

UserForm_QueryClose のところも同じように直してくださいね。

【4867】Re:ありがとうございます。
お礼  ishy E-MAIL  - 03/4/11(金) 10:44 -

引用なし
パスワード
   ▼つん さん:
本当にありがとうございます。

わかりやすくて丁寧な解説で、とっても理解ができました。
おかげさまで、やりたかったことができてとても幸せです。

ありがとうございました。
またの機会がありましたら宜しくお願いします!

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