過去ログ

                                Page     349
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼オブジェクト変数の設定(その2)  みんと 02/11/15(金) 12:50
   ┗Re:オブジェクト変数の設定(その2)  つん 02/11/15(金) 13:21
      ┗できましたん♪  みんと 02/11/15(金) 14:06

 ───────────────────────────────────────
 ■題名 : オブジェクト変数の設定(その2)
 ■名前 : みんと
 ■日付 : 02/11/15(金) 12:50
 -------------------------------------------------------------------------
   オブジェクト変数について,もうひとつ,お願いします。

ユーザーフォームにフレームとオプションボタンがいくつかあります。
フレームをクリックしたとき,オプションボタンの選択をクリアしたいの
ですが,フレームの中にオプションボタン以外のコントロールがあると
エラーになります。

Sub Frame1_Click()
  Dim opt As MSForms.OptionButton
  Dim fra As Controls

  Set fra = UserForm1.Frame1.Controls

  For Each opt In fra
    opt.Value = False
  Next
  
End Sub

フレームの中にテキストボックスとかがあるとオプションボタンを
Falseにしたあと,最後にNEXTでエラーがでます。
(エラー13,型が違います。ってやつです。)

optはOptionButton型で宣言しているのに・・・なぜ?
For Eaceの使い方が悪いのか,Inの指定方法が悪いのか?
オプションボタン以外も見に行って,エラーになってる・・・
ような気がします?

対処法など,よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:オブジェクト変数の設定(その2)  ■名前 : つん <honey@sweetparty.ne.jp>  ■日付 : 02/11/15(金) 13:21  -------------------------------------------------------------------------
   こんにちは。
また、私で失礼します〜

>Sub Frame1_Click()
>  Dim opt As MSForms.OptionButton
>  Dim fra As Controls
>
>  Set fra = UserForm1.Frame1.Controls
>
>  For Each opt In fra
>    opt.Value = False
>  Next
>  
>End Sub
>
>optはOptionButton型で宣言しているのに・・・なぜ?
>For Eaceの使い方が悪いのか,Inの指定方法が悪いのか?
>オプションボタン以外も見に行って,エラーになってる・・・
>ような気がします?

For Each opt In fra
ここで、変数optには、順番にFrame1のコントロールが代入されていくことになります。
なので、OptionButton型にして宣言していても、例えばテキストボックスがあれば、テキストボックスも代入されてしまうので、ここで「型が違います」のエラーが出てくるのだと思います。
optを、オブジェクト型にしておいて、オプションボタンかどうかを判断させればいいかなとも思いますが、こういう場合は、私はいつもこんな感じにしています。

Private Sub Frame1_Click()

  Dim i As Long
  
  For i = 0 To Frame1.Controls.Count - 1
    If TypeName(Me.Controls(i)) = "OptionButton" Then
      Me.Controls(i).Value = False
    End If
  Next i
     
End Sub


参考にしてみてちょ♪
 ───────────────────────────────────────  ■題名 : できましたん♪  ■名前 : みんと  ■日付 : 02/11/15(金) 14:06  -------------------------------------------------------------------------
   ▼つん さん:
ふたたび,ありがとうございます〜!
(じつは,ちょっと期待してたりして。笑)

オプションボタンの判定も,トライしたことがあったのですが,今思い出すと,
最初のDimのところでオプションボタン型にしちゃってるので,
NEXTで次のコントロール(オプションボタン以外)を呼んできてエラーに
なるんですね。(たぶん)

アドバイスをちっとアレンジしてこうしてみました。

Private Sub UserForm_Click()
  Dim opt As MSForms.Control
  Dim fra As Controls
  Set fra = UserForm1.Frame1.Controls

  For Each opt In fra  
    If TypeName(opt) = "OptionButton" Then
       opt.Value = False
    End If

    'If (TypeOf opt Is MSForms.OptionButton) Then
    '  opt.Value = False
    'End If
    
  Next
End Sub

frameのクリックじゃなくってuserformのクリックにしたのは単にテストする
のにラクだったからでイミはありません。(^^;)
ちょっとカタクナにFor Eachをつかってみました。
条件文はつんさんのコードです。
コメントアウトで示した形式でもいーみたいっす。

無事,目的の動作を得ることが出来ました!
ありがとうございましたっ!!
素早い回答,重ねてお礼申し上げるっす!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 349