• 締切済み

Excel VBA Application.caller エラー2023について

表題 コマンドボタンを押し自分自身のオブジェクト名を取得したいと考えております。 下記、コードにて試したところエラー2023が表示され所望の動作が確認できません。どなたかお分かりの方がいらっしゃいましたらご教授いただければ幸いです。 Private Sub CommandButton1_Click() Select Case TypeName(Application.Caller)   Case "Range"     v = Application.Caller.Address   Case "String"     v = Application.Caller   Case "Error"     v = "エラー"   Case Else     v = "不明です" End Select MsgBox "Visual Basic を呼び出した方法 = " & v End sub

みんなの回答

回答No.3

コントロールツールボックスのコマンドボタンでなくて、シェープやグラフなんかだとできるんですが・・・ こんなのではダメでしょうか? 標準モジュールにコピーしてください。(少なくてもSub testは標準モジュールに) 'ボタンを作る Sub sample() Dim i As Integer For i = 1 To 10 With ActiveSheet.Buttons.Add(0, (i - 1) * 20, 50, 20) .Name = "button " & i .Caption = "ボタン" & i .OnAction = "test" End With Next End Sub 'ボタンが押された時 Sub test() MsgBox Application.Caller End Sub p.s. sampleは、何度も実行すると同じ名前のボタンを作るので注意してください。 ボタンでなくても、グラフを選択(クリック)したら・・・とかもできるみたいです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

イベントプロシージャの名前がそれなんですが、ボタンが複数あれば それぞれにClickイベントが作られるので、各プロシージャで定数を セットするしかないようです。

rainbow50
質問者

お礼

 押されたコマンドボタンのオブジェクト名を引数にして関数を動作させたいと考えておりましのでこのような動作はExcel VBAでは解はなさそうな状況でしょうか。(複数のコマンドボタン内部 のプログラムをコピーペーストで使いまわせればと考えておりました。)  取り急ぎ、愚直にベタプログラムで作業を進めたいと思います。  ご回答有難うございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

>自分自身のオブジェクト これって何を指してるんですか? Excelのヘルプで「Callerプロパティ」を調べました? ヘルプには、このタイプのイベントでは「エラーが返る」と書いてあるはず。

rainbow50
質問者

お礼

早速のご回答有難うございます。  Callerプロパティを確認したところエラーが返ること確認させていただきました。  ちなみに、所望の動作とは  CommandButton1をクリックして、このオブジェクト名を取得したいと考えています。  つきまして、期待値は"CommandButton1"ですが 他手法にて上記を実現できる方法はあるでしょうか?

