アプリ版:「スタンプのみでお礼する」機能のリリースについて

図のようにシートにコマンドボタンがあります。
オブジェクト名は「CommandButton1」です。

vbaでシート上にコマンドボタンがあるかどうかを取得するコードを書きたいのですが、どうすればいいのかわかりません。

MsgBox IsNull(CommandButton1)

ではエラーになりました。
ご教授よろしくお願い致します。

「コマンドボタンがあるかどうかを取得するに」の質問画像

A 回答 (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
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/07/09 21:02

回答No6です。


CommandButton1.Activateを
OLEObjects("CommandButton1").Activateに変えてみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/08 20:44

次のようにしてはどうでしょう。


Sub コマンドボタン検出()
On Error GoTo errMsg
CommandButton1.Activate
MsgBox "コマンドボタンがあります。"
Exit Sub
errMsg: MsgBox "コマンドボタンがありません。"
End Sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/07 21:58

こんにちは。



通常、特定のオブジェクトを探すわけでないときには、このように、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
    • good
    • 1
この回答へのお礼

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

お礼日時:2009/07/07 21:56

#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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/07 21:55

ワークシートにコマンドボタンを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です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/07 21:54

ある事態が有るかどうかの判定は、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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/06 22:47

間違いなくもっといい方法がありそうですが・・・



On Error Resume Next
If IsNull(Sheet1.OLEObjects("CommandButton1")) Then
MsgBox "ないよ"
Else
MsgBox "あるよ"
End If
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/06 22:40

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A