Excel vba をはじめて1ヵ月程度の初心者ですが、すいません質問させて下さい。

シートをCodeNameでSheets()みたいに指定はできるのでしょうか?
また、図形をIDでShaps()みたいに指定する方法はあるのでしょうか?

どちらも名前(.Nameの方)は変えてある状態です。
例えばアクティブシート名は"テスト"、図形名は"サンプル"みたいな状態です。
名前は自由に変えていきたいのですが、名前が変わってもかわらず指定できるようにしたいです。

Sub test1
Debug.Print Activesheet.Name
Debug.Print Activesheet.Index
Debug.Print Activesheet.CodeName
Debug.Print Excel.Selection.Name
Debug.Print Excel.Selection.Index
Debug.Print Excel.Selection.ShapeRange.ID
End Sub

どなたか御教授おねがい致します!!

このQ&Aに関連する最新のQ&A

A 回答 (3件)

質問者は多言語の熟練者ですか。

VBAも相当な経験者とか。初心者はこんな質問はしませんね。
Sub test1()
MsgBox ActiveSheet.Name
MsgBox ActiveSheet.Index
MsgBox ActiveSheet.CodeName
'MsgBox Excel.Selection.Name
'MsgBox Excel.Selection.Index
'MsgBox Excel.Selection.ShapeRange.ID
End Sub
をやってみるとコメントアウトした行以外は動きます。
CodeName
http://kobobau.com/xls/yama/vba/worksheet1.html
ーー
テストで7シートに増やしました。
Sub test03()
Dim sh As Worksheet
For Each ws In Worksheets
MsgBox ws.CodeName
Next
End Sub
Sheet7からSheet5、Sheet1からSheet4
と表示されます。
Sheet6とSheet2を名前を変えました。
Sub test04()
MsgBox Sheet6.Range("A1")
MsgBox Sheet2.Range("A2")
End Sub
で正しくそのシートの値を取ってきました。
だからワークシートについては、VBAの中ではこういう使い方で役立つと思います。
ーーー
>Excel.Selection.Name
とは何をイメージしているのか。
Googleで「Excel.Selection.Name」としてもこの質問以外記事なし。
選択されているシートのシート名のことか?
複数シートを選択しているときはそういうのはニーズが有るが1つだとActivesheetと変わらないような。
ーーーーー
Shapeについては、名前(Name)はVBAでしか変えられない(操作では変えられない)と思いますが。
作成当初「Oval 4」と言う図形が有る。
Sub test07()
ActiveSheet.Shapes(2).Name = "TTT"
End Sub
でTTTに変えた。
Sub test08()
MsgBox ActiveSheet.Shapes("Oval 4").Name
End Sub

TTTと出ることから、Oval 4は名前が変更されても、識別に使えるのではないか。

この回答への補足

御回答ありがとうございます!
imogasiさんすいません。嬉しいですが、実際にVBAを始めたばかりで他言語は全くです。。。
Sub test04()は目から鱗です!!この回答を頂きたかったです!!
バージョンによるのかもしれませんが、shapeの名前は名前ボックスで変更できました。
Sub test07()とSub test08()はなるほどです。
御指導を参考にちょっといろいろ試してみます!
参照して下さったページをちょっと見てみます!

↓は何か図形を選択した状態で実行しないとエラーになってしまいます。すいません!!
Sub test1
Debug.Print Excel.Selection.Name
Debug.Print Excel.Selection.Index
Debug.Print Excel.Selection.ShapeRange.ID
End Sub

補足日時:2009/05/15 22:16
    • good
    • 0
この回答へのお礼

出来ました!!
imogasiさん、どうもありがとうございます!!
参照して頂いたページは難しいですね、勉強してみます。
御回答どうもありがとうございます!!

お礼日時:2009/05/16 19:35

こんにちは。



ご質問者さんの場合は、一ヶ月程度のレベルだというと、通常は、だいたい、基本構文が終わって、VBA関数のところに入るかどうか、または、人によって、UserForm の設定を始めるところに入るのではないか、と思います。まだ、Sheets とWorksheets の違いすら分からない状態だと思います。

前回の、2次元配列変数にオブジェクトを入れたり、また配列変数の中から、最大値を特殊な方法で求めようとしていましたが、ふつう、プログラムの経験のない人は、そんなことは思いつきもしません。もし、どこかのネットで見たコードなら、そういうところに手を出さないほうがよいと思います。

