- ベストアンサー
【Excel】シート名について(マクロ)
Excel2003を使用しています。 あるマクロで Sheets("2007 年 01 月分").Select の選択するシート名が変更されても、そのシートを選択することはできないでしょうか? 例えば、コードを書いたときのシート名は『2007 年 01 月分』で、上記のようにコードを書いていて、次回、そのマクロを実行するときに、シート名を『2007 年 02 月分』に変更しても、同じ(元の)シートを選択してマクロが実行されるようにしたいのですが、そういうことはできますか? できるかできないかだけでもわかると助かります。 もし、できる場合は、どのようにすればいいのでしょうか?説明が足りないようであれば補足しますので、よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
出来ます。 プロジェクトエクスプローラが表示されていれば ツリーが表示されています。 そこに、「Sheet1(シート名)」と表示されるので、 Sheets("シート名").Select とコードを書きますが、 シート名ではなく、シート番号で下記のように Sheet1.Select とするとシート名に関係無く指定できます。
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。Wendy02です。 誤解をされている方もいらっしゃるようなので、ちょっと実例を添えて書き加えておきます。 私は、掲示板で書かないマクロは、基本的にユーザーさんが、シート名を書き換えてもよいように、マクロを作ります。それは、他の人が使うという意味において、「公」ということになるかもしれません。 たとえば、プロパティウィンドウの「オブジェクト名」に、MyDataShtと名前をつけて、以下のマクロを実行すると、 Sub test() Dim a, b a = ActiveSheet.Name b = ActiveSheet.CodeName Debug.Print "Sheet Name: "; a, "Code Name: "; b End Sub 'Imeadiate Window: Sheet Name: Sheet1 Code Name: MyDataSht と食い違いが出ています。マクロ側からの名前は、MyDataSht なのです。その名前を使って、VBAが書けるわけです。MyDataSht.Name など。 プロジェクトウィンドウの中でみると、 --□ MyDataSht(Sheet1) となっています。 Sheet の名前(Name)というのは、つまり、シートタブで名前の変えられるものです。 Code Name(オブジェクト名)というのは、意図的に変えなければ変えられません。デフォルトでは、Sheet1, Sheet2, Sheet3 とはなっていても、これは、便宜的なのです。これを、プログラマが名前をつけてよいわけです。そして、出来れば、その後、VBAProject にプロテクトをする、というのが良いわけです。 Sheets(Index)方式の場合は、Workbook に、シート構成のプロテクトをしなければいけません。あまり、お勧め出来ません。 なお、直接関係ないかもしれませんが、VBAProject(ブック名)というのも、本来、一意の(ひとつしかない)名前に換えるのが良いです。ですから、私の場合は、PERSONAL.xls のプロジェクト名も換えてあります。
お礼
Wendy02 さん、こんにちは。 再度の回答ありがとうございます。 記載されていたマクロを実行して、実際に自分で確かめたことによって、Wendy02 さんのおっしゃっていることを改めて理解することができました。 わかりやすくて丁寧なご説明で、大変参考になりました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
シート名について履歴を持っているわけではないので、VBAで旧名から新名を割り出したり、その逆はできないでしょう。 それで (1)その実行の都度、人間に指定させる方法(面倒ですが) (2)シート・インデックスによる方法 これは操作者がシート名タブの順番を変えたらお手上げ・終わりで こんなものに頼ってはいけないと思います。 (3)シート番号は使える可能性があります。 当初のSheet1をシート名の変更でaに変えて Sub test02() MsgBox Sheet1.Name End Sub を実行すると、aと表示されることから 今までどおりの、名前による指定の、Worksheets(a)として 使えると思います(回りくどいですが)。 月が移ると、データを入力するシートを別にして入力するのが常態で、やはり人間の確認とシート名の応答指定が行われるべきではないでしょうか。 普通、公で使うエクセルシート名を変えるなんて危険な行為です。 元10月のシートの上から11月のデータを打ち込み11月とシート名を変えるなんてないでしょう。
お礼
回答ありがとうございます。 >月が移ると、データを入力するシートを別にして入力するのが常態で、やはり人間の確認とシート名の応答指定が行われるべきではないでしょうか。 普通、公で使うエクセルシート名を変えるなんて危険な行為です。 元10月のシートの上から11月のデータを打ち込み11月とシート名を変えるなんてないでしょう。 今回質問させていただいたマクロは、ある書式の一部をコピーしたりクリアしたりするだけで、データの入力には関係ありませんし、私個人が仕事上の手間を省くためだけのものです。もちろん公で使うようなこともありませんので、危険なことも全くありません。 質問文にはマクロの内容は書いていませんでしたし、例として書いていたシート名がimogasi さんが回答に書かれたようなことを推測させたようで、お手数をかけてしまいました。。。 他の回答者様の方法で解決しましたので、また機会がありましたら、よろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #3 さんのおっしゃるとおりですが、 >シート名ではなく、シート番号で下記のように シート番号ではなくて、オブジェクト名(CodeName)です。 シートの番号のSheets(Index) は、順序でしかありませんので、並べ替えられたら、特定できません。オブジェクト名を、固有のものにしておけば、シート名を変えても、オブジェクト名で選択できます。オブジェクト名は、手動では、VB Editor 上のプロパティ・ウィンドウから、または、たとえば、マクロのWorksheets("Sheet1").CodeName としてしか変更出来ません。
お礼
Wendy02 さん、こんにちは。 今回もわかりやすく説明してくださり、ありがとうございます。 またひとつ勉強になりました。ありがとうございました。
- ham_kamo
- ベストアンサー率55% (659/1197)
もしシートの順番が固定されているなら、 Sheets(1).Select のように、左から数えた1番目のシート、というように数字で指定することができます。
お礼
ham_kamo さん、いつもありがとうございます。 シートの順番を変えることはありませんので、教えていただいた方法でもできました。 ありがとうございました。
- stiffels
- ベストアンサー率34% (25/72)
Sheetsはシート名だけでなくシート番号でも指定できるので Idx = Sheets("Name").Index Sheets(Idx).Select などとして、あらかじめ取得したシート番号を使用してみてはいかがでしょうか?
お礼
早々の回答ありがとうございます。 おかげさまで、希望通りのことができました。 ありがとうございました。
お礼
回答ありがとうございます。 プロジェクトエクスプローラに表示されている、「Sheet1(シート名)」が気にはなっていたのですが、マクロ勉強中でして、どうしたらいいのかわからず、質問させていただきました。 丁寧に説明してくださり、助かりました。ありがとうございました。