• ベストアンサー

Excel vba

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 どなたか御教授おねがい致します!!

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

質問者は多言語の熟練者ですか。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は名前が変更されても、識別に使えるのではないか。

tkh_tkh
質問者

お礼

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

tkh_tkh
質問者

補足

御回答ありがとうございます! 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

その他の回答 (2)

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

こんにちは。 ご質問者さんの場合は、一ヶ月程度のレベルだというと、通常は、だいたい、基本構文が終わって、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のプログラミングで食べられる人は少ないからです。ともかく、なるべく自分で調べながら、頑張ってみてください。 余計なことを書きすぎ、失礼しました。

tkh_tkh
質問者

お礼

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

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

Sub TS()  sNumber = 1  Worksheets(sNumber).Select  sName = Selection.Worksheet.Name  MsgBox sName End Sub これを実行してみてください VBAでは左側から1,2,3,,,,という具合に指定できます ただ、シートのタブの位置を動かすと番号も変わります

tkh_tkh
質問者

お礼

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

tkh_tkh
質問者

補足

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

関連するQ&A

専門家に質問してみよう