新しく質問する

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

役に立った:1件
  • 質問者:Elvin
  • 投稿日時:2002/07/29 17:56
  • 困り度:すぐに回答が欲しいです

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で追加したマクロです。"""


なにか良い方法がありましたらご教授下さい。どうぞ宜しくお願いします。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)
  • 参考になった:0件
  • 回答者:imogasi
  • 回答日時:2002/07/30 11:53

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

通報する

この回答へのお礼

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

  • 参考になった:0件

No.3ベストアンサー20pt

  • 回答者:nishi6
  • 回答日時:2002/07/30 00:42

今度の質問での変更点は
(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

通報する

この回答へのお礼

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

  • 参考になった:0件

No.2ベストアンサー10pt

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

通報する

この回答へのお礼

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

  • 参考になった:0件
  • 回答者:imogasi
  • 回答日時:2002/07/29 20:44

●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?
「動的にイベントプロシージャを作成する」とはどういうニーズのことですか。

通報する

この回答へのお礼

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

「動的にイベントプロシージャを作成する」というのは、「クリックするとメッセージボックスを表示するボタン」の作成を、マクロで実行するための動作です。

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