• ベストアンサー

Excel VBAでオブジェクト名を変更する方法

Excelでシートを新規追加するマクロを作っています。この時、下記のようなコードでシート名を変更するのですが、同時にオブジェクト名も変更する事は可能でしょうか? Sheets.Add ActiveSheet.Name = "テスト" なぜオブジェクト名も変更したいのかと言いますと、動的にイベントプロシージャを作成する際、下記のようなコードを記述してるのですが、シート名とオブジェクト名が一致してないとエラーが出てしまうんです。 Dim cdMoj as CodeModule Dim Ln as Long Set cdMoj = ThisWorkBook.VBProject.VBComponents(ActiveSheet.Name).CodeModule Ln = cdMoj.CreateEventProc("Click", "Command1") cdMoj.InsertLines Ln + 1, "MsgBox ""VBAで追加したマクロです。""" なにか良い方法がありましたらご教授下さい。どうぞ宜しくお願いします。

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

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

今度の質問での変更点は (1)シートを追加して、その追加したシートにコントロールを追加する。 (2)追加するコントロールのコントロール名を指定した名前にしたい。 でしょうか。(2)の意味合いがよく分かりませんが・・・・"Command1"が使ってありますね。 (2)は行わなくてもエラーは出ないような気がしますが・・・。コントロール名をVB風にしたいなら話は別ですが。 追記と修正をしてみました。『'//////////』が変更箇所です。 (1)については、シートを追加し、シート名『テスト』にして、    追加したのでVBE内の sht.Name を sht.CodeName に変更しています。 (2)については、ボタンを追加した後、コードを書き込む前に、コントロール名を変更しました。 Excel2000です。ご参考に。(コードを見て、前回の質問<321427>に対する回答を使いました。) Sub Add_ButtonAndMacro()   Dim bk As Workbook   Dim sht As Worksheet   Dim rg As Range   Dim obj As OLEObject   Dim cdMoj As CodeModule   Dim Ln As Long   Application.ScreenUpdating = False   Set bk = ThisWorkbook   Sheets.Add '////////// シートを追加   Set sht = ActiveSheet   ActiveSheet.Name = "テスト" '////////// シート名を変更   Set rg = sht.Range("C4:G6")   With rg     Set obj = sht.OLEObjects.Add(classtype:="Forms.CommandButton.1", _                 link:=False, displayasicon:=False, _                 Left:=.Left, Top:=.Top, _                 Width:=.Width, Height:=.Height)   End With   obj.Object.TakeFocusOnClick = False   obj.Object.Caption = "VBAで書いたメッセージ呼出し"   obj.Select '////////// 追加したボタンを選択   Selection.Name = "Command1" '////////// ボタン名を変更する   '////////// sht.Name→sht.CodeName に変更   Set cdMoj = ThisWorkbook.VBProject.VBComponents(sht.CodeName).CodeModule   Ln = cdMoj.CreateEventProc("Click", obj.Name)   cdMoj.InsertLines Ln + 1, "MsgBox ""VBAで追加したマクロです。"""   'VBE画面を閉める。   Application.VBE.MainWindow.Visible = False   rg.Select '////////// この状態ボタンを選択しているので、それを解除する   Application.ScreenUpdating = True End Sub

Elvin
質問者

お礼

前回に引き続き、詳細なご回答を頂き本当に感謝しております! 今Excelで作成しているのは、ガントチャート作成マクロです。フォーム上で日付を指定すると、シート上に帯(オビ)を作成します。で、その帯をクリックすると編集できるような仕組みにしようと思い、奮闘していました。ここでのご回答がすごく参考になり、だいぶ出来上がってきました。本当にありがとうございます!

その他の回答 (3)

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

補足頂いてお手数をお掛けしました。 ●私の例では当初BookにはSheet1~Sheet4まで作成される 設定になっています(前提)。 ActiveWorkbook.Worksheets.Add.Name = "aaa"で追加されるシートはSheet5(Sheet(5)で(4)ではなかったと思う)であって、そのVBAProject1(Book1)のSheet5の()内は (aaa)となっていますが。 Sheet1(Sheet1)をSheet1(bbb)にしたいなら、 Worksheets("sheet1").Name = "bbb" を実行すればそうなりますが。(テスト済み)これでは ダメですか。 ●「動的にイベントプロシージャを作成する」とは、 普通にイベントプロシージャを作ることに過ぎず、操作者 がクリックするとかのとき実行されるわけで、「動的」なのは どのイベントプロシージャも動的なのでは。

Elvin
質問者

お礼

ご回答ありがとうございます! 動的なイベントプロシージャ作成という表現は、正しいかどうかよく分からず使っていました。今後またなにかヘンな表現があったらご指摘下さい(^^;

回答No.2

オブジェクト名はCodeNameプロパティ(値の取得のみ可能)で取得できますから VBComponents(ActiveSheet.CodeName) で指定できます。

Elvin
質問者

お礼

ご回答ありがとうございます!CodeNameプロパティを使用してみたところうまく動作しました!オブジェクト名自体を変更しなくてもこれでうまくいきそうです。ありがとうございました。

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

●Sub test01() ActiveWorkbook.Worksheets.Add.Name = "aaa" End Sub または Sub test02() ThisWorkbook.Worksheets.Add.Name = "bbb" End Sub でaaa(またはbbb)というワークシート名のワークシートが加えられますが、こう言う質問ではないでしょうね。 aaa,bbbは既に同名のシートが存在しないこと。 ●さて VBAでのオブジェクトはWorkbook、Worksheet、Rangeなど 色々ありますが、ここでいう「オブジェクト」とは何を 指すのですか。コードモジュール?VBAProject?VBComponent? 「動的にイベントプロシージャを作成する」とはどういうニーズのことですか。

Elvin
質問者

お礼

ご回答ありがとうございました!。 オブジェクトについてですが、Excel VBAのプロジェクトウィンドウを開くと「Microsoft Excel Objects」というフォルダがあって、その中に Sheet1 (Sheet1) のような表示がありますよね? で、シート名を変更すると Sheet1 (aaa) のようになります。この状態だとシートの名前は aaa になっても、シートのオブジェクト名は Sheet1 のままです。このオブジェクト名も aaa に変更する方法についての質問でした。 「動的にイベントプロシージャを作成する」というのは、「クリックするとメッセージボックスを表示するボタン」の作成を、マクロで実行するための動作です。

関連するQ&A