#2で、imogasiさんが、他の言語の熟練者か、VBAの相当な経験者かと、お聞きになるのも当然だと思います。そういう質問は、ある程度の経験のある回答者は、警戒してしまいます。

>名前は自由に変えていきたいのですが、名前が変わってもかわらず指定できるようにしたいです。

今回の質問は、通常、実践のテクニックでしか出てこないものです。#2のimogasiさんのリンク先の5番目のプロシージャ--ループしてCodeName をヒットする使い方は、残念ながら、あまり意味がありません。実際に使う必要性がありません。

シート名を変えてもコードにエラーを出したくないという質問は、某VBA専門掲示板で読んだことがあります。VBAの経験者さんたちは、Windows をブロテクトすればよいというのが、多くの人の意見で、通常、マクロ処理を目的としたブックのシートの名前を、ユーザーに自由に変えられることを許すことまで、一般的に考えないからです。

>シートをCodeNameでSheets()みたいに指定はできるのでしょうか?

結論から言うと、その質問自体はできません。ループしたり配列変数に入れるなどは、テクニックだけです。しかし、一意のシートとして扱うことも可能ですが、自分なりのテクニックを開発するしかありません。私自身、その解決方法は持っています。そういうことは経験の中で覚えることで、教わることではないと思います。

VBAを覚えるためには、自分で考え抜いて、こんな使い方があるのかという驚きや、自分で開発する喜びがないと、つまらないと思います。残念ながら、前回の私の回答で、あるテクニックを使ったのですが、それにはお気づきにならなかったようです。それとも、ご存知だったかもしれませんね。私には、tkh_tkhさんは、あまりにもテクニックに走りすぎているようには思いましたが、世の中は広いもので、だいたい、3ヶ月で、上級コースを終えてしまい、半年で一通りOffice 全体のVBAのプロレベルまで覚え、その後は、ASPやJavaScript,Wscrip などを始め、Cや.Netなどの他言語で補充して、2年でVBAのプロになる人もいます。VS2008やVSTO や高価な書籍を購入しなければならなくなってきます。しかし、どうやら、それ以上の人たちもいるようですね。

そういう人たちと、私などでは、悔しいけれども、最初のスタート時点から違います。そういう人は、掲示板の質問者ではなく、突然、ベテランとして掲示板に登場してくるようです。ここのカテゴリで、「専門家」と書いている人がいますが、VBAのプロなんていうのは、本来、存在しないに等しいです。VBAインストラクタなら養成機関もあり、可能でしょうけれども、VBAのプログラミングで食べられる人は少ないからです。ともかく、なるべく自分で調べながら、頑張ってみてください。

余計なことを書きすぎ、失礼しました。
    • good
    • 0
この回答へのお礼

Wendy02さん御回答ありがとうございます!
>余計なことを書きすぎ、失礼しました。
とんでもないです!アドバイスとして受けとめさせて頂きます!
Wendy02さんには何度か御回答頂いていますが、御礼として申し上げる言葉も少なく、申し訳なく思っています。
(でも、プログラムの経験は一切ありません。なので、素人そのもので、特殊であったり、テクニックなのか、基本事なのかの境界が分からない状態です。危険なコードになり得るという事ですね。御迷惑もかけていたら申し訳ないです。)
御回答して頂けた皆様のおかげで、相当理解を助けて頂いています!VBAを楽しまさせて頂いてます!
今後も宜しくお願い致します!

お礼日時:2009/05/16 19:31

Sub TS()


 sNumber = 1
 Worksheets(sNumber).Select
 sName = Selection.Worksheet.Name
 MsgBox sName
End Sub

これを実行してみてください
VBAでは左側から1,2,3,,,,という具合に指定できます
ただ、シートのタブの位置を動かすと番号も変わります

この回答への補足

早速の御回答ありがとうございます!
記述して頂いたコードを試してみました!
つまり、Indexで左側から1,2,3,,,となる特性を利用して指定するということですね。
シートが複数ならばそれをカウントしてで、これで名前の変更にも対応しますね!
ありがとうございます!
ASIMOVさんの御指摘の通りの、ただ、シートのタブの位置を動かす場合は、追いかけ方が・・・
やはりコードネームやIDでの指定方法はないという事でしょうか?

補足日時:2009/05/15 21:26
    • good
    • 0
この回答へのお礼

ASIMOVさん御回答どうもありがとうございます。
アドバイスを頂き、非常に勉強になりました!
また御指導お願い致します!

お礼日時:2009/05/16 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング