- ベストアンサー
コマンドボタンがあるかどうかを取得するには?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 ここのサイトは、他人の書いた内容については触れてはいけないのがルールですが、#6 さんのコードのエラーは、そのままになっているようですから、失礼させていただきます。 理由は、CommandButton も OleObjects も、親オブジェクトが省略されています。本来、CommandButton など、コントロールツールもフォームツールも省略してはいけないのですね。もし、コードが通るとしたら、それは、Option Explicit を入れていないからです。 With ActiveSheet On Error GoTo ErrMsg .CommandButton1.Activate '最初に「.」を付けてください。 MsgBox "CommandButtonをActivate しました", vbInformation End With Exit Sub ErrMsg: MsgBox Err.Description
その他の回答 (7)
- KURUMITO
- ベストアンサー率42% (1835/4283)
回答No6です。 CommandButton1.Activateを OLEObjects("CommandButton1").Activateに変えてみてください。
お礼
再度ありがとうございます。 しかし、今度は「OLEObjects(」の部分が Sub、Function、または Property が定義されていません。(Error 35) となってしまいます。 参照設定の問題でしょうか?
- KURUMITO
- ベストアンサー率42% (1835/4283)
次のようにしてはどうでしょう。 Sub コマンドボタン検出() On Error GoTo errMsg CommandButton1.Activate MsgBox "コマンドボタンがあります。" Exit Sub errMsg: MsgBox "コマンドボタンがありません。" End Sub
お礼
すみません。 「CommandButton1」の部分が変数が宣言されていません。 となってしまいます。。。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 通常、特定のオブジェクトを探すわけでないときには、このように、TypeOf を使います。 なお、Excel VBAの場合は、Null値は、特別な値で、Variant 型に特別に入れないと存在しません。オブジェクト型には、Null値は存在しません。Access のコントロール・オブジェクトの一部のプロパティに、値がない場合に、Null値がありますが、Excel VBAには、そのような仕様はありません。 '----------------------------------------- Sub Test1() Dim shp As Object Dim flg As Boolean For Each shp In ActiveSheet.OLEObjects If TypeOf shp.Object Is MsForms.CommandButton Then flg = True Exit For End If Next shp If flg Then MsgBox "CommandButton はありました。", vbInformation Else MsgBox "CommandButton は見当たりません。", vbExclamation End If End Sub
お礼
うまく動作しました。 ありがとうございます。
- mitarashi
- ベストアンサー率59% (574/965)
#3ですが、補足いたします。 CommandButton1,2,3...というのは、エクセルお仕着せの名前ですが、これは任意に変更できます。「実行ボタン」なんて名前にも変更可能です。ですから、他人が作ったブックや、過去の自分が作ったブックに、コマンドボタンがあるかどうかの判断に、Nameを使うのは確実ではないと思います。という訳で、下記を提案します。(これはシートモジュールに書いたコードです。標準モジュールの場合は、Meの所を適当なシートに変更して下さい) Sub test3() Dim shp As Shape Dim findFlag As Boolean For Each shp In Me.Shapes If shp.Type = msoOLEControlObject Then If shp.DrawingObject.ProgId = "Forms.CommandButton.1" Then findFlag = True MsgBox "コマンドボタン" & vbCrLf & shp.Name & vbCrLf & "がありました" End If End If Next shp End Sub
お礼
これはうまく実行できました!ありがとうございます。
- mitarashi
- ベストアンサー率59% (574/965)
ワークシートにコマンドボタンを1個設置して、シートモジュールに、 Sub test() Stop End Sub なんてコードを記述して実行し、ローカルウィンドウを表示させて眺めていると、色々分かってきます。 Sub test2() Dim shp As Shape For Each shp In Me.Shapes Debug.Print shp.Type '-> 12 : msoOLEControlObject Debug.Print shp.Name '->CommandButton1 但し、任意に変更できる Debug.Print shp.DrawingObject.ProgId '->Forms.CommandButton.1 Next shp End Sub shp.DrawingObject.ProgIdが使えそうですがいかがでしょうか。ただし、普通のシェイプだとエラーになりますので、shp.typeが12で無いときはアクセスしない様なコードにする必要があります。 当方XL2000です。
お礼
ちょっとコードの意味が理解できずにいます。 もっと勉強します。ありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
ある事態が有るかどうかの判定は、VBAの並みの経験では難しい。何処かで1つ1つ経験を積みマネをするよりほか無い。 いっぱい有るし。例 条件付貴所式が有るか、非表示のシートがあるか、フィルターモードかなど色々。 普通は表の勉強から入るし。 例コマンドボタンの貼り付け方から勉強する。 本件は貼り付けて有るかどうかの判定 表と裏のような関係だが、1つ1つ判定のコードの型が違うように思う。 ーー ツールバーのコントロールのコマンドボタンの例です。 1方法として Sub test01() n = Worksheets("Sheet1").OLEObjects.Count MsgBox n If n <> 0 Then For i = 1 To n MsgBox TypeName(Worksheets("Sheet1").OLEObjects(i)) MsgBox Worksheets("Sheet1").OLEObjects(i).OLEType MsgBox Worksheets("Sheet1").OLEObjects(i).Name Next i Else MsgBox "在りません" End If End Sub ーー 上記ののWorksheets("Sheet1").OLEObjects(i).Name の左から13文字がCommandButtonであるか判定する。 最終・肝心のIF文は省略しているので入れてください. IF Left(Worksheets("Sheet1").OLEObjects(i).Name,13)= "CommandButton" Then MsgBox "在ります" End If
お礼
なるほど!できました! 文字数でCommandButtonかどうかを判断すればいいのですね! 参考になりました。
- OMEGAT
- ベストアンサー率70% (455/642)
間違いなくもっといい方法がありそうですが・・・ On Error Resume Next If IsNull(Sheet1.OLEObjects("CommandButton1")) Then MsgBox "ないよ" Else MsgBox "あるよ" End If
お礼
うーん どうもいまくきません、 エラーにはならないのですが すべて「ないよ」が返ってきてしまいます。
お礼
なるほど! こちらではうまくできました! ありがとうございます。