• ベストアンサー

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で追加したマクロです。""" なにか良い方法がありましたらご教授下さい。どうぞ宜しくお願いします。

  • Elvin
  • お礼率91% (33/36)

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

  • ベストアンサー
  • 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/17068)
回答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/17068)
回答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

  • 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 *えらー終了するとボタンは作成できていて、クリックイベントも機能しています。

  • EXCEL2000VBA実践プログラミングリファレス「著者:大村あつし

    EXCEL2000VBA実践プログラミングリファレス「著者:大村あつし、栗山 恵吉、田中 博人、出版社エーアイ出版」のサンブルマクロが動かない。 マクロの初心者です。 私のパソコンはエクセル2007を利用しています。 サンプルマクロを動かす以前に、全てのサンプルに With ThisWorkbook.VBProject.VBComponents("Module1") に黄色のエラーが出てしまいます。 なぜかわかればご教示お願いします。 'コードを表示 Function GetCode(ByVal NowProc As String, ByVal NextProc As String) As String Dim myStartLine As Integer Dim myEndLine As Integer 黄色のエラー箇所⇒With ThisWorkbook.VBProject.VBComponents("Module1") myStartLine = .CodeModule.ProcBodyLine(NowProc, vbext_pk_Proc) If NextProc <> "" Then myEndLine = .CodeModule.ProcStartLine(NextProc, vbext_pk_Proc) Else myEndLine = .CodeModule.ProcCountLines(NowProc, vbext_pk_Proc) + myStartLine End If GetCode = .CodeModule.Lines(myStartLine, myEndLine - myStartLine) End With End Function

  • 実行時エラー 2001

    http://officetanaka.net/excel/vba/vbe/05.htm を参考に VBAコードを取得したいのですが Declare Function GetTickCount Lib "kernel32" () As Long Public sampledata As String Sub Sample9() Dim Code As String Code = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(7, 5) MsgBox Code End Sub を実行すると 実行時エラー 2001 'VBProject'メソッドは失敗しました:'_Workbook'オブジェクト が、 Code = ThisWorkbook.~ の行で発生します。 何が間違ってますか?

  • Excel VBA

    外部からモジュールを読み込めるようにしました。 ーーーーーーーーーーーーーーーーーーーーー Sub moduleImport_All() 'インポートしたいファイルのあるフォルダを指定 Dim sImportPath As String sImportPath = "C:\VBA\module\" 'FileSystemObjectの作成 Dim oFso As Object Set oFso = CreateObject("Scripting.FileSystemObject") 'フォルダオブジェクトを取得 Dim oDir As Object Set oDir = oFso.GetFolder(sImportPath) 'ファイル名を順次取得 Dim fFile As Object For Each fFile In oDir.Files 'ファイルの拡張子を取得 Dim sExt As String sExt = oFso.GetExtensionName(fFile.Name) '拡張子からモジュールだけを取得、インポート Select Case LCase(sExt) Case "bas", "cls", "frm" '指定のモジュールをインポート ThisWorkbook.VBProject.VBComponents.Import sImportPath & fFile.Name End Select Next MsgBox "完了" End Sub ーーーーーーーーーーーーーーーーーーーーー しかし、上書きがなされない為、1,2,3とモジュールが増えてしまいます。 読込みたいフォルダ内のファイルと同じ名前であれば全て上書きするにはどのように修正したらよいでしょうか?

  • Excel VBA でExecuteExcel4Macro("GET.OBJECT(48,

    エクセル2000です。 以前、ワークシートに配置したフォームツールのラベルの参照元を取得するマクロをご教示いただき、以下のTest01は問題なく作動しています。 Sub test01() Dim obj As Object Dim i As Integer Dim obj_n As String 'オブジェクトの名前 With ActiveSheet For Each obj In .Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address 'GET.OBJECT で、リンクがないものを取ると、False になる .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub 今回、同一シートではなく別シートに表示させようと以下のTest02を書いたのですが、やってみると .Cells(i, 5) はすべて#VALUE!エラーになってしまいました。 ExecuteExcel4Macro("GET.OBJECT(48~がどのようなものかわからずやっているので応用がききません。(そもそも48って?) どのようになおしたらよいのかご教示いただければ幸いです。 Sub test02() Dim obj As Object Dim i As Integer Dim obj_n As String Dim ws As Worksheet, ns As Worksheet Set ws = ActiveSheet Set ns = Worksheets.Add With ns For Each obj In ws.Labels i = i + 1 .Cells(i, 2) = obj.Name: obj_n = obj.Name .Cells(i, 3) = obj.TopLeftCell.Address .Cells(i, 5) = ExecuteExcel4Macro("GET.OBJECT(48,""" & obj_n & """)") .Cells(i, 6) = obj.OnAction Next End With End Sub

  • VBA オブジェクト型使用の利点は?

    例えばワークシートの表現を考えます。 自分は今まで以下のようにしてました。 Dim sheet1 As String sheet1=Worksheets(1).Name Worksheets(sheet1).Activate オブジェクト型宣言を用いて以下のように書き換えられます。 Dim sheet1 As object set sheet1=Worksheets(1) sheet1.Activate ソースコードとしてはスッキリしますが、見た目以外でどのようなメリットがあるのですか?

  • 【Excel_VBA】オブジェクト名の変数

    ExcelVBA(2007)でシートのオブジェクト名を変数で回したく、下記コードを用いたのですがエラーが出現します。 【コード】 Dim i As Integer For i = 1 To 10 Sheet & i.Activate Next i 【エラー内容】 コンパイルエラー: 修正候補:式 この場合、どのような方法を用いたらシートのオブジェクト名を変数でうまく回すことができるのか、ご教授いただければ助かります。 よろしくお願いします。

  • エクセルVBAの質問 開いているもう一つのブックのシート名をすべて取得する方法

    おはようございます。 現在マクロを実行しているブックのシート名を下のようなコードで取得していますが、これを 開いているもうひとつのブックのシート名を マクロ実行しているシート“しーと1”のJ3セル以降に並べる というように変更したいのですが、下のコードを少し変更して 対応できるでしょうか?教えていただけたら助かります。 Sub シート名() Dim i As Integer Dim mySheetCnt As Integer Dim mySheetNam As String Application.ScreenUpdating = False Columns("J:J").Select Selection.ClearContents Range("J2").Select ActiveCell.FormulaR1C1 = "項目名" mySheetCnt = ThisWorkbook.Sheets.Count For i = 2 To mySheetCnt mySheetNam = Sheets(i).Name Sheets("しーと1").Cells(i, 10) = mySheetNam Next i Application.ScreenUpdating = True MsgBox "シート名更新しました。" End Sub

  • エクセルのVBAでシート名が重なるときの処理 

    お世話になります。 エクセルのVBAにてリストボックスで選択した単語をシート名に 反映させるマクロを作成しました。 が、一度シート名を作ると2回目に同じ単語を選択すると、 デバック?画面になってしまいます。 『同じ名前のシート名は作れません・・・』 希望としては、同じ名前が出たら自動に連番が割り振られる ようなものを希望しています。 マクロの記録で確認しても、やはり同じデバック要画面がでます。 別シートにシート名を反映させて、同じ名前がヒットしたら 文字列を追加して、そのシートに反映し続ける・・・ ようなことは考えられますが、どうも不細工で気が向きません。 もっとスマートな考えがあれば教えていただきたく よろしくお願いします。 参考に作ったVBAを下記します。 これだと、途中でシートを削除してしまうと デバック画面が発生してしまいます。 (マクロの切り抜きなので、  リストで選択したものが反映されるマクロではありません) Dim シート名 As String Dim n As Integer Sheets("伝票マスター").Select Worksheets("伝票マスター").Copy before:=Worksheets("伝票マスター") n = Sheets.Count Sheets("伝票マスター (2)").Select ActiveSheet.Name = "伝票" & n - 1 Range("D2") = n - 1 Range("D1").Select 、

  • オブジェクト名をVBAで指定する方法を教えてくださ

    VBAでワークシートにOLEObjectsのコマンドボタンを設置してるのですが ボタンのオブジェクト名をVBAで指定するにはどうすればいいでしょうか? Private Sub CommandButton1_Click() With ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False) .Object.Name = "ボタン1" .Object.Caption = "ボタン" .Object.Font.Size = 9 .Width = ActiveCell.Width .Height = ActiveCell.Height End With End Sub を実行すると、 .Object.Name = "ボタン1" の部分で 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)」というエラーになります。 他のコードは大丈夫です。 オブジェクト名をVBAで指定する方法を教えてください。 当方エクセル2003です。

専門家に質問してみよう