一回も披露したことのない豆知識

動的に生成した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のプロパティとしては存在しているので、なぜサポートしていないといわれるのかがわかりません。

どのようにすれば設定可能でしょうか。

A 回答 (7件)

>(Page.Nameで変わっていたのはセルの名前でした。

)

何か、勘違いしていませんか??

OptionButtonは、セルの中にあるのではなく
シートのの上に置いてあるだけですよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/14 09:15

とりあえず、オプションボタンを三つシート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も、ちゃんと
コード補完するみたいです。
「Excel2007 VBA ラジオボタン」の回答画像7
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お陰さまで実現できました。
OLEObjectの扱い方は中々難しいですね。
今まで補完に頼ったコーディングをしていましたので特に。

改めてありがとうございました。

お礼日時:2009/12/15 11:28

一つだけ、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

補足日時:2009/12/14 15:21
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>Set op = oleob.Object
OLEObjectsの下にOptionButtonがいると思っていたので、暗黙的にキャストされるかと思っていたのですが違うようですね。
そもそもAddがないのでボタンの追加は出来ない、ということですか。
(結局OLEObjects型が、一体何の型なのかわからなくなりましたが)

オブジェクトブラウザ・・・こんなものが。
確かにヘルプと差異がありますね、不思議です。

お礼日時:2009/12/14 14:41

補足します。


誤解されると嫌なので、以下、ご質問者さんの前の質問のスレにありますが、

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
    • good
    • 0

こんにちは。



もう少し、コーディングは、普通の書き方をしたほうがよいですね。たぶん、どこかで見たのでしょうけれども、お手本が悪いようです。変数、プロパティやオブジェクト名とぶつからないようにします。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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

境界線に関しては理解しました、確かにその点も考慮すべきところですね。

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

因みに変数名に関しては無自覚でした、修正させていただきます。

お礼日時:2009/12/14 10:44

追伸、



OLEObjectには、nameプロパティがありますが。
OptionButtonには、nameプロパティは、ありません。

勉強的には、変数を、全部、宣言して、
IDEの機能をフルに使っていると
エクセルが、ちゃんと、コードを補完してくれますよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
Dim Page As OLEObject
で宣言すると確かに補完してくれました。
ActiveXコントロールはすべてOLEObject型なのでOLEObjectのプロパティを適用するのが妥当、といった感じでしょうか。

>OptionButtonには、nameプロパティは、ありません。
ヘルプを見てもNameプロパティは存在していますし、やや荒業ですが
Dim Btn As OptionButton
とすると
Nameプロパティを補完してくれています。
ただし以下のコードで型不一致エラーになりますので、まったくの別物かもしれませんが。
Set Btn = Sheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1")

見当違いのことを言っていたら申し訳ありません。

お礼日時:2009/12/14 09:29

>Page.Caption = ""


Pageと言う変数にOptionButtonを格納した場合
"Object"を明記する必要があるようです。
Page.Object.Caption = ""
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

Page.Object.GroupName = ""
Page.Object.Caption = ""

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

お礼日時:2009/12/11 17:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!