• ベストアンサー

エクセル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/17068)
回答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

  • エクセル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 OptionButton

    Excel VBAのOptionButtonについてお伺いします。 現在、Excel2007にてユーザーフォームを作成しております。 シート上の文字によって、ユーザーフォーム上のオプションボタンの ON/OFFを切り替えたいのですがうまく動作しません。 具体的には・・・・ ユーザフォーム上のCommandButton1を押下すると、 sheet2のE22セルの文字がTRUEの場合、ユーザーフォーム上の OptionButton1がON・OptionButton2がOFF sheet2のE22セルの文字がFALSEの場合、ユーザーフォーム上の OptionButton1がOFF・OptionButton2がON 以下のように考えていたのですが、動作しません。 ------------------------------ Private Sub CommandButton1_Click() If sheet2.Range("E22").Value = "TRUE" Then OptionButton1.Value = True ElseIf sheet2.Range("E22").Value = "FALSE" Then OptionButton2.Value = True End If ------------------------------ お知恵お借りしたく存じます。 宜しくお願い致します。

  • エクセル VBAで

    変動する数値が、セル A1に入る状況で、 該当シートに Private Sub Worksheet_Change(ByVal Target As Range) If Range("A1").Value = 1 Then Range("C62").Value = "○" ElseIf Range("A1").Value = 2 Then Range("C62:C63").Value = "○" ElseIf Range("A1").Value = 3 Then Range("C62:C64").Value = "○" ElseIf Range("A1").Value = 4 Then Range("C62:C65").Value = "○" ElseIf Range("A1").Value = 5 Then Range("C62:C66").Value = "○" ElseIf Range("A1").Value = 6 Then Range("C62:C67").Value = "○" ElseIf Range("A1").Value = 7 Then Range("C62:C68").Value = "○" ElseIf Range("A1").Value = 8 Then Range("C62:C69").Value = "○" ElseIf Range("A1").Value = 9 Then Range("C62:C70").Value = "○" ElseIf Range("A1").Value = 10 Then Range("C62:C71").Value = "○" ElseIf Range("A1").Value = 11 Then Range("C62:C72").Value = "○" ElseIf Range("A1").Value = 12 Then Range("C62:C73").Value = "○" ElseIf Range("A1").Value = 13 Then Range("C62:C74").Value = "○" ElseIf Range("A1").Value = 14 Then Range("C62:C75").Value = "○" ElseIf Range("A1").Value = 15 Then Range("C62:C76").Value = "○" End If End Sub と言ったマクロを記述しましたが、 動作がどうにも重くて困っています。 一度、プレビューをした後は特に遅くなります。 何か良い解決方法はありますでしょうか?

  • 【エクセル】オプションボタンにセルの値を反映させるには

    エクセルマクロ初心者です。教えてください。 シート2 の あるセルの値が A のとき シート1上の オプションボタン1がtrueになる。 シート2 の あるセルの値が A以外のとき シート1上の オプションボタン1がfalseになる。 (オプションボタン1はフォームコントロールのオプションボタンです。) という結果になるマクロの登録方法を模索していますがうまくいきません。 実際には、シート1は入力シートで、ボタンクリックで別の蓄積シートに転記(オプションボタンのほかコンボボックスなどの内容を転記します)。シート1上のリストボックスに蓄積シートの内容を表示し、選択するとその内容を呼び出すようにしたいのです。 コンボボックスやテキストボックスに呼び出すところまではなんとか本を見たりしてできたのですが、オプションボタンに呼び出せません。 なんとかお知恵をお借りしたいです。 よろしくおねがいします。 *下記のようにやってみました。 Private Sub commandbutton3_click() Dim n As Integer n = ListBox1.ListIndex If n = -1 Then MsgBox "選択してください" Else ComboBox2.Value = ListBox1.List(n, 0) ComboBox3.Value = ListBox1.List(n, 3) ComboBox4.Value = ListBox1.List(n, 4) ComboBox5.Value = ListBox1.List(n, 8) ComboBox6.Value = ListBox1.List(n, 9) ComboBox7.Value = ListBox1.List(n, 1) ComboBox8.Value = ListBox1.List(n, 2) TextBox3.Value = ListBox1.List(n, 10) End if ***********ここからがうまくいきません******** If Worksheets("入力シート").ListBox1.List(n, 6).Value = "A" Then OptionButton1.Value = True Else OptionButton("A").Value = False End If End Sub

  • excelのVBAについてです。

    ユーザーフォームの中に10個以上のオプションボタンがあります。どのボタンが選択されているかを判定するのに if optionbutton1.value=true then ... else ... if optionbutton2.value=true then ... else ... ... ... のように、すべてのボタンに対してif then ステートメント記述しています。 この部分をもう少し簡単にできないかなというのが今回の質問です。教えてください。よろしくお願いします。

  • 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で

    はじめまして。 VBA初心者です。 エクセルVBAで以下のことをしようとしていますが、 「型が一致しません」とエラーが出ます。 何がおかしいのでしょうか。 やろうとしていることは、以下のようなことです。 G2に入っている値を参照し>0なら、H2に”上昇”と表示。 <0なら、”下降”、=0なら”トンボ”と表示させ、G3以降も G列にデータが入っている限りそのように表示したいと思っております。 よろしくお願いいたします。 Sub 陰陽() If Range("G2:G10000").Value > 0 Then Range("H2:H10000").Value = "上昇" ElseIf Range("G2:G10000").Value < 0 Then Range("H2:H10000").Value = "下降" ElseIf Range("G2:G10000").Value = 0 Then Range("H2:H10000").Value = "トンボ" End If End Sub

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • 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文で回して確認していく方法が出来るかなと考えています。

  • オプションボタン選択でコンボボックス有効

    ExcelVBAでユーザーフォームを作成しているのですが、昨日までうまく動作していたことが、突然動かなくなりました。 オプション1を選択 ↓ コンボボックス1有効  ※他のコンボボックスは無効 ↓ オプション2を選択 ↓ コンボボックス2有効  ※コンボボックス1も含め他のコンボボックスは無効 という感じで動作させたいです。 書いたコードはこんな感じです。 Private Sub OptionButton1_Click () Dim i As Long Dim lastRow As Integer lastRow = Cells(Row.Count, 1).End(xlUp).Row If OptionButton1.Value = True Then OptionButton1.Enabled = True With ComboBox1 If ComboBox1 = "" Then For i = 2 To lastRow .AddItem Worksheets("sheet1").Cells(i, 1).Value Next i End If End With ComboBox1.ListIndex = 0 ComboBox2.Enabled = False ComboBox3.Enabled = False End If End Sub コードの間違いや改善点などありましたら教えて下さい。 よろしくお願いします。

専門家に質問してみよう