• ベストアンサー

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のプロパティとしては存在しているので、なぜサポートしていないといわれるのかがわかりません。 どのようにすれば設定可能でしょうか。

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

>(Page.Nameで変わっていたのはセルの名前でした。) 何か、勘違いしていませんか?? OptionButtonは、セルの中にあるのではなく シートのの上に置いてあるだけですよ。

ShimantoGa
質問者

お礼

回答ありがとうございます。 私の勘違いだったようです。 Page.Name = "Opt" + CStr(i) でオブジェクト名が変更されました。 申し訳ありません。

その他の回答 (6)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.7

とりあえず、オプションボタンを三つシート1に 貼り付けました。オブジェクト名は、変えていません。 オブジェト名で、削除したいということでよね。 以下のようにすると、消えるみたいです。 Dim i As Integer Dim opname As String opname = "OptionButton" For i = 1 To 3 Sheet1.OLEObjects(opname & i).Delete Next deleteは、コード補完しません。 何故か、図を見るとわかるに、戻り値が、objectだと、 その後のコード補完は、しないみたいです。 前述のaddが、コード補完しないのもこれが理由です。 とことんコード補完したいのでしたら。 Dim oleobs As OLEObjects Dim oleob As OLEObject Set oleobs = Sheet1.OLEObjects Set oleob = oleobs.Add("Forms.OptionButton.1") 以上のようにするとaddも、ちゃんと コード補完するみたいです。

ShimantoGa
質問者

お礼

回答ありがとうございます。 お陰さまで実現できました。 OLEObjectの扱い方は中々難しいですね。 今まで補完に頼ったコーディングをしていましたので特に。 改めてありがとうございました。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.6

一つだけ、sheet1にオプションボタン作ってみました。 先ず、sheet1に適当な、部品を貼り付けて下さい そうでないと、MSFormsのクラスを認識しないので、 OptionButtonを一つ今回、事前にシート1に貼り付けました。 Dim oleob As OLEObject Dim op As MSForms.OptionButton 'oleobjectの消去 For Each oleob In Sheet1.OLEObjects oleob.Delete Next 'オプションボタンの追加 Set oleob = Sheet1.OLEObjects.Add("Forms.OptionButton.1") oleob.Left = 10 oleob.Top = 10 oleob.Width = 100 oleob.Height = 30 oleob.Name = "opt" 'オプションボタンのプロパティ Set op = oleob.Object op.Caption = "ボタンだよ" op.GroupName = "" op.Value = True このようにすれば、OLEObjects.AddのAddだけが、 コード補完してくれません。 後は、全部コード補完してくれます。 オブジェクトブラウザを使えば、ほとんどの クラスが、追えるので便利ですよ。 >Set Btn = Sheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1") Sheetの後に1が必要ですね。 sheet1の上に、oleobjectsを、加えるので、 そうなります。 ヘルプを見ると、Nameプロパティありますね。 でも、オブジェクトブラウザを見ると、ないのですよ。 この辺は、私もよく解りませでした。

ShimantoGa
質問者

お礼

回答ありがとうございます。 >Set op = oleob.Object OLEObjectsの下にOptionButtonがいると思っていたので、暗黙的にキャストされるかと思っていたのですが違うようですね。 そもそもAddがないのでボタンの追加は出来ない、ということですか。 (結局OLEObjects型が、一体何の型なのかわからなくなりましたが) オブジェクトブラウザ・・・こんなものが。 確かにヘルプと差異がありますね、不思議です。

ShimantoGa
質問者

補足

申し訳ありません、最後に一点質問させてください。 >oleob.Delete で気づいたのですが、 objPage.Name = "Opt" + CStr(i) と動的にオブジェクト名を決めた場合、そのオブジェクトを削除(というよりはそのオブジェクトを解決)するにはどのようにすればよいでしょうか? Private Sub Delete() For i = 1 To 10 Step 1 "Opt" + CStr(i).Delete '"Opt" + CStr(i)が解決できない Next i End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

