• ベストアンサー

エクセル2003VBA ワークシートオブジェクト名でオブジェクトを取得する記述について

KenKen_SPの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

> ThisWorkbook.Sheet1.Range("A1").Value > Workbooks("Test1.xls").Sheet1.Range("A1").Value 説明のため...とは思いますが、このような書き方はできません。 > シートオブジェクト名を用いる場合、親オブジェクトはbookでは無い > と言うことでいいのでしょうか? 違います。どのような場合も   Book -- Sheet というツリー構造が崩れることはありません。 下記コードでイメージし易いと思います。   Dim Sh As Worksheet   Set Sh = ThisWorkbook.Worksheets("Sheet1") ' ※   MsgBox Sh.Parent.Name        ' // <-- OK   MsgBox ThisWorkbook.Sh.Parent.Name ' // <-- NG この例でオブジェクト(変数) Sh は、 ※部分で既に親オブジェクト である BOOK を含めてシートを参照しています。※部で親オブジェクトを 明示的に装飾していないコード、   Set Sh = Worksheets("Sheet1") であっても、単に ActiveWorkbook が省略された形に過ぎませんから、 やはり BOOK を親オブジェクトとしてシートを参照しています。 以上を踏まえ、NG コードを考えますが   ThisWorkbook.Sh.Parent.Name は親オブジェクトを2重装飾していることになり、過装飾でエラーです。 身近な例で言えば、   東京都 -- 新宿区   東京都 -- 東京都 -- 新宿区 のような違いですね。人間には2番目に市町村名がくることがわかり ますので、多少イレギュラーな書き方でも理解はできますが、VBA は この原則が崩されると理解不能に陥ります。 コードネームを使うということは、これと考え方は同一です。つまり、   コードネームで呼びだす場合、親オブジェクトである BOOK を   改めて装飾する必要はない。 ということです。

tmgolf
質問者

お礼

KenKen_SP様、ご返答ありがとうございます。 今回ご説明いただいた内容で、自分のコードの記述の エーラーの原因がはっきり理解できました。 このように判り易い例までだしていただき誠に感謝です。 いままで、気づかなかった事などいろいろな事がこの事に より理解できました。 今後ともいろいろご質問させていただく事があるかと思います が宜しくお願いいたします。

関連するQ&A

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

  • ExcelVBAでワークシートのオブジェクト名を調べ、「Sheet(何番)」まであるか調べる方法

    Excelのプログラムで、新規作成の初期段階ではワークシートのオブジェクト名は「Sheet1」とか「Sheet2」とかなってると思うのですが、そのオブジェクト名を調べ、ワークシートの数を調べるコードが分かる方がいれば教えてください。 具体的には書けないのですが、1から順に2、3……とワークシート番号があるかどうか調べ、オブジェクト名とワークシート番号が一致しない、つまり、もうこれ以上ワークシートが存在しない場合、その判定を終了させるようなコードだとは思うのですが…。 回答よろしくお願いします。

  • Access VBAよりシート名を取得したい

    お世話になります。 現在、Accessにてツールを作成しておりますが、VBAより 特定のパスにあるExcelファイルのシート名を取得する必要が あります。 ※当該ツールはRuntime環境にて利用するため、CreateObject  が利用できません。 取得はDAO.Tabledefs を使って取得できましたが、GetObjectを 使って取得する方法をご教授頂けると幸いです。 シート名を取得するExcelファイルが、 C:\test\テスト.xlsxの場合 どのような記述になりますでしょうか。 勉強不足で大変恐縮ですが、ご教授のほど宜しくお願い致します。

  • EXCELでシート名を変更できなくしたい。(VBAです)

    こんにちは。 タイトルの通りなのですが、EXCELでセルの内容の変更はOKで シート名のみ変更できなくしたいのです。 もしくは変更されたら「シート名は変更できません」等のメッセージを出して、元のシート名に戻すと言うのでも結構です。 どのように、またどこに(それぞれのシートのオブジェクトのところ???)書けばいいのか教えて下さい。

  • Excel VBA:ひとつ前に開いていたシート名の取得

    Sheet1,2,3があり、全て同じ種類の「表」が書かれているとします。 例えばクラス名簿だとして、 Sheet1には出席番号1~10の生徒のデータ、 Sheet2には出席番号11~20の生徒のデータ、のように。 各シートのうち、違うのはデータの中身であって、 [出席番号][生徒氏名]などの項目は同じです。 この時、 Sheet1で項目名を変更した時、Sheet2、Sheet3の項目名も同時に変更させたいです。 Sheet1の[出席番号]を[No.]に変更したら、Sheet2,3の[出席番号]も自動的に[No.]に変更させたいです。 また、変更可能なのはSheet1だけでなく、Sheet2の項目を変更した時もSheet1,3の項目を自動的に変更したいです。 常にSheet1の項目を参照するのであれば、 Private Sub Workbook_SheetActivate(ByVal ActSheet As Object) SName = "Sheet1" Sheets(SName).Range("A4:G4").Copy 'Sheet1の項目をコピー Sheets(ActSheet.Name).Range("A4").Select ActiveSheet.Paste '現在アクティブなシートにSheet1の項目をコピー End Sub で可能でした(諸事情によりセル内に「=Sheet1!A4」等と書きたくないです)。 このコードで、 参考するシート名を入れる変数SNameに「1つ前に開いていたシート名」を入れることができれば可能だと思うのですが、 そのようなデータを取得することはできるでしょうか? よろしくお願いします。

  • Excel VBA オブジェクトの指定方法と速度

    Excel VBAについて質問です。 ワークシートを指定するときの書き方には色々ありますが、1~3の速度の順番はどうなりますか? オブジェクトは、変数に入れて使用したほうが速度が速くなるそうなので、 1より2のほうが速いと思いますが、3はどうでしょうか? 1.Worksheets("sheet1") 2.Dim ws As Worksheet   Set ws = Worksheets("sheet1") 3.Sheet1 (VBE画面で表示されるシートのプロパティのオブジェクト名) Excelのオブジェクトについて詳しいかたがいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • EXCEL2007 VBA アクティブでないワークシートの名前を取得したい

    Sheet1とSheet2の【A1セル】【B1セル】には以下の処理が入っています。また2つのシートにはVBAを使って、再計算がされるたびに自身のシート名を表示するメッセージボックスを出力する処理を記述しています。 【A1セル】  リアルタイムで値が送られてくる。 【B1セル】  A1セルの値を使った式 【VBA】  Private Sub Worksheet_Calculate()   MsgBox **************  End Sub ここからが質問なんですが、Sheet3をアクティブシートにしている場合、VBAの「*****」の部分に何と記述すれば、再計算されたシート名を取得できますか?

  • 【Excel】シート名の取得

    Excel2003を使用しています。 シート名をそのシート内のセルに入力する数式に使いたいのですが、関数でシート名を取得することは可能でしょうか? イメージ的には、ヘッダーやフッターにシート名を表示させるような感じで、シート名を変更したら、セルの表示も変更できるようにしたいのですが… 以前、別件で同様のことを質問したことがあり、マクロでなら可能という回答をいただいて、参考のURLも記載していただいていたので、URLを見ようとしたのですが、これが数ヶ月前のことでして、URLを見ることができなくなっていました。 よろしくお願いします。

  • シート名を変更してもVBAでエラーにならないように

    VBA初心者です。 VBAで複数のシートを選択するという動作を行う時、シート名を変更するとエラーになってしまうのですが、どうすれば回避できるのでしょうか?オブジェクト名?が使用できるらしいのですが、エラーになってうまく動作しません。指定の仕方を変える必要があるのでしょうか? 例えば、  Sheets(Array("第1週", "第2週", "第3週", "第4週", "第5週")).Select  Sheets("第1週").Activate と記述してあって、シート名の"第1週"を"9月1日"とかに変更したら、当然エラーになりますが、 左のプロジェクトエクスプローラにある、Sheet1(第1週)の名前の変わらないオブジェクト名"Sheet1"の方で指定したいと思うのですが、単純に名前を置き換えても動作しません。どのように指定すればよいのでしょうか?

  • EXCELのシート名を取得して計算式を入れると

    下記のモジュールでBOOK内のシート名を取得して 一番最初のシートに計算式を入れようとしているのですが シート名が上手く取得できずに困っています. シート名が 「シート名1」,「シート名2」 ならOKですが シート名が 「シート名1-1」,「シート名1-2」,「シート名2-3」 このようにシート名に「-」が含まれると 上手く計算式が入らず セルを見ると =シート名1-'1'!$A$1 と変な所にシングルクオーテーションが挿入されてしまいます。 どのように記述したらいいのでしょうか? For Each objSheet In ActiveWorkbook.Sheets     Worksheets("総表").Cells(1, 1).Value = "=" & objSheet.Name & "!$A$1" Next ご教授ください  、よろしくおねがいします。