VBAでオプションボタンの設定

このQ&Aのポイント
  • ワークシート上にOLEオブジェクトのオプションボタンを配置し、LinkedCellやGroupName、Captionを設定する方法について教えてください。
  • 上記のコードでは、GroupNameとCaptionの設定でエラーが発生します。どのように修正すれば良いですか?
  • エクセル2003でオプションボタンの設定を行いたい場合、どのような方法がありますか?
回答を見る
  • ベストアンサー

VBAでオプションボタンの設定

ワークシート上にOLEオブジェクトのオプションボタンを配置して、LinkedCellを設定し、同一行でGroupName を設定し、Caption をYesとNoにしようと思いました。 ところが、以下のコードですと、GroupName とCaption がエラーになってしまいます。 どのように直せばいいのでしょうか? エクセル2003です。 Sub test01() Dim n As Long, i As Long With ActiveSheet For n = 1 To 2 For i = 1 To 3 Set opt = .OLEObjects.Add(ClassType:="Forms.OptionButton.1", _ Left:=.Cells(i, n).Left, Top:=.Cells(i, n).Top, Width:=50, Height:=18) opt.LinkedCell = .Cells(i, n).Offset(, 4).Address ' opt.GroupName = "OptG" & i ' opt.Caption = IIf(n = 1, "Yes", "No") Next i Next n End With End Sub

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

opt.GroupName = "OptG" & i で、何がいけないのかわたしにはわかりませんが確かにエラーになりますね。 見よう見まねで以下のようにしてみました。 これでいかがでしょう? Sub test01()   Dim n As Long, i As Long   With ActiveSheet     For n = 1 To 2       For i = 1 To 3         Set opt = .OLEObjects.Add(ClassType:="Forms.OptionButton.1", _         Left:=.Cells(i, n).Left, Top:=.Cells(i, n).Top, Width:=50, Height:=18)         opt.LinkedCell = .Cells(i, n).Offset(, 4).Address         opt.Object.GroupName = "OptG" & i         opt.Object.Caption = IIf(n = 1, "Yes", "No")       Next i     Next n   End With End Sub

emaxemax
質問者

お礼

ありがとうございます。 以下のようにためしたら上手くいきました。 Sub test02() Dim n As Long, i As Long With ActiveSheet For n = 3 To 5 For i = 3 To 10 Set myRng = .Cells(i, n) Set opt = .OLEObjects.Add(ClassType:="Forms.OptionButton.1", _ Left:=myRng.Left + 2, Top:=myRng.Top + 2, Width:=myRng.Width * 0.8, Height:=myRng.Height * 0.9) opt.LinkedCell = myRng.Offset(, 4).Address opt.Object.Value = False opt.Object.GroupName = "OptG" & i opt.Object.Caption = Choose(n - 2, "Yes", "No", "N/A") Next i Next n End With End Sub

その他の回答 (1)

回答No.2

optはOLEObjectオブジェクトです。 ところが、CaptionもGroupNameもOLEObjectオブジェクトのプロパティになっていないので 当然エラーになります。 ではどうすればよいかというと、Excelのヘルプによると >OLEObject オブジェクトのプロパティとして表されない、コントロールのプロパティは >Object プロパティを使用して実際のコントロール オブジェクトを取得して設定する >ことができます。 だそうです。 以上

emaxemax
質問者

お礼

ありがとうございます。 >OLEObject オブジェクトのプロパティとして表されない、コントロールのプロパティは >Object プロパティを使用して実際のコントロール オブジェクトを取得して設定する そういう理屈なんですか・・・・。 難しいですねえ。