関連するQ&A

  • エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタン

    エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタンについて教えてください。 実はこれまでフォームしか使ったことがないのですが、フォームのボタンですと、下記のように一つのプロシージャを多数のボタンから呼び出し、呼び出したボタンにより異なった指示が出来ます。 Sub test() x = Application.Caller Select Case x Case "ボタン 1" MsgBox 1 Case "ボタン 2" MsgBox 2 Case "ボタン 3" MsgBox 3 Case "ボタン 4" MsgBox 4 End Select End Sub コントロールツールボックスは Private Sub CommandButton1_Click() MsgBox 1 End Sub Private Sub CommandButton2_Click() MsgBox 2 End Sub のようにコマンドボタンごとにひとつずつ書くしかないのでしょうか?

  • 複数のコマンドボタン(VBAで)を一つにまとめたい。

    複数のコマンドボタン(VBAで)を一つにまとめたい。 Private Sub CommandButton1_Click() Application.Goto Reference:=Range("A7"), Scroll:=True End Sub Private Sub CommandButton2_Click() Application.Goto Reference:=Range("A29"), Scroll:=True End Sub Private Sub CommandButton3_Click() Application.Goto Reference:=Range("A51"), Scroll:=True End Sub Private Sub CommandButton4_Click() Application.Goto Reference:=Range("A73"), Scroll:=True End Sub Private Sub CommandButton5_Click() Application.Goto Reference:=Range("A95"), Scroll:=True End Sub Private Sub CommandButton6_Click() Application.Goto Reference:=Range("A117"), Scroll:=True End Sub Private Sub CommandButton7_Click() Application.Goto Reference:=Range("A139"), Scroll:=True End Sub Private Sub CommandButton8_Click() Application.Goto Reference:=Range("A161"), Scroll:=True End Sub Private Sub CommandButton9_Click() Application.Goto Reference:=Range("A183"), Scroll:=True End Sub Private Sub CommandButton10_Click() Application.Goto Reference:=Range("A205"), Scroll:=True End Sub Private Sub CommandButton11_Click() Application.Goto Reference:=Range("A227"), Scroll:=True End Sub 上記のように複数のコマンドボタンを関数化して一つにすることは出来るでしょうか?

  • エラーになる理由とならない理由は?

    同じアプリケーション内にBook1.xlsとBook2.xlsを開き、 Book1.xlsのSheet1に アクティブエックスのコマンドボタンを設置して、 Private Sub CommandButton1_Click() Range("a1").Select End Sub としました。 このコードは問題なく実行できますが、 Book1.xlsのコマンドボタンから、 「Book2.xlsのSheet1を選択する」というコードをしたい時に、 Private Sub CommandButton1_Click() Windows("Book2.xls").Activate Range("a1").Select End Sub をすると、 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」 になります。 しかしなぜかRangeの前にSheets("Sheet1")を入れて Private Sub CommandButton1_Click() Windows("Book2.xls").Activate Sheets("Sheet1").Range("a1").Select End Sub にすると、問題なく実行できます。 Book1.xlsにもBook2.xlsにも「Sheet1」と言う名のシートはあります。 なぜ、Sheets("Sheet1").を入れるとエラーにならないのか教えてください。

  • 同じマクロ名でも、違うモジュールならエラーにならな

    同じマクロ名でも、違うモジュールならエラーにならない? エクセルVBAについてご教授ください。 標準モジュールに ――――――――― Option Explicit Sub CommandButton1_Click() MsgBox "" End Sub Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― と同じマクロ名を2つ作ったら、コンパイルエラーになりますが、 上記のコードは一度消して、フォームモジュールに ――――――――― Private Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作り、 標準モジュールに ――――――――― Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作った場合は、エラーにならずにマクロを実行できました。 これは、フォームモジュールがPrivate Subだからでしょうか? フォームモジュールに1つ、 標準モジュールに1つ なら同じマクロ名を使っても、エラーにならないという事でしょうか? よろしくお願いします。

  • エクセル VBA 表示範囲の簡素化

    よろしくお願いします。 下記構文の簡素化ができないでしょうか。 CommandButtonが30個ほどあります。 ーーーーーーーーーー Private Sub CommandButton1_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A1:D7") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton2_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A8:B21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton3_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("C8:D21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub

  • [Q:VBA] 現在のオブジェクトの参照(JavaScriptのthisキーワードに相当するもの)

    こんにちは。 Excel VBAで現在のオブジェクトの参照をすることはできますでしょうか?(JavaScriptのthisキーワードに相当するものはあるのでしょうか?) 下記のようなことをしたいのですが(コード自体に意味はありません。検証用です)。 よろしくお願い致します。 -- Private Sub CommandButton1_Click() キャプション = CommandButton1.Caption MsgBox(キャプション) End Sub Private Sub CommandButton2_Click() キャプション = CommandButton2.Caption MsgBox(キャプション) End Sub ・・・×数十個 ↓↓↓ Private Sub CommandButton1_Click() funcCaption End Sub Private Sub CommandButton2_Click() funcCaption End Sub ・・・×数十個 Sub funcCaption() キャプション = this.Caption MsgBox(キャプション) End Sub

  • Excel VBAでのシートの削除について

    Excel VBAで、シート上に配置されたボタンをクリックすることで、メッセージを出さずにそのシートの削除をしたいと思っています。 サンプルとして、シート上(例えばSheet1)にボタンを1個配置し、 ------------------------------------------------------- Private Sub CommandButton1_Click() Application.DisplayAlerts = False Delete Application.DisplayAlerts = True End Sub ------------------------------------------------------- のようにすると、オートメーションエラーが起きます。 そこで、 Application.DisplayAlerts = True をコメントアウトしてやれば実行はできるのですが、その後別のシートで処理を行う場合には、再度メッセージを表示してほしいと思っています。 ためしに、Sheet1削除後にアクティブになるSheet2に次のようなコードを記述しました。Sheet1同様、シート上にボタンを1個配置しています。 ------------------------------------------------------- Private Sub CommandButton1_Click() MsgBox Application.DisplayAlerts End Sub Private Sub Worksheet_Activate() MsgBox "次に出るメッセージはアクティブ直後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts Application.DisplayAlerts = True MsgBox "次に出るメッセージは変更後のDisplayAlerts設定。" MsgBox Application.DisplayAlerts End Sub ------------------------------------------------------- こうすれば、Sheet1削除後、アクティブになった直後はDisplayAlertsがFalse。その後設定変更してTrueになるかとおもったのですが、結果はFalseでした。しかしその後、ボタンをクリックするとTrueが返ってきました。 いろいろ調べましたが、なぜこのような結果になるのかわかりません。よろしくお願いいたします。

  • Excel VBA ユーザフォーム

    Excel VBAのユーザフォームについて質問です。 UserForm1の枠の中に、CommandButton1とCommandButton2を追加し  Private Sub CommandButton1_Click()  Range("AA3").Select  Range("AA3").Activate  End Sub とし、AA3のセルへデータ入力をしたいと試みましたが、CommandButton1から カーソルが移動しますが、データ入力ができません。 また、この他にも、CommandButton2をクリックすると、AB4のセルへ移動してデータを 入力したいのですが・・・ どなたか、ご教授をお願いいたします。

  • VBAでエラーが出たらメッセージを出す。

    VBAで関数の結果が"#N/A"だったらメッセージをだしたいののですが、うまくいきません。 初心者です。よろしくお願いします。 Private Sub CommandButton1_Click() '商品を検索する If Range("E8").Value = "#N/A" Then MsgBox "この商品サイズはありません!" Else MsgBox "商品あります。" End If End Sub セルE8には「=MATCH($D$1,データ!A:A,0)」が入力されています。 お願い致します。

  • コマンドボタンが実行されません…

    簡単な命令文だと思うんですが、Rangeクラスのselectメゾットが失敗ってエラーが出ます。どうしてなんでしょう?よろしくお願いします。 Private Sub CommandButton1_Click() Sheets("1").Select Range("A1").Select Selection.Copy Sheets("2").Select End Sub

専門家に質問してみよう