• 締切済み

Excelで動的にイベントを作成する方法 2

Excelでシートにコマンドボタンを作成し、そのボタンにクリックイベントを追加したく、No.321427「Excelで動的にイベントを作成する方法」にあるようにやってみたのですが、実行時エラーが出ます。 ご存知の方がいらっしゃいましたら、ご回答お願いいたします。 'ボタン生成 Dim mn As OLEObject Dim nw_sht As Worksheet Dim cdMoj As CodeModule Dim Ln As Long Set mn = nw_sht.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=510, Top:=10, Height:=20, Width:=100) mn.Name = "メニューへ" mn.Object.Caption = "メニューへ" mn.Object.TakeFocusOnClick = False 'イベント追加 Set cdMoj = ThisWorkbook.VBProject.VBComponents(nw_sht.CodeName).CodeModule Ln = cdMoj.CreateEventProc("Click", mn.Name) cdMoj.InsertLines Ln + 1, " Load メニュー" cdMoj.InsertLines Ln + 2, " メニュー.Show" 'ここまで エラー:実行時エラー424 オブジェクトが必要です 環境:Excel2000 *えらー終了するとボタンは作成できていて、クリックイベントも機能しています。

みんなの回答

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

このコーディリングのエラーの原因をお尋ねのところ 別のことを申し上げて済みません。 コマンドボタンコントロールは、ツールボックスから手動で貼りつけするのが、VB(A)ひいては、最近のソフト界の推奨のようですが、どうですか。それなら簡単だし、ダブルクリックして出てくる Private Sub CommandButton1_Click() End Sub にコードを書けばエラーは起こらないのでは。 コーディング例を真似たためか、こうするべきものなのか、随分難しい高等な?組み方構成になっているように見えますが、私のように学習不十分なものには、良く判らないのですが。

tamatsu_13
質問者

お礼

シートにコマンドボタンを置いておければ、 もちろんおっしゃる方法をとりますが、 今回は都度新しいシートが対象のため、 ボタンの生成とイベントの追加を動的に行いたかったのです。 説明が分かりにくくてすみません。 ただ、いろいろ調べましたが一般的によく使われる方法でないのは確かなようですので、 シートに貼り付ける以外の方法を考え中です。 また何かアドバイスがありましたらよろしくお願いします。 ありがとうございました。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

かなり前に考えたことがあります。 だいぶ忘れてしまいましたが、下のようにすれば動きませんか。 『Name』プロパティになにか意味があったと思いますが、忘れてしまいました。 Sub AddButton()   'ボタン生成   Dim mn As OLEObject   Dim nw_sht As Worksheet   Dim cdMoj As CodeModule   Dim Ln As Long   '//== 追加 ====================   Set nw_sht = ActiveSheet   '==============================   Set mn = nw_sht.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _                    Link:=False, DisplayAsIcon:=False, _                    Left:=510, Top:=10, Height:=20, Width:=100)   '//== コメント行に変更 =========   'mn.Name = "メニューへ"   '==============================   mn.Object.Caption = "メニューへ"   mn.Object.TakeFocusOnClick = False   'イベント追加   Set cdMoj = ThisWorkbook.VBProject.VBComponents(nw_sht.CodeName).CodeModule   Ln = cdMoj.CreateEventProc("Click", mn.Name)   cdMoj.InsertLines Ln + 1, " Load メニュー"   cdMoj.InsertLines Ln + 2, " メニュー.Show"   'ここまで End Sub

tamatsu_13
質問者

お礼

今回はフォームを使うことでこの問題を回避することにしました。 ありがとうございました。

tamatsu_13
質問者

補足

ご回答ありがとうございます。 やってみましたが同じ状況でした。 『Name』のところだけ『.Object』がいらないのはなんでかなと思っていたんですが、私もよく分かりません。。 あとコードの部分、見やすく整形していただいてありがとうございます。

関連するQ&A