[[20140923090259]] 『オプションボタンの違いについて』(ななな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オプションボタンの違いについて』(ななな)

 はじめまして。

色々検索や資料など見ているのですがオプションボタンの違いが
どうも理解できていなく悩んでいます。

行いたいことはアンケートを作ろうと
オプションボタンで下記のように配置します。

○オプションボタン1  (○オプションボタン5 ○オプションボタン6)
○オプションボタン2  (○オプションボタン7 ○オプションボタン8)
○オプションボタン3  (○オプションボタン9 ○オプションボタン10)
○オプションボタン4

動きとしては
オプションボタン1を選択した時のみオプションボタン5 or オプションボタン6を
選択できる。
オプションボタン2を選択した時のみオプションボタン7 or オプションボタン8を
選択できる。
オプションボタン4を選択すると、どこも選択させない(value=false状態)
というものです。

そこで
現行のExcel2010ではオプションボタンが
2種類(フォームコントロール/ActiveXコントロール)あり、違いが分かっていません。
フォームコントロールとActiveXコントロールでは何がどう違うのでしょうか?
また、AcvtiveXコントロールでは

 Private Sub OptionButton1_Change()

        OptionButton5.Value = False
        OptionButton6.Value = False

 End Sub
でいけるのですが、フォームコントロールで上記動きをさせるには
どのようにすればよろしいでしょうか?

初心者的質問で申し訳ないのですが、ご教授よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 結論から言えば、やりたいことを行うにはActiveXコントロールを使うことになります。
http://office.microsoft.com/ja-jp/excel-help/HA010342745.aspx 現在参照不可

 しかし、オプションボタンをこれだけ用意する必要が本当あるのでしょうか?

 例えば入力規則のリストで選択させ、選択した結果を元に更に入力規則のリストを絞ることが
 エクセルのシート上で可能です。

 やりたいことが労力に見合うのか、メンテナンス性は伴うのか、自分のレベルと比較して背伸び
 していないか、もう一度考え直した方がいい案件かと思います。
(稲葉) 2014/09/23(火) 09:37

 いろいろと駆使すればできないことはないと思いますが、
  A-1   A-2
  B-1   B-2
  C-1   C-2
  D
 のようにしてフラットな構成にしてできないでしょうか。
 これだと選ぶのもワンクリックで済み、7つの内の一つしか選択状態になりません。
 集計もこの方が楽だと思いますけれど、どうしても今の構成が必要でしょうか。
(Mook) 2014/09/23(火) 12:07

(稲葉さん)
 回答、ありがとうございます。

やはりActiveXコントロールになりますか。
フォームコントロールにマクロ登録メニューがあったので
それではできないかと苦慮していました。

考えが単純すぎるのですかね。
オプションボタン1をクリックするとオプションボタン5or6が選択でき
残りは非選択状態とする。
言うのは簡単ですが、おっしゃるように私のレベルから見て背伸びしているのかも…。

(MOOKさん)
アドバイス、ありがとうございます。
設計チームより、オプション1つに対し、2つの機能を選べるようにしたいとの事。
すいません、悩んでいます。

ActiveXコントロールではできそうなんで…。

2つの違いが分かっておらず(お互いの良し悪し等)、こんな質問となっています。

(ななな) 2014/09/23(火) 12:28


 これ設問1ですよね?
 設問2 設問3 設問4・・・
 いくつ作るか分かりませんが、それだけの数クリックイベント作るのでしょうか?
 ボタン1をクリックしたら、
 5・6をEnable = True 
 7・8・9・10 をEnable = False
 これを設問毎に明確に分けて作るとなると、ものすごい労力になると思います。

 こちらを参考にすればもっと簡単にすることも可能ですが
http://www.h3.dion.ne.jp/~sakatsu/Breakthrough_P-Ctrl_Arrays.htm

 申し訳ないけど、なななさんがすぐ理解して出来るとは思えないのです・・・

 代替案1
 セルに「○」と「●」
	[A]	[B]		[C]	[D]	[E]	[F]
[1]	○	よくする	○	毎日	○	週3回
[2]	○	たまにする	○	週1回	○	月3回
[3]	●	あまりしない	○	月1回	●	年3回
[4]	○	しない				

 クリックしたら交互に入れ替わるようにして、設問毎のブロックで制御を分けてあげる

 代替案2
 片方オプションボタンをやめて、リストボックにし、
 リストボックスの値に応じてオプションボタンのCaptionを変更させる
 ┌───────┐
 │よくする   │
 │たまにする  │ ●毎日  ○週3回
 │あまりしない │  ~~~    ~~~~~
 │しない    │  ↑     ↑
 └───────┘ ここの値を選択したリストによって変更する

 こんな感じにした方が実装し易いと思います。
(稲葉) 2014/09/23(火) 12:59

 なななさんの最初に提示した例をコードにするとこうなります。
    '==ここから
    Private Sub OptionButton1_Click()
        OptionButton5.Enabled = True
        OptionButton6.Enabled = True
        OptionButton7.Enabled = False
        OptionButton8.Enabled = False
        OptionButton9.Enabled = False
        OptionButton10.Enabled = False
    End Sub
    Private Sub OptionButton2_Click()
        OptionButton5.Enabled = False
        OptionButton6.Enabled = False
        OptionButton7.Enabled = True
        OptionButton8.Enabled = True
        OptionButton9.Enabled = False
        OptionButton10.Enabled = False
    End Sub
    Private Sub OptionButton3_Click()
        OptionButton5.Enabled = False
        OptionButton6.Enabled = False
        OptionButton7.Enabled = False
        OptionButton8.Enabled = False
        OptionButton9.Enabled = True
        OptionButton10.Enabled = True
    End Sub
    Private Sub OptionButton4_Click()
        OptionButton5.Enabled = False
        OptionButton6.Enabled = False
        OptionButton7.Enabled = False
        OptionButton8.Enabled = False
        OptionButton9.Enabled = False
        OptionButton10.Enabled = False
    End Sub
    '==ここまでが設問1

 で私が提案する代替案2は
    '==ここから
    Private Sub ListBox1_Change()
        Dim OP_Cap(1 To 2) As String
        On Error Resume Next
        OP_Cap(1) = Array("毎日", "週1回", "月1回")(ListBox1.ListIndex)
        OP_Cap(2) = Array("週3回", "月3回", "年3回")(ListBox1.ListIndex)
        On Error GoTo 0
        If OP_Cap(1) = "" Then
            OptionButton11.Enabled = False
            OptionButton12.Enabled = False
        Else
            OptionButton11.Enabled = True
            OptionButton12.Enabled = True
            OptionButton11.Caption = OP_Cap(1)
            OptionButton12.Caption = OP_Cap(2)
        End If
    End Sub
    '==ここまでが設問1

 要するにイベントが細分化されてしまうのをどのように少なくするか、が問題なのです。
 Mookさんが言うように、フラットにすればVBAすら必要ありません。
 また、両方リストボックスにすることで、Captionを書き換えず、ListFillRangeの
 リンク先を計算式で変更すれば、VBAを使わず動的に選択できます。
(稲葉) 2014/09/23(火) 14:54

 >2種類(フォームコントロール/ActiveXコントロール)あり、違いが分かっていません。 

 私は、既にユーザーにシートを触らせるようなVBA仕様には、殆どしていません。従って、シートに
 コントロールそのものを貼り付けるという事がないのですが、VBAをやり始めのころの印象では、

 フォームコントロールは、持っている機能がActiveXコントロールに比べて少ないですが
 (例えば、オプションボタンの表示文字列については 殆ど制御できない)、その分シンプルなため
 不具合が少ない

 対しては、ActiveXコントロールは、細かい機能は多いが、不具合は多い

 という印象です。

 問題がなければ フォームコントロールを選択していました。

 今回の事例をフォームコントロールで行ってみます。

 新規ブックの標準モジュールに

 '=============================================================================================
 Option Explicit
 Sub mk_sample()
    Dim r As Range
    Dim g0 As Long
    Dim g1 As Long
    With ActiveSheet
       .DrawingObjects.Delete
       Set r = .Range("c8:f23")
       With .GroupBoxes.Add(r.Left, r.Top, r.Width, r.Height)
          .Caption = "大項目"
       End With
       For g0 = 1 To 4
          Set r = .Range(.Cells(g0 * 4 + 5, 4), .Cells(g0 * 4 + 6, 5))
          With .OptionButtons.Add(r.Left, r.Top, r.Width, r.Height)
             .Name = "Option" & g0
             .Caption = "オプション " & g0
             .OnAction = " Opボタン_mng"
          End With
       Next
       g1 = 5
       For g0 = 1 To 3
          Set r = .Range(.Cells(g0 * 5 + 3, 8), .Cells(g0 * 5 + 6, 14))
          With .GroupBoxes.Add(r.Left, r.Top, r.Width, r.Height)
             .Name = "gbx" & g0
             .Caption = "小項目" & g0
          End With
          Set r = .Range(.Cells(g0 * 5 + 4, 9), .Cells(g0 * 5 + 5, 10))
          With .OptionButtons.Add(r.Left, r.Top, r.Width, r.Height)
             .Name = "Option" & g1
             .Caption = "オプション " & g1
          End With
          Set r = .Range(.Cells(g0 * 5 + 4, 12), .Cells(g0 * 5 + 5, 13))
          With .OptionButtons.Add(r.Left, r.Top, r.Width, r.Height)
             .Name = "Option" & (g1 + 1)
             .Caption = "オプション " & (g1 + 1)
          End With
          g1 = g1 + 2
       Next

    End With
 End Sub
 '=====================================================================
 Sub Opボタン_mng()
    Const ng = 15263976
    Dim g0 As Long
    Dim id As Long
    id = Replace(Application.Caller, "Option", "")
    Dim enbdarray As Variant
    enbdarray = [{5,6;7,8;9,10}]
    With ActiveSheet
       For g0 = 5 To 10
          With .OptionButtons("Option" & g0)
             .Value = False
             .Enabled = False
             .Interior.Color = ng
          End With
       Next
       Debug.Print id
       If id <= UBound(enbdarray) Then
          For g0 = LBound(enbdarray, 2) To UBound(enbdarray, 2)
             With .OptionButtons("Option" & enbdarray(id, g0))
                .Enabled = True
                .Interior.ColorIndex = xlNone
             End With
          Next
       End If
    End With
 End Sub

 適当なシートをアクティブにして、mk_sample を実行してください。

 投稿された内容に沿って、オプションボタンを作成しました。

 mk_sampleの内容は、コードで書きましたが、本来は手動操作で作成するものです。

 大項目の枠にあるオプションボタンの4つには、マクロの登録で Opボタン_mng を登録しました。

 大項目のオプションボタンを選択してください。

 オプション1の選択で 小項目1 オプション2の選択で 小項目2、・・・が選択可能になります。

 ひとつの検討材料として、投稿します。
 
( ichinose) 2014/09/23(火) 18:16

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.