• ベストアンサー

エクセルVBAのオプションボタンがうまくいきません 

エクセルのVBAでフォームをつくり 3つのオプションボタンを配置し チェックした項目のとき、指定したセルに「レ」の印を書き込ませたいのですが、うまくいきません。 同じフォーム内のテキストボックスやコンボボックスの内容はうまくセルに書き込めるのですが・・・ オプションボタンのグループは設定してあります。 下のように記述したのですが、なぜ思うように動作しないか教えてください。 If オプション(3) = True Then ActiveCell.Value = "レ" ElseIf オプション(1) = True Then Range("H21").Value = "レ" ElseIf オプション(2) = True Then Range("H23").Value = "レ" End If

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

チェックボタンではなく、オプションボタンって事は、いずれか1つしか「レ」は付かないようにしたいって事ですよね? OptionButton3 をチェックしたら、OptionButton1 と OptionButton2 に対応するセルをクリアしないと、チェックした全部にレが付いちゃいますけど、、、 そう言う事ではない? '-------------------------------------------------- Private Sub OptionButton1_Click()   OpValueSet (Array("レ", Null, Null)) End Sub '-------------------------------------------------- Private Sub OptionButton2_Click()   OpValueSet (Array(Null, "レ", Null)) End Sub '-------------------------------------------------- Private Sub OptionButton3_Click()   OpValueSet (Array(Null, Null, "レ")) End Sub '-------------------------------------------------- Sub OpValueSet(myArray) Dim rAddress, i As Integer  If Not IsArray(myArray) Then Exit Sub  rAddress = Array("H21", "H23", "H25")   For i = 0 To 2    ActiveSheet.Range(rAddress(i)) = myArray(i)   Next i End Sub

mskhas
質問者

お礼

うまく動作しました。ありがとうございました。 勉強のために教えていただきたいのですが、  rAddress = Array("H21", "H23", "H25")   For i = 0 To 2    ActiveSheet.Range(rAddress(i)) = myArray(i)   Next i この部分を解説していただけないでしょうか よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (5)

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

質問者がやりたいこととあっているか心配ですが ワークシートにUserformを貼り付けました。 実はVBEの画面で挿入-ユーザーフォームです。 そしてそのユーザーフォームの上にチェックボックスを貼り付けました。 標準モジュールに Sub test01() UserForm1.Show vbModeless End Sub 別にチェックボックスのクリックイベントプロシージュアーに Private Sub CheckBox1_Click() If CheckBox1 = True Then ActiveCell = "V" Else ActiveCell = "" End If End Sub を作りました。 実行すると、ワークシート画面になりフォームが現れます。 好きなセルを指定して、ユーザーフォームのチェックボックスをクリックすると、アクチブセルに「V」が 入ります。別のセルの「V」の入ったセルでチェックボックスのVをクリックするとそのアクチブセルは空白になります。 vbModelessのことが言いたかったのですが、エクセル 2000以上でないと使えないそうです。 フォームが表示されている間も、セルの指定を動かすことができました。

すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

投稿途中で中止して、ちょっと書換えたら#3~4が2重投稿になっちゃったようでスミマセン。 Wendy02さん こんにちは。 > なお、グループ化しても、オブジェクトとしてまとまるだけで、あまり役に立たないと思います。 > 使う場合は、フレームで囲います。 たぶんグループ化ではなく GroupName プロパティで同グループに設定してあるって意味ではないかと、、、 フレームに置かなくてもすみますし。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

もう、解決をしているようですが、少し、私のほうからも書かせていただきます。 papayukaさんの回答でうまく行っているというと、ユーザーフォームなんですね。 ご質問は、「フォーム」と、お書きになっていたので、EXCELでは、「フォーム」は、ワークシートのオブジェクトの配下に入りますので、そちらのように読めました。 ユーザーフォームでは、あえて、個別のコントロール・コレクションを作らないと、VBのようには、コレクション化ができません。 >If オプション(3) = True Then を使うのでしたら、以下のようになります。 '<ユーザーフォーム・モジュール> Dim オプション As New Collection Private Sub UserForm_Initialize() 'コントロールのコレクション化 For i = 1 To 3  オプション.Add Me.Controls("OptionButton" & i) Next End Sub Private Sub CommandButton1_Click()  Union(ActiveCell, Range("H21"), Range("H23")).ClearContents  If オプション(3).Value = True Then   ActiveCell.Value = "レ"  ElseIf オプション(1).Value = True Then   Range("H21").Value = "レ"  ElseIf オプション(2).Value = True Then   Range("H23").Value = "レ"  End If End Sub '※UserForm の起動は、モードレス(0) '第3番目のElseIf があるというのは、他にもOptionButton がある、ということでしょうか?なければ、Else だけでもよいです。 のようにします。 しかし、一般的なOfficeのVBAのコードですと、このようにしたら楽だと思います。 '<ユーザーフォーム・モジュール> Private Sub OptionButton1_Click()  ActiveCell.ClearContents  Range("H23").ClearContents  Range("H21").Value = "レ" End Sub Private Sub OptionButton2_Click()   ActiveCell.ClearContents   Range("H21").ClearContents   Range("H23").Value = "レ" End Sub Private Sub OptionButton3_Click()   Range("H21,H23").ClearContents   ActiveCell.Value = "レ" End Sub '※UserForm の起動は、モードレス(0) なお、グループ化しても、オブジェクトとしてまとまるだけで、あまり役に立たないと思います。使う場合は、フレームで囲います。

すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#2です。 >  rAddress = Array("H21", "H23", "H25") >   For i = 0 To 2 >    ActiveSheet.Range(rAddress(i)) = myArray(i) >   Next i 各OptionButton のクリックでサブルーチンを呼ぶ際に配列を渡します。  OpValueSet (Array("レ", Null, Null)) 受け取った配列 myArray は 3つ値を保持しています。 最初の Index は 0 なので、myArray(0)で "レ" を取り出せます。 同様に セルのアドレスを配列にして、0~2でループすれば、  ActiveSheet.Range("H21") = "レ"  ActiveSheet.Range("H23") = Null  ActiveSheet.Range("H25") = Null こう書いたのと同じ意味です。 押されたボタンによって、  ActiveSheet.Range("H21") = Null  ActiveSheet.Range("H23") = "レ"  ActiveSheet.Range("H25") = Null や  ActiveSheet.Range("H21") = Null  ActiveSheet.Range("H23") = Null  ActiveSheet.Range("H25") = "レ" となります。

すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

#2です。 >  rAddress = Array("H21", "H23", "H25") >   For i = 0 To 2 >    ActiveSheet.Range(rAddress(i)) = myArray(i) >   Next i 各OptionButton のクリックでサブルーチンを呼ぶ際に配列を渡します。  OpValueSet (Array("レ", Null, Null)) 受け取った配列 myArray は 3つ値を保持しています。 最初の Index は 0 なので、myArray(0)で "レ" を取り出せます。 同様に セルのアドレスを配列にして、0~2でループすれば、  ActiveSheet.Range("H21") = "レ"  ActiveSheet.Range("H23") = Null  ActiveSheet.Range("H25") = Null こう書いたのと同じ意味です。 押されたボタンによって、  ActiveSheet.Range("H21") = Null  ActiveSheet.Range("H23") = "レ"  ActiveSheet.Range("H25") = Null と  ActiveSheet.Range("H21") = Null  ActiveSheet.Range("H23") = Null  ActiveSheet.Range("H25") = "レ" となります。

すると、全ての回答が全文表示されます。

関連するQ&A