• ベストアンサー

コマンドボタンがあるかどうかを取得するには?

図のようにシートにコマンドボタンがあります。 オブジェクト名は「CommandButton1」です。 vbaでシート上にコマンドボタンがあるかどうかを取得するコードを書きたいのですが、どうすればいいのかわかりません。 MsgBox IsNull(CommandButton1) ではエラーになりました。 ご教授よろしくお願い致します。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

dfghhj
質問者

お礼

なるほど! こちらではうまくできました! ありがとうございます。

その他の回答 (7)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.7

回答No6です。 CommandButton1.Activateを OLEObjects("CommandButton1").Activateに変えてみてください。

dfghhj
質問者

お礼

再度ありがとうございます。 しかし、今度は「OLEObjects(」の部分が Sub、Function、または Property が定義されていません。(Error 35) となってしまいます。 参照設定の問題でしょうか?

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.6

次のようにしてはどうでしょう。 Sub コマンドボタン検出() On Error GoTo errMsg CommandButton1.Activate MsgBox "コマンドボタンがあります。" Exit Sub errMsg: MsgBox "コマンドボタンがありません。" End Sub

dfghhj
質問者

お礼

すみません。 「CommandButton1」の部分が変数が宣言されていません。 となってしまいます。。。

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

こんにちは。 通常、特定のオブジェクトを探すわけでないときには、このように、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

dfghhj
質問者

お礼

うまく動作しました。 ありがとうございます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#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

dfghhj
質問者

お礼

これはうまく実行できました!ありがとうございます。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

ワークシートにコマンドボタンを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です。

dfghhj
質問者

お礼

ちょっとコードの意味が理解できずにいます。 もっと勉強します。ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

ある事態が有るかどうかの判定は、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

dfghhj
質問者

お礼

なるほど!できました! 文字数でCommandButtonかどうかを判断すればいいのですね! 参考になりました。

  • OMEGAT
  • ベストアンサー率70% (455/642)
回答No.1

間違いなくもっといい方法がありそうですが・・・ On Error Resume Next If IsNull(Sheet1.OLEObjects("CommandButton1")) Then MsgBox "ないよ" Else MsgBox "あるよ" End If

dfghhj
質問者

お礼

うーん どうもいまくきません、 エラーにはならないのですが すべて「ないよ」が返ってきてしまいます。

関連するQ&A

専門家に質問してみよう