補足します。 誤解されると嫌なので、以下、ご質問者さんの前の質問のスレにありますが、 http://oshiete1.goo.ne.jp/qa5512575.html のend-uさんの書き方は、VBAとして一般的な書き方です。 事前に、セルをSelect して、セルのプロパティを取得する必要がなくなります。 With ActiveCell 'ActiveSheet.Cells(i, col)     Set oPage = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", _     Left:=.Left +1 , _     Top:=.Top +1 , _     Width:=.Width -1, _     Height:=.Height -1 ) End With

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 もう少し、コーディングは、普通の書き方をしたほうがよいですね。たぶん、どこかで見たのでしょうけれども、お手本が悪いようです。変数、プロパティやオブジェクト名とぶつからないようにします。VBAをお遊びだと思う人もいるようですが、お遊びでも、ルールはあります。 少なくとも、名前付き引数の名前と同じのはダメですね。エラーは出ないけれども、いずれ、どこかでおかしくなってしまいます。Page も、本来は、objOpt などのほうがよいです。 >OptionButtonのオブジェクト名はどのように変更するのでしょうか。 oPage.Name = "Opt" + CStr(i) 'これが、オブジェクト名です。 マクロで編集すると、右クリックでプロパティが出ませんので、VBE とシートを両方開いて、プロパティウィンドウを開いてみれば分かります。  dLeft = ActiveCell.Left + 1 '+1にするのは、標準の境界線を消さないためです。 '------------------------------------------- Sub Test1() Dim StRow As Integer Dim EdRow As Integer Dim dLeft As Double Dim dTop As Double Dim dWidth As Double Dim dHeight As Double Dim oPage As Object Dim i As Long Dim col As Long   col = 2   StRow = 1   EdRow = 4   For i = StRow To EdRow Step 1     ActiveSheet.Cells(i, col).Select     dLeft = ActiveCell.Left + 1     dTop = ActiveCell.Top + 1     dWidth = ActiveCell.Width - 1     dHeight = ActiveCell.Height - 1          Set oPage = ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", _     Left:=dLeft, _     Top:=dTop, _     Width:=dWidth, _     Height:=dHeight)          oPage.Name = "Opt" + CStr(i)     oPage.Object.GroupName = "選択"     oPage.Object.Caption = ""   Next i End Sub

ShimantoGa
質問者

お礼

回答ありがとうございます。 境界線に関しては理解しました、確かにその点も考慮すべきところですね。 コーディングに関して一応自覚はありましたが、作法的なものがわからないのが現状です。 宣言をせずに変数を使用したり、明示的にキャストを行わない。 他にもFunctionでリターンせず、ByRefで参照渡しにしたりといったサンプルも見かけました(特に理由はなさそうでした) (他にもWithを使う使わないなど・・・) 無駄に宣言するのが見にくい、というのが周知されているのであれば宣言はしないのが妥当なような気はしますし(全部Variant(Object?)型扱いはなんですが) 因みに変数名に関しては無自覚でした、修正させていただきます。

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

追伸、 OLEObjectには、nameプロパティがありますが。 OptionButtonには、nameプロパティは、ありません。 勉強的には、変数を、全部、宣言して、 IDEの機能をフルに使っていると エクセルが、ちゃんと、コードを補完してくれますよ。

ShimantoGa
質問者

お礼

回答ありがとうございます。 Dim Page As OLEObject で宣言すると確かに補完してくれました。 ActiveXコントロールはすべてOLEObject型なのでOLEObjectのプロパティを適用するのが妥当、といった感じでしょうか。 >OptionButtonには、nameプロパティは、ありません。 ヘルプを見てもNameプロパティは存在していますし、やや荒業ですが Dim Btn As OptionButton とすると Nameプロパティを補完してくれています。 ただし以下のコードで型不一致エラーになりますので、まったくの別物かもしれませんが。 Set Btn = Sheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1") 見当違いのことを言っていたら申し訳ありません。

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

