• ベストアンサー

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

Wendy02の回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#1です。 #3さんの内容で、お話は分かりましたが、私が詳しく書かなかったのがいけなかったかもしれませんが、前の書き込みの意味を取り違えていらっしゃるようです。前回の内容は、あくまでも、変更した理由のこちらの推測なのです。別に変えなくても済むものだったかもしれないのです。 >ActiveWorkbook.Test.Range("A1").Value = 5555 >親オブジェクトはbookでは無いと言うことでいいのでしょうか? このような質問が出てくるというのでは、実際に、コンテナ(上位オブジェクトから)の概念とか、オブジェクトの構造が分かっていらっしゃらないように思えます。これらは、基本的なことですから、ローカルウィンドウで、まず、シート・オブジェクトや、その上のParent やオブジェクト名で表されているものは、どういうものか、とか、ご自身で見て研究してください。そうすれば分かります。 ただ、あくまでも、既存のオブジェクト名にすると、シート名と混乱させられるから、ユニークな名前で混乱しないようにしているわけで、シート名"Sheet1"を、"Sheet4"に換えられたからといっても、元のオブジェクト名のSheet1 は替えられてはいないのです。これは、そのブックの中のシートの固有(ユニーク)なオブジェクトの名称です。 実際に、オブジェクトを、そのままSheet1 にしても問題はありません。シート名は、任意で変えられますが、オブジェクト名は、明示的に替えなければ、替えられないということです。それを押さえておいてください。 ThisWorkbook.Sheet1.Range("A1").Value でも、Workbooks("Test1.xls").Sheet1.Range("A1").Value でも、良いわけです。つまり、オブジェクト名(CodeName)自体に気づけば、それはそれで用件は済んでいるわけで、あえて名前を変更する必要などはありません。 最終的には、今度は、プロジェクト名自体をユニークなものにするというのが、システム設計のひとつになっていくのです。これらは、開発の実践のテクニックで、別に、一般的には必要のないのです。 なお、マクロとしては、#2のzap35さんご指摘の、VBComponentsのコレクションに属しているという考え方で操作するほうが、今度は、シートオブジェクト全体(シートモジュールとシート両方)として捉えるには適していると思います。

tmgolf
質問者

お礼

wendy02様いつもご返答ありがとうございます。 ご指摘の通り、まだまだ理解しないままVBAコードを記述している事 が多々あります。こういったご意見をお伺いでき、更にスキルアップ に繋げていきたく思います。 今回ご指摘いただいた、コンテナの概念やオブジェクトの構造について も、最近やっと少しづつ理解できるようになって来たところです。 ご回答で VBComponents と言う言葉がありますが、このこと自体、???であり、ご回答いただ いた内容がつかみきれていないというのが素直な感想であります。 しかしながら、キーワードとして今後自分の勉強に活かしていきたいと 思います。 今後もいろいろご質問することが在ると思いますが宜しくお願い いたします。

関連する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 ご教授ください  、よろしくおねがいします。