• 締切済み

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 宜しくお願い致します。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#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のような見た目には似た例があるが、その深い仕組みは、小生浅学にしてわからない。

Kumasan2016
質問者

お礼

igarashiさん いつもご教授有難うございます。 頂いた回答を参考にしながら、改良していきたいと思います。 今の所なんとか動いております。 有難うございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

#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できるか、ということだった思うが、また判れば上げます。

Kumasan2016
質問者

お礼

imogasiさん 上手く別グループで発生させられました。ここまで教えて頂いたので、後は少し勉強します。 有難うございます。感謝です。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

>一方ActiveXにはGroup枠コントロールが有りません。 オプションボタンを右クリックで⇒プロパティで設定画面が出ませんか

Kumasan2016
質問者

お礼

watabe007さん 説明が悪かったです。  ActiveXのActionButtonはグループ群設定が出来るのですが、グループにするグループ(xyz)枠が見当たりません。 フォームコントロールのオプションボタンではなく、ActiveXのoptionButtonをグループで使いたいのです。 VBAでuserForm上のframeにoptionButtonを張れば欲しいのが出来るのですが、Excel sheet上でやりたいのです。 上手く説明できたらいいのですが・・・ お手数おかけします。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

コントロール(部品)には ・シート上におくもの ・ユーザーフォーム上に置くもの の別があって、同種の部品でも、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は他グループと独立してセットできるようになるようだ。 ー 位置をシートのセルの位置と関連させる方法は、今時刻が遅く、回答が長くなるので別にする。

Kumasan2016
質問者

お礼

imogasiさん これは知りませんでした。一つ一つオプションボタンを貼り付けてました。 先にグループを作ってその中へbuttonを置くのですね。先にbuttonを作ってしまうとすべてのbuttonがsheetのグループに所属してしまうようです。 有難うございました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

オプションボタンのプロパティ 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

Kumasan2016
質問者

お礼

watabe007さん フォームコントロールのオプションボタンでは、明示的にどのグル-プに所属するのか設定の仕方が分かりません(グループへあとからオプションボタンを落とすとそこへ所属するようですが)。 一方ActiveXにはGroup枠コントロールが有りません。 MSではUserform上でFrameを使えと出ていますが、sheet上で使いたいので、まだ本件解決してません。 書き方を変えて別稿で再度お願い致します。 でもいろいろなやり方が有ると勉強になりました。 有難うございました。

回答No.1