>Page.Caption = "" Pageと言う変数にOptionButtonを格納した場合 "Object"を明記する必要があるようです。 Page.Object.Caption = ""

ShimantoGa
質問者

お礼

回答ありがとうございます。 Page.Object.GroupName = "" Page.Object.Caption = "" で解決しました。 もう一点質問したいのですが、 Page.Object.Name = "Opt" + CStr(i) とすると エラー'438' になってしまいます。 (Page.Nameで変わっていたのはセルの名前でした。) OptionButtonのオブジェクト名はどのように変更するのでしょうか。

関連するQ&A

  • 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

  • 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でオプションボタンを透過

    ワークシート上に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

  • オブジェクト名をVBAで指定する方法を教えてくださ

    VBAでワークシートにOLEObjectsのコマンドボタンを設置してるのですが ボタンのオブジェクト名をVBAで指定するにはどうすればいいでしょうか? Private Sub CommandButton1_Click() With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False) .Object.Name = "ボタン1" .Object.Caption = "ボタン" .Object.Font.Size = 9 .Width = ActiveCell.Width .Height = ActiveCell.Height End With End Sub を実行すると、 .Object.Name = "ボタン1" の部分で 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)」というエラーになります。 他のコードは大丈夫です。 オブジェクト名をVBAで指定する方法を教えてください。 当方エクセル2003です。

  • ドロップダウンリストの行を増やしたいです。VBA。

    エクセル2000。VBAでコンボボックスを作成したのですが、ドロップダウンリストの表示する行の増やし方が分かりません。” 担当者”は20セル(人)指定しています。 プロパティからならListRowsを8から変更すればいいだけなので分かります。ですがVBAで実施したいです。ドロップダウンリスト表示を20に増やすにはどうしたらいいでしょうか?かなり困っていますのでどうぞ宜しくお願いします。 Selection.ListRows = 20 を足したところ、実行時エラー438「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」となりました。 Sub test() Dim sh As Worksheet Set sh = Worksheets("Sheet1") For i = 1 To 100 l = sh.Cells(i, "H").Left t = sh.Cells(i, "H").Top w = sh.Cells(i, "H").Width h = sh.Cells(i, "H").Height sh.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Left:=l, Top:=t, Width:=w, Height:=h _ ).Select Selection.ListFillRange = "担当者" Selection.LinkedCell = "H" & i Selection.PrintObject = False Next i End Sub

  • (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に変更したく考えております。 何卒よろしくお願い申し上げます。

  • VBAでコマンドボタンを作成~実行するには

    いつもお世話になっております。 今回やりたいことは、 1 ワークシートからユーザーフォームのチェックボックス作成(多数変動) 2 「1」が数に変動があるため、最下段にコマンドボタン作成 3 「2」で作成したボタン実行で、チェック=Trueを印刷 です。 現在、3の手順で止まっています。 まず、 Private Sub UserForm_Initialize() 内で、 Set CMD = Me.Controls.Add("Forms.CommandButton.1") With CMD .name = PrintStart .Height = 30 .Width = Me.Width - 20 .Left = 10 .Top = 230 .Caption = "印刷する" End With としてボタンを作成しています。 次に Private Sub PrintStart_Click() 内で、先にテストがしたかったので、  for i = 1 to end  '(end = 変数)    name = Me.Controls("CheckBox" & i).Caption '(name = string変数) MsgBox (name) Next i としているのですが、ここで動作してくれない状況です。 ちなみにフォーム自体の大きさも、その時の行数に応じて自動生成にしているのですが、それをやめて、 あらかじめ縦になが~いフォームに固定しておいてボタンを置いておき、 そのボタン(CommandButton1)で上記のコードを実行すると、うまくいきました。 ただ、プログラマのみなさんなら分かってくれると思いますが、見た目ってこだわりたいですよね?ね? よろしくお願いします。

  • VBAのボタン操作について。

    For i=0 to 3 with Range("A" & (i+1)) with ActiveSheet.Buttons.Add(.Left,.Top,.Width,.Height) .caption="テストボタン" .OnAction="テストアクション" End with End wirh Sub テストアクション() MsgBox "あなたがクリックしたボタンは上から○番目のボタンです。" End sub 上記マクロを実行すると、セルA1,A2,A3にテストボタンが配置されます。 3つのボタンのどれかをクリックしたとき、テストアクションが実行されますが、 ○番目の○を求めるにはどうすればよいのでしょうか?

  • (Excel 2003) マクロでワークシート上のラベルをコントロールしたいのですか・・・

    こんにちは。 Excel 2003 で思い通りのグラフが作成できなくて、ならば自分で作ろうと無謀にも思い立ち、 マクロでラベルをワークシートに貼り付けてみました。 (とりあえずの目標) ・目的の位置に目的の大きさで貼り付ける。 ・標題を消去する。(あるいは、特定の文字を設定。) ・境界線を設定する。 ・背景色を設定する。 しかし、思った通りに動作してくれません。下記はそのテスト用のコードです。 Sub Test1() With Sheets("テスト").OLEObjects.Add(ClassType:="Forms.Label.1", _ Left:=54, Top:=13.5, Width:=54, Height:=13.5) '.Caption = "" 実行時エラー '.BorderStyle = fmBorderStyleSingle 実行時エラー '.BackColor = RGB(192, 192, 192) 実行時エラー .Border.Color = vbBlack 'OK .Interior.Color = RGB(192, 192, 192) 'NG(実行時エラーはないが効果無し) End With End Sub (質問1) プロパティウインドウでは指定可能なのに、VBAでプロパティを利用できないのは何故ですか? Caption, BorderStyle, BackColor など 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 (質問2) 標題を消去する(または、特定の文字を指定する)にはどうしたらよいですか? また、背景色を設定するにはどうしたらよいですか? 初歩的なことと思いますが、よろしくお願いします。

  • VBA シート上のボタンクリックしたら実行

    お世話になっております。 シート上に、予定1、予定2…        実際1、実際2… という名前で作成したオートシェイプがあります。 このオートシェイプをクリックしたら、 既にあるオートシェイプ(矢印)を消し、 オートシェイプ(矢印)を作成するというものをしたいと思っています。 -------------------------- Sub Test() Dim TESTShape As Shape Dim i As Long Dim j As Long j = 1 For i = 5 To 64 With ActiveSheet.Range("J" & i) If i Mod 2 = 1 Then '2で割って余りが1なら Set TESTShape = ActiveSheet.Shapes.AddShape( _ msoShapeRectangle, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) TESTShape.Fill.Visible = msoTrue TESTShape.Select Selection.ShapeRange.Fill.ForeColor.SchemeColor = 41 TESTShape.Name = "予定" & j ' Else Set TESTShape = ActiveSheet.Shapes.AddShape( _ msoShapeRectangle, _ Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) TESTShape.Name = "実際" & j ' j = j + 1 End If End With Next End Sub -------------------------- 上記プログラムで、シート上にボタンを作成しました。 そのシートに直接プログラムを書き込み? Private Sub 予定1_Click() MsgBox "TEST" End Sub と試してみていますが、オートシェイプから シートプログラム?の実行はできないのでしょうか。 このシートは色んなシートにコピーして使おうと思っているため、 ボタンをおしたら矢印を消したり、追加したりする動作も他のブックにコピーしたいと思っています。 そのためシートに書き込もうとしているのですが、上手く行かず… 根本的に、なにか間違っているかもしれません。 シートに書き込むプログラムをどう書くべきなのかあまり良くわかっておりません…。 シート上のボタンをクリックしたら実行できるのは、 標準モジュールに書き込んだプログラムのみなのでしょうか? 質問がわかりにくく、説明不足の点も多々あるかもしれません。 その場合は、どんどん聞いてください。お願いします。 回答お待ちしております。