- 締切済み
Excel VBA 複数あるオプションボタンの処理
excel VBAで、複数あるグループ内のオプションボタンを、グループ別にまとめてoffにする方法を探しております。 下のcodeではsheet上のすべてのオプションボタンをoffに出来ますが、グル-プ別にしたいのです。 In ActiveSheet.グループ1.OLEObjectsみたいに(これはNGでした)。 Dim myObj As OLEObject For Each myObj In ActiveSheet.OLEObjects If myObj.progID = "Forms.OptionButton.1" Then myObj.Object.Value = False End If 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#5で >フレームというか枠はどうすべきか?の問題はある。 と、小生は書きました。 ーー しかし、やってみると、不十分だったようで、フォームの(グループ化の)Frameは、ActiveXのオプションボタン(GroupNameでグループ化を設定)のコントロール群の上にも付けられるようなので、分類的な混在が嫌でなければ、使えるようです。 グループ化の機能はどちらが優先か、混在は障害があるか(なさそうですが)などは、小生浅学でわかりません。 === 質問本題の、グループ内のコントロールのプロパティなどの一括設定の件は Sub test03() For i = 1 To 3 ' MsgBox ActiveSheet.OLEObjects(i).Name If ActiveSheet.OLEObjects(i).Name = "aa3" Or ActiveSheet.OLEObjects(i).Name = "aa1" Then ActiveSheet.OLEObjects(i).Object.Value = False 'True OK End If Next i End Sub のように ・VBAで ・ForNext(ForEachでも可能かも)で総なめして判別するならできます。 その場合グループ名で判別する。(コントロール名で判別するのと同じ方式。) ただし総称的にグループ名で捕まえるのはできないのでは。 例えば A山田君と石橋君は・・ B2年の生徒は・・ C低高学年の生徒は・・ は、日常会話では自由自在に使いますが、A⊂B⊂Cだとしても、VBAで、上位概念に、グループ名を付けたとしても、1つのグループ名を指定して、名称付加されたメンバーすべてを、つかめる仕組みではない、と思う。 VBAにはCells.Clear、DrawingObjects.Deleteのような見た目には似た例があるが、その深い仕組みは、小生浅学にしてわからない。
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。 #3の続きとして、勝手にやったことを挙げておきます。参考までに。 OptionButtonについて、コントロールがFormとActivexの両方にあるが、ActiveXの方はフレームの中に入れるのでなく、プロパティの「GroupName」で設定する。 サイズの3つの選択と男女の2選択のオプションボタンを作るれいです。 サイズ3個と男女2個は別に設定できる。 Sub Macro1() ActiveSheet.DrawingObjects.Delete cp = Array("", "L", "M", "S") MsgBox cp(1) For i = 1 To 3 Set x = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=129, Top:=39 + (i - 1) * 30, Width:=47.25, Height:=21.75) MsgBox x.Name x.Object.Caption = cp(i) x.Object.GroupName = "G1" Next i '--- sx = Array("", "男", "女") For i = 1 To 2 Set y = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=129, Top:=120 + (i - 1) * 30, Width:=47.25, Height:=21.75) y.Object.Caption = sx(i) y.Object.GroupName = "性別" Next i End Sub の ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=129, Top:=120 + (i - 1) * 30, Width:=47.25, Height:=21.75) の部分はマクロの記録で出たものを生かし、ForNextで囲って、繰り返しして、位置の数値は適当に繰り返しに適するようにした。 ーー 少し苦労したのは、プロパティでCaptionやGroupNameを設定する部分で、うまく行かなかったが、昔の経験で、「Object」というコードを入れる例を思い出して、上記のようにして目的を達成した。 しかし、フレームというか枠はどうすべきか?の問題はある。 四角図形で囲むとか、ラベルを「サイズと男女の表示部分」の「上下の間」に入れるかする必要があろう。 == 元の質問は、上記の例言えば、サイズグループや男女グループを1度でONOFFできるか、ということだった思うが、また判れば上げます。
お礼
imogasiさん 上手く別グループで発生させられました。ここまで教えて頂いたので、後は少し勉強します。 有難うございます。感謝です。
- watabe007
- ベストアンサー率62% (476/760)
>一方ActiveXにはGroup枠コントロールが有りません。 オプションボタンを右クリックで⇒プロパティで設定画面が出ませんか
お礼
watabe007さん 説明が悪かったです。 ActiveXのActionButtonはグループ群設定が出来るのですが、グループにするグループ(xyz)枠が見当たりません。 フォームコントロールのオプションボタンではなく、ActiveXのoptionButtonをグループで使いたいのです。 VBAでuserForm上のframeにoptionButtonを張れば欲しいのが出来るのですが、Excel sheet上でやりたいのです。 上手く説明できたらいいのですが・・・ お手数おかけします。
- imogasi
- ベストアンサー率27% (4737/17069)
コントロール(部品)には ・シート上におくもの ・ユーザーフォーム上に置くもの の別があって、同種の部品でも、VBAの書き方に多少の違いがあり、ややこしく、小生も、たまにしか作らないので、忘れていて、苦労する。今回もそうでした。・ユーザーフォーム上に置くもの 、が主流のようだが、質問者は前者を指定しているようだ。 また部品には、FormとActiveXと別にあってややこしい。 ・Form ・ACTIVEX の別もあり、それらでまたコードの書き方・やり方が変わる。 (他にMSーAccessもやるとさらに注意が必要。) 片方には部品の「GroupBox」があるのかな。 ーー 下記のやり方を参考にして、質問者の場合の応用や拡張をしてください。 テスト用の白紙のシートを1枚用意する。 Activeにしておく。 シートでALT+F11 標準moduleを挿入して、そこに Sub Macro1() ActiveSheet.DrawingObjects.Delete ’毎回テスト用に全部部品を削除して実行 'Exit Sub '----グループボックス作成 2個の例 ActiveSheet.GroupBoxes.Add(230, 45.75, 75, 100).Select ActiveSheet.GroupBoxes.Add(230, 160.5, 75, 90).Select '---オプションボタン作成 計5個の例 ActiveSheet.OptionButtons.Add(237, 60.75, 37, 19.5).Select ActiveSheet.OptionButtons.Add(237, 91.5, 37, 19.5).Select ActiveSheet.OptionButtons.Add(237, 123, 37, 19.5).Select '--- ActiveSheet.OptionButtons.Add(237, 170, 37, 19.5).Select ActiveSheet.OptionButtons.Add(237, 210, 37, 19.5).Select End Sub 本件ではマクロの記録がたまたま、使えるようだ。 ーー これを実行。 これでGroupBox2つと、OptionButtonを5つ作成し、OptionButtonの貼り付け位置を各グループの中に、制御して配置することによって、 ・OptionButtonの第1,2,3をGroupBoxの第1グループへ、 ・OptionButtonの第4,5をGroupBoxの第2グループに所属させた。 コントロールの位置には L=左から、T=上から、W=幅、H=高さを決める 数字を、.Add( )の括弧内にこのLTWHの順序でカンマで区切り指定するが、これをGroupBox1やGroupBox2の範囲に(特にTについて)決めれば、自動的に所属グループが決まるようで、そのグループの中でのON/OFFは他グループと独立してセットできるようになるようだ。 ー 位置をシートのセルの位置と関連させる方法は、今時刻が遅く、回答が長くなるので別にする。
お礼
imogasiさん これは知りませんでした。一つ一つオプションボタンを貼り付けてました。 先にグループを作ってその中へbuttonを置くのですね。先にbuttonを作ってしまうとすべてのbuttonがsheetのグループに所属してしまうようです。 有難うございました。
- watabe007
- ベストアンサー率62% (476/760)
オプションボタンのプロパティ GroupName にグループ名を登録 Dim myObj As OLEObject For Each myObj In ActiveSheet.OLEObjects With myObj If .progID = "Forms.OptionButton.1" And .Object.GroupName = "Group1" Then .Object.Value = False End If End With Next
お礼
watabe007さん フォームコントロールのオプションボタンでは、明示的にどのグル-プに所属するのか設定の仕方が分かりません(グループへあとからオプションボタンを落とすとそこへ所属するようですが)。 一方ActiveXにはGroup枠コントロールが有りません。 MSではUserform上でFrameを使えと出ていますが、sheet上で使いたいので、まだ本件解決してません。 書き方を変えて別稿で再度お願い致します。 でもいろいろなやり方が有ると勉強になりました。 有難うございました。
- nan93850673
- ベストアンサー率32% (179/553)
オプションボタン名の一部にグループ名(例えば"Group1")を含ませておき Dim myObj As OLEObject For Each myObj In ActiveSheet.OLEObjects If myObj.progID = "Forms.OptionButton.1" Then If myObj.Name like "*Group1*" Then myObj.Object.Value = False End If End If Next myObj と言う様にOffにしたいグループ名を含むオプションボタンのみOffにする
お礼
nan93850673さん 回答有難うございます。 やってみました。 sheet上のonのになっているbuttanが一回だけチカッと光るので、アクセスはしているようです。 でも他のグループのbuttonも光るので、グループでの選択アクセスにはなっていないようです。 頂いたcodeをhintにもう少し努力しててみます。 所で、formActiveXにはGroupと言うコンポーネントは無いのですね。 有難うございました。
お礼
igarashiさん いつもご教授有難うございます。 頂いた回答を参考にしながら、改良していきたいと思います。 今の所なんとか動いております。 有難うございました。