関連するQ&A

  • VBAでオプションボタンを透過

    ワークシート上にOLEオブジェクトのオプションボタンを設置するため、以下のようなマクロを書きました。 意図したように作動するのですが、一箇所だけ不具合があります。 .Object.BackStyle = fmBackStyleTransparent と、透過に設定してるのですが透過してくれません。(エラーにもなりません。) どこがおかしいのでしょうか? Sub test02() Dim n As Long, i As Long Dim myRng As Range With ActiveSheet For n = 3 To 5 For i = 3 To 10 Set myRng = .Cells(i, n) Set opt = .OLEObjects.Add(ClassType:="Forms.OptionButton.1", _ Left:=myRng.Left + 2, Top:=myRng.Top + 2, Width:=myRng.Width * 0.8, Height:=myRng.Height * 0.9) opt.LinkedCell = myRng.Offset(, 4).Address opt.Object.Value = False opt.Object.GroupName = "OptG" & i opt.Object.Caption = Choose(n - 2, "Yes", "No", "N/A") opt.Object.BackStyle = fmBackStyleTransparent Next i Next n End With End Sub

  • 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

  • Excel VBA チェックボックスの判断

    下記のようなマクロでチェックボックスを作成したのですが、その作成したチェックボックスをクリックしたときに、ある処理を実行させるようにするにはどうすればいいのでしょうか? よろしくお願いします。 Dim Max as Long Dim Cell as Range Dim Check as CheckBox ・ ・ ・ For i = 0 To Max   With Cell.Offset(i)   Set Check = ActiveSheet.CheckBoxes.Add_     (Left:=.Left,Top:=.Top, Width:=.Width, Height:=.Height)   End With   With Check   .LinkedCell = Cell.Address   .Caption = ""   .Value = False   End With Next

  • (VBA)スピンボタンの大量コピー(相対参照)

    お世話になります。質問させていただきます。 表題件ですが、EXCELにて 「A列にコントロールツールの"スピンボタン"をリンクセルを相対参照にして縦に大量にコピー(さらに増減値をデフォルトの1から10に変更)」したいと考えています。 以下に記載したVBAコードは、こちらと同様のQ&Aサイトにて見つけてきた「A列にコントロールツールの"チェックボックス"をリンクセルを相対参照にして縦に大量にコピー」するコードです。 先ずは参考までにご確認ください。 ----------------------------------------------------------------- Sub Checkbox連続作成() Dim myChk As Object Dim i As Long Dim Sakuseisuu As Long Dim StartCell As Range '--------↓ここを変更--------- Sakuseisuu = 20 'チェックボックスの作成数 Set StartCell = Range("A1") 'スタートする位置 '--------↑ここを変更--------- For i = 0 To Sakuseisuu - 1 With StartCell.Offset(i) Set myChk = ActiveSheet _ .OLEObjects.Add(classtype:="Forms.CheckBox.1", _ Link:=False, DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myChk .LinkedCell = StartCell.Offset(i, 1).Address .Object.Caption = "" .Object.Value = False End With Next End Sub ------------------------------------------------------------------ 上記コードを参考に、「A列にコントロールツールの"スピンボタン"をリンクセルを相対参照にして縦に大量にコピー」すべく、コードを以下のように短絡的に書き換えてみましたが、エラーとなってしまいます。 ------------------------------------------------------------------ Sub SpinButton連続作成() Dim myspin As Object Dim i As Long Dim Sakuseisuu As Long Dim StartCell As Range '--------↓ここを変更--------- Sakuseisuu = 20 'チェックボックスの作成数 Set StartCell = Range("A1") 'スタートする位置 '--------↑ここを変更--------- For i = 0 To Sakuseisuu - 1 With StartCell.Offset(i) Set myspin = ActiveSheet _ .OLEObjects.Add(classtype:="Forms.SpinButton1.", _ Link:=False, DisplayAsIcon:=False, _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height) End With With myspin .LinkedCell = StartCell.Offset(i).Address .Object.Caption = "" .Object.Value = False End With Next End Sub ------------------------------------------------------------------ お詳しいかたがおられましたら、是非ともアドバイスを頂戴したく存じます。 さらにわがままを述べると、増減値をデフォルトの1から10に変更したく考えております。 何卒よろしくお願い申し上げます。

  • Excel2007 VBA ラジオボタン Caption

    動的に生成したActiveXコントロールのOptionButtonのプロパティを設定しようと考えています。 For i = StRow To EdRow Step 1 Sheet.Cells(i, Col).Select Left = ActiveCell.Left Top = ActiveCell.Top Width = ActiveCell.Width Height = ActiveCell.Height Set Page = Sheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", _ Left:=Left, _ Top:=Top, _ Width:=Width, _ Height:=Height) Page.Name = "Opt" + CStr(i) Page.GroupName = "選択" Page.Caption = "" Next i Nameプロパティは正常に設定できるのですが、GroupNameとCaptionでエラーになってしまいます。 エラー'438' オブジェクトはこのプロパティまたはメソッドをサポートしていません。 となります。 VisualBasicのヘルプよりOptionButtonのプロパティとしては存在しているので、なぜサポートしていないといわれるのかがわかりません。 どのようにすれば設定可能でしょうか。

  • VBA/フォームのオプションボタンのLinkledCellをクリア

    ワークシート上に十数個のオプションボタンがあります。このボタンのリンクするセルを一度に消去するVBAを書いたのですが、エラーになってしまいます。どこがいけないのでしょうか? Sub test01() Sheets("質問書回答欄").OptionButtons.LinkedCell.ClearContents End Sub Sub test02() With Sheets("質問書回答欄") For Each ob In .OptionButtons ob.LinkedCell.ClearContents Next End With End Sub

  • エクセル2003のVBAで列を指定

    エクセルで特定の列の2~10行目に対して、ある作業をする場合、列を指定する方法は以下のどれがいいでしょうか?あるいはもっといい方法があれば教えてください。 実際には列は約40列(固定)、行は1~2万行(変動)程度で、作業はもっと複雑です。 Sub test01() Dim col Dim i As Long, n As Long For Each col In Array(1, 3, 7, 8, 11) '列番号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test02() Dim col Dim i As Long, n As Long For Each col In Array("A", "C", "G", "H", "K") '列の記号で指定 For i = 2 To 10 n = n + 1 Cells(i, col).Value = n Next i Next col End Sub Sub test03() Dim col Dim i As Long, n As Long For Each col In Range("A2,C2,G2,H2,K2") 'セルで指定 For i = 2 To 10 n = n + 1 col.Offset(i - 2).Value = n Next i Next col End Sub

  • 【Excel VBA】データ貼り付けの開始位置について

    Excel2003を使用しています。 先日、こちらでアドバイスをいただきながら、下記のようなマクロを作りました。内容はあるセルの値と同じ名前のシートへデータをコピーするというものです。 Sheet1に貼り付け元のデータが表形式であり、必要なデータのみ該当のシートへコピーします。マクロ実行後は、別の新しいデータをSheet1へコピペして、またマクロを実行するのですが、その際、データの貼り付け開始位置を前回マクロを実行して貼り付けられたデータから2行空けたいのですが、可能でしょうか? ________________________________________________________________________________________________________________________________ Sub test3() Dim n As Long Dim i As Long Dim j As Long  Worksheets("Sheet1").Activate   For n = 4 To Cells(Rows.Count, 2).End(xlUp).Row    If Cells(n, 3).Value <> "" Then     With Worksheets(CStr(Cells(n, 3).Value))       i = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 2).Copy .Cells(i, 2)       Cells(n, 7).Resize(, 2).Copy .Cells(i, 4)       Cells(n, 11).Copy .Cells(i, 3)     End With    End If    If Cells(n, 13).Value <> "" Then     With Worksheets(CStr(Cells(n, 13).Value))       j = .Cells(Rows.Count, 3).End(xlUp).Row + 1       Cells(n, 12).Copy .Cells(j, 2)       Cells(n, 17).Copy .Cells(j, 4)       Cells(n, 18).Copy .Cells(j, 6)       Cells(n, 11).Copy .Cells(j, 3)     End With    End If   Next n End Sub

  • エクセル マクロ オプションボタン

    エクセル上にユーザーフォーム1を作り OptionButton1~4作成 Captionには OptionButton1)あ OptionButton2)い OptionButton3)う OptionButton4)え と名前を付けてOptionButton1をクリックすると TextBox1に”あ”と表示するようにしたいです! お願いします! 教えて下さい。 {宣言は何?} Dim i As Integer Dim s1 As String For i = 1 To 3 Step 1 s1 = Me.Controls("OptionButton" & i).Caption If Me.Controls("optionbutton" & i) = True Then With UserForm1 .TextBox1.Value = s1 End With End If Next i End Sub 上記の記述では無理でした! 教えて下さい。

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

    VBAはまだやり始めたばかりで、ちょっとわからないので、教えて 下さい。 TextBox1~19に金額を入力すると、 TextBox60に小計 TextBox61に消費税 TextBox62に合計 が入るように設定してあります。 TextBox61のよこに OptionButton1 切捨て OptionButton2 切り上げ OptionButton3 四捨五入 OptionButton4 税込み(「-」を入力) を設定し、オプションボタンを選択するごとに、TextBox61の 消費税設定を変えたいと思っています。 標準では下記のコードでOptionButton1が選択されるように してあります。 オプションボタンで切り替えるにはどのようにしたら よいでしょうか。。。 Private Sub 合計Sub(ByVal myTextBox As MSForms.TextBox) Const cnsTax As Double = 0.05 Dim i As Long Dim v(1 To 19) As Long Dim y(60 To 62) As Long ' With myTextBox .Value = Format$(.Value, "#,##0") End With '再計算 On Error Resume Next For i = 1 To 19 v(i) = CLng(Me.Controls("TextBox" & i).Value) Next With Application.WorksheetFunction y(60) = .Sum(v) If myTextBox Is Me.TextBox61 Then y(61) = CLng(myTextBox.Value) Else y(61) = .RoundDown(y(60) * cnsTax, 0) End If y(62) = .Sum(y(60), y(61)) End With On Error GoTo 0 For i = 60 To 62 Me.Controls("TextBox" & i).Value = Format$(y(i), "#,##0") Next End Sub

専門家に質問してみよう