
動的に生成した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のプロパティとしては存在しているので、なぜサポートしていないといわれるのかがわかりません。
どのようにすれば設定可能でしょうか。
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も、ちゃんと
コード補完するみたいです。

回答ありがとうございます。
お陰さまで実現できました。
OLEObjectの扱い方は中々難しいですね。
今まで補完に頼ったコーディングをしていましたので特に。
改めてありがとうございました。
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プロパティありますね。
でも、オブジェクトブラウザを見ると、ないのですよ。
この辺は、私もよく解りませでした。
この回答への補足
申し訳ありません、最後に一点質問させてください。
>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
回答ありがとうございます。
>Set op = oleob.Object
OLEObjectsの下にOptionButtonがいると思っていたので、暗黙的にキャストされるかと思っていたのですが違うようですね。
そもそもAddがないのでボタンの追加は出来ない、ということですか。
(結局OLEObjects型が、一体何の型なのかわからなくなりましたが)
オブジェクトブラウザ・・・こんなものが。
確かにヘルプと差異がありますね、不思議です。
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
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
回答ありがとうございます。
境界線に関しては理解しました、確かにその点も考慮すべきところですね。
コーディングに関して一応自覚はありましたが、作法的なものがわからないのが現状です。
宣言をせずに変数を使用したり、明示的にキャストを行わない。
他にもFunctionでリターンせず、ByRefで参照渡しにしたりといったサンプルも見かけました(特に理由はなさそうでした)
(他にもWithを使う使わないなど・・・)
無駄に宣言するのが見にくい、というのが周知されているのであれば宣言はしないのが妥当なような気はしますし(全部Variant(Object?)型扱いはなんですが)
因みに変数名に関しては無自覚でした、修正させていただきます。
No.3
- 回答日時:
追伸、
OLEObjectには、nameプロパティがありますが。
OptionButtonには、nameプロパティは、ありません。
勉強的には、変数を、全部、宣言して、
IDEの機能をフルに使っていると
エクセルが、ちゃんと、コードを補完してくれますよ。
回答ありがとうございます。
Dim Page As OLEObject
で宣言すると確かに補完してくれました。
ActiveXコントロールはすべてOLEObject型なのでOLEObjectのプロパティを適用するのが妥当、といった感じでしょうか。
>OptionButtonには、nameプロパティは、ありません。
ヘルプを見てもNameプロパティは存在していますし、やや荒業ですが
Dim Btn As OptionButton
とすると
Nameプロパティを補完してくれています。
ただし以下のコードで型不一致エラーになりますので、まったくの別物かもしれませんが。
Set Btn = Sheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1")
見当違いのことを言っていたら申し訳ありません。
No.1
- 回答日時:
>Page.Caption = ""
Pageと言う変数にOptionButtonを格納した場合
"Object"を明記する必要があるようです。
Page.Object.Caption = ""
回答ありがとうございます。
Page.Object.GroupName = ""
Page.Object.Caption = ""
で解決しました。
もう一点質問したいのですが、
Page.Object.Name = "Opt" + CStr(i)
とすると エラー'438' になってしまいます。
(Page.Nameで変わっていたのはセルの名前でした。)
OptionButtonのオブジェクト名はどのように変更するのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- PowerPoint(パワーポイント) ExcelのVBAコードについて教えてください。 3 2022/05/25 14:32
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) vba スライサー 1 2022/08/16 14:07
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- その他(Microsoft Office) エクセルのマクロでスライサー教えてください。 1 2022/09/28 16:40
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
AccessVBAで「dim dbs as datab...
-
ExcelVBAでのNZ関数について
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
エクセルVBAで配列内に空白デー...
-
VBAで作成するメール(開封確認...
-
Excelでフィルタをかけると警告...
-
VBA (Row とRowsの違いについて)
-
オブジェクト変数またはWITHブ...
-
オブジェクトが見つかりません
-
ある文字列が全て数字であるか...
-
VBからPDFファイル自動生成...
-
横軸ラベルの追加に関するエラ...
-
Excel VBA ”set xx=nothing” ...
-
EXCEL VBA オートシェイプナン...
-
テキストボックス中の文字列の...
-
Excel VBA Collection.add で R...
-
エクセルマクロエラー「'Cells'...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
VBAで既に開いている別アプリケ...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
上下の位置揃えについて
-
エクセルマクロエラー「'Cells'...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルVBAでcode128のバー...
-
テキストボックス中の文字列の...
-
EXCEL VBA オートシェイプナン...
-
findメソッドの変数について
-
AccessVBAで「dim dbs as datab...
-
ある文字列が全て数字であるか...
-
VBAからPDFファイルにパスワー...
-
VBScriptでファイルの日時順(降...
-
エクセルVBAで配列内に空白デー...
-
PowerPointVBAでスライドマスタ...
-
VBAで作成するメール(開封確認...
おすすめ情報