オプションボタン名の一部にグループ名(例えば"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にする

Kumasan2016
質問者

お礼

nan93850673さん 回答有難うございます。 やってみました。 sheet上のonのになっているbuttanが一回だけチカッと光るので、アクセスはしているようです。 でも他のグループのbuttonも光るので、グループでの選択アクセスにはなっていないようです。 頂いたcodeをhintにもう少し努力しててみます。 所で、formActiveXにはGroupと言うコンポーネントは無いのですね。 有難うございました。

関連するQ&A

  • Excel VBA チェックボックスの一括オン、オ

    1.2.のように2つマクロを作成し、それぞれチェックボックスのオン、オフが一括でできるようになったのですが、1つにまとめることはできますでしょうか? 1回クリックすると、一括オン、もう一度クリックすると一括オフを繰り返すようにしたいです。 1.チェックオフ Dim myobj As OLEObject For Each myobj In ActiveSheet.OLEObjects If TypeName(myobj.Object) = "CheckBox" Then _ myobj.Object.Value = False Next 2.チェックオン Dim myobj As OLEObject For Each myobj In ActiveSheet.OLEObjects If TypeName(myobj.Object) = "CheckBox" Then _ myobj.Object.Value = True Next

  • VBA オプションボタンの分類について

    http://okweb.jp/kotaeru.php3?q=1424026 でオプションボタンの表示に関して質問をした者です。 ボタンを自動作成する事はできたのですが例えば1日と15日に 休暇を取得した場合、ボタンが6つ表示されるのですが(1日分が3コ、15日分が3コ)、 この6つのボタンのうち1つしか選択ができません。 (2つ目を選択すると、前に入力していたものはチェックが外れる。) 日にちごとに、1つずつボタンを選択するようにするにはどうしたら良いのでしょうか? ちなみに、当該処理の今記述しているソースは以下のとおりです。 休暇情報の書き出しが終了するまでループで回しています。 ご教授ください。宜しくお願い致します。 '当日ボタン作成 Set objOLEToday = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=565, Top:=100 + objCnt, Width:=45.5, Height:=15.5) objOLEToday.Object.Caption = "当日" '事前ボタン作成 Set objOLEBefore = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=750, Top:=100 + objCnt, Width:=45.5, Height:=15.5) objOLEBefore.Object.Caption = "事前" '無断ボタン作成 Set objOLENotice = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, _ DisplayAsIcon:=False, Left:=920, Top:=100 + objCnt, Width:=45.5, Height:=15.5) objOLENotice.Object.Caption = "無断" '表示位置設定 objCnt = 405.4 + objCnt

  • エクセルVBAでOptionButtonのオンオフ取得

    ワークシート上に貼り付けてあるオプションボタンの状態の取得ですが、フォームのオプションボタンなら 例えば、 MsgBox ActiveSheet.OptionButtons("Option Button 44").Value で、オンなら1、オフなら-4146が返ります。 またActiveSheet.OptionButtons("Option Button 44").Value=xlOnで オンに出来ます。 ところがフォームじゃないコントロールツールボックスのオプションボタンは MsgBox ActiveSheet.Shapes("OptionButton30").Valueでも MsgBox ActiveSheet.Controls("OptionButton30").Valueでもエラーになります。 どうやって取得すればいいのでしょうか? どうやてOn Off を指示すればいいのでしょうか?

  • エクセルVBAマクロのオプションボタンについて

    オプションボタンのマクロに関して教えて下さい。 マクロのスキルレベルは、新しいマクロの記録を多用して、マクロを組むレベルです。 「表示-ツールバー-フォーム」から選ぶオプションボタンを使って、オプションボタンAが押されている場合とBが押されている場合で、処理を変えたいのですが、そのオプションボタンの値をどうやっても拾えません。 色々検索した結果、以下のマクロでできる気がしたのですが、駄目でした。 Private Sub OptionButton1_Click() オプション1 = True End Sub Private Sub OptionButton2_Click() オプション2 = True End Sub Sub オプションボタン() If オプション1 = True Then Range("a1") = 1 ElseIf オプション2 = True Then Range("a1") = 2 Else Range("a1") = 0 End If End Sub 作ったオプションボタンを右クリックしてマクロ登録を選ぶと、「オプション1_Click」となっているので、「OptionButton1_Click」を「オプション1_Click」に変えてみたのですが、やっぱり駄目でした。 ネットではユーザフォームを使ったマクロ例はあるのですが、そのまま使用するオプションボタンの例がありません。できればユーザフォームは使いたくありません。 ご存知の方がいらっしゃいましたら、教えて下さい。よろしくお願いします。

  • EXCEL VBAの OLEObjectについて

    EXCELでVBAを組んである処理をしているのですが、 EXCELのワークシート上にコントロールツールの OptionButtonをいくつか配置してあり、チェックのあるものを VBAのテーブルに入れて処理しようとしていますが、 ”実行時エラー1004 WorkSheetクラスのOLEObjectプロパティを取得できません。” というエラーが出てしまいます。 OLEObjectを使うのが初めてなので、初歩的なミスじゃないかと思います VBAの記述は以下のとおりです Sheets(ReferSheet).Select For i = 1 To 12 If Sheets(ReferSheet).OLEObjects("OptionButton" & i).Object.Value = True Then OpBt(i) = 1 End If Next どうかご指導お願いいたします。

  • エクセルのオプションボタンについて

    エクセルVBAの初心者です。 ブックAのSheet1にコントロールツールボックスよりオプションボタンを使って、OptionButton1にA室、OptionButton2にB室、OptionButton3にC室という名前をつけて作成しました。この3つのオプションボタンの内いずれかを選択した時に、別のブックBのSheet1のセルA1に転記したいのですが、VBAを使って転記をすることはできるでしょうか? 分かりにくい説明で申し訳ありませんが、宜しくお願い致します。

  • Excel2007 VBA シート上のオプションボタン

    Excel2007のVBAで質問があります。 シート上に複数(90個)のオプションボタンが設置しているシートが有りコマンドボタンが押されたときに どのオプションボタンが選択されているか判断したいのですが、 IF文で一つ一つ下記のように書くと個数が多いたムダに長いロジックになります。 If Worksheets("Sheet1").OptionButton1.Value Then chk_f = 1 end If If Worksheets("Sheet1").OptionButton2.Value Then chk_f = 2 end If         :         : ユーザーフォームに設置しているオプションボタンは、下記のようにFor文で回せるのは判っているのですが、 For i = 1 To 90 If Me.Controls("OptionButton" & i).Value Then chk_f = i exit for End If Next シート上のオプションボタンでも同様の事は可能でしょうか? もしなければオプションボタンとセルをリンクさせてそのセルをFor文で回して確認していく方法が出来るかなと考えています。

  • Excel VBA オプションボタンについて

    こんばんは オプションボタンが5つあり、 登録ボタンが1つあるユーザーフォームを作りました。 このオプションにチェックを入れずに登録ボタンを押したときに 「必ず選択してください。」とメッセージを表示し、再度入力させるようにしたいのですが、どうしたらよいのでしょうか。 Excelのバージョンは2003です。 調べたところ (1)で動きそうだ。ということが判ったのですがチェックを入れ値がtrueになるとエラーが発生して止まってしまいます。(理由がわかりません) Private Sub commandbutton2_click() Dim opt As ControlFormat, flg As Boolean flg = False For Each opt In frame1.Controls If opt.Value = True Then '←ここの行でtrueだった場合のエラーが発生してしまう。 flg = True Selection.Value = opt.Caption End If Next Unload userform1 End Sub (2)この方法で何とか動いたのですが、初めの方に書いたとおり、オプションボタンが選択されずに登録ボタンが押された場合、チェックするように促すメッセージを表示する方法がわかりません。また、できればユーザーホームの×ボタンを押せなくする方法もしくは、閉じられた場合にマクロを抜けるようにするにはどうしたらよいのでしょうか。宜しくお願い致します。 Private Sub commandbutton1_click() Dim i As Integer For i = 1 To 5 If Me.Controls("optionbutton" & i).Value = True Then Selection.Value = Me.Controls("optionbutton" & i).Caption End If Next i Unload userform1 End Sub

  • エクセルのVBAについて教えてください。

    以前に下記のような内容のプログラムを作成したいと投稿致しましたら dim row as Integer for row = 1 to 65535 if (selectSheet.Cells(1, row) = "") then selectSheet.Cells(1, row) = "#####" EndIf をアレンジしたいのです。 上記のプログラムが構築されているコマンドボタンと同じuserformにオプションボタンを5個、コンボボックスを一つ作りました。 オプションボタン1を選択するとコンボボックスにはあ行が。 オプションボタン2を選択するとコンボボックスにはか行が。 オプションボタン3を選択するとコンボボックスにはさ行が。 オプションボタン4を選択するとコンボボックスにはた行が。 オプションボタン5を選択するとコンボボックスにはな行が。 選択できるようにしたいのです。 次に選んだオプションボタンと同名前のシートに上記の#####が入力されるようにしたいのですが、どのようにすればいいのですか? このように教えて頂きました。 Public myop As Integer 'オプション選択保持用 Private Sub CommandButton1_Click() Dim row As Integer Dim mykey As String '比較キー '選択したオプションボタンにより '比較キーと選択保持用変数に各値を代入 Select Case True Case OptionButton1: mykey = "[あ-お]*": myop = 1 Case OptionButton2: mykey = "[か-こ]*": myop = 2 Case OptionButton3: mykey = "[さ-そ]*": myop = 3 Case OptionButton4: mykey = "[た-と]*": myop = 4 Case OptionButton5: mykey = "[な-ほ]*": myop = 5 Case Else: myop = 0 End Select If myop = 0 Then Exit Sub For row = 1 To 65535 If ActiveSheet.Cells(1, row).Value Like mykey Then ActiveSheet.Cells(1, row) = "#####" End If Next row End Sub これを流用して自分でいじりたいのですが、私が未熟ですので、コードの意味、役割がさっぱりわかりません。 わがままな質問ではございますが、どなたか上記のコードの意味を教えて頂けませんか? よろしくお願い致します。

  • EXCELオプションボタンのグループ線非表示

    Sub test() Dim grp As Variant excel2000 でフォームのオプションボタンを多数設置しており、グループボタンの線をまとめて 非表示にしようと、下記コードでやってみたところ、反応がありません。 どこをどう修正すれば、いいかアドバイスいただけないでしょうか? よろしくお願いいたします。 For Each grp In Workbooks If grp.Name Like "グループ*" Then ActiveSheet.Shapes(grp).Visible = False End If Next grp End Sub

専門家に質問してみよう