[[20130404114739]] 『VBAでつかうシート名について』(にゃにゃ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでつかうシート名について』(にゃにゃ)

 お世話になります。

 VBAで特定のシートを指定したいとき、
 なんと書けばよいですか?

 シート名を勝手に変えられても、シートの並び順を変えられても
 そのシートを指定したのですが。。。

 特定のIDみたいなものはないのでしょうか?


 人はそのシートをどうやって判断するのでしょうか。
 特定のセルで識別できるのであれば、それを判断基準にすればよいと思います。

 あまり推奨しませんが、シートが再作成されることがなく、特定のブックでの
 話であれば VBE で表示されるシートのオブジェクト名(Sheet1(特定シート) と
 なっていたら Sheet1 の方:これはシート名を変えても変わりません。)で
 指定する方法はあるかと思います。
 (Mook)

書いてるあいだにだぶりましたが。
やはりシート名での操作が正しいだろうと思いますが。
CodeName はSheet1から順次作成されて シート名が変更されても変わらないです。  

'事前準備 : Sheet1,2,3,4,5 で Sheet3をSheet3X に名前変更して最右に変更
Sub ATest()

 Dim Ws As Worksheet
    Sheet3.Activate                 'CodeName 指定 または 下記の2文

    Set Ws = Sheet3                 'CodeName 指定 または Sheets("Sheet3x")
    Ws.Range("A1").Value = "Test"
End Sub

(Cod)


 CodeName か シート名か というテーマは、別の板でも、何度もディスカッションされていて
 おおむね、プロ級の人は CodeName を好むようだけど、私なんかは、シート名派。

 CodeName の設定は VBE が行うので、VBE画面を開かない限り、たとえば、シートを追加しても、その時点では
 CodeNameが割り振られていない。VBAでそれを参照しても空白値になっている。
 加えて、VBEを開いて、その時にCodeNameが未割当のシートに自動的にCodeNameが降られた後、
 そのCodeName は【表からは】参照のみ可能なプロパティで、変更するにはVBE画面でシートのオブジェクト名を手作業で変更。
 一方、【裏からは】ThisWorkbook.VBProject.VBComponents("Sheet1").Name = "shSample" こんなコードで
 設定はできる。

 ただ、これにしても、操作者が、そのシートをコピーして。そのシートを削除してしまえば特定できないことになる。

 なやましいところだね。

 (ぶらっと)

 回答ありがとうございます。

 Sheet1,2,3というCodeNameはプログラムを実行させたとき
 左から順に割り当てられると思っていたのですが、
 順番を並びかえても最初に作成したときのままずっと残るのですか?

 同じブック内の処理ですが、
 複数人に配布するので、名称とか並びは各々の分かりやすいように
 付け替えられる可能性がありまして。。。

 (ニャニャ)

 >順番を並びかえても最初に作成したときのままずっと残るのですか?

 一度、シートが3枚ほどある新規ブックで、シート名を "A","B","C" と変更してからVBE画面を開くと
 その時点で左から、Sheet1,Sheet2,SHeet3 というCodeNameが降られているのがわかると思う。
 左上のプロジェクトとエクスプローラで Sheet1(A) とか Sheet2(B) となっているね。
 ( ) の中がシート名。
 で、エクセルに戻って、A,B,Cの順番を変えた後、VBE画面を開いてみて。
 順番をどのようにしようが (A)というシートのCodeName は Sheet1 のままだということがわかると思う。

 (ぶらっと)

 >>順番を並びかえても最初に作成したときのままずっと残るのですか?
そうです。なので分かりやすいようで Codename と Sheet名(ユーザーの付けたもの)
がミックスしてくると 非常に混同しやすくなります。

通常は大切なシートは保護などによって変更されないようにする方法だと思いますよう。

(Cod)


 失礼します。保護も、今回の場合悩ましいところがあるようですねぇ。

 シート保護では、シート名の変更はできてしまいます。
 ブック保護をかけておくとシート名の変更はプロテクトできますが、操作者がシート順をかえるとか
 シートの挿入、削除もできなくなるんですよねぇ・・・

 なので、CodeName やむなしかとは思いますが、Codさん指摘の通り、デフォルトでつけられた
 Sheet1,Sheet2,・・・といったCodeNameは確かにわかりにくいですねぇ。
 シート名がかえられていくうちに、何が Sheet1 だったか、思い出せなくなる。
 CodeNameを使うにしろ、VBE画面をあけて、プロジェクトエクスプローラでシートを選択して
 下にあるプロパティの オブジェクト名 のところを Master とか TableList とか Input とか
 そういった、何だっかかを推測しやすいCodeNameに変えておくことがよろしいかと。

 (ぶらっと)

 案1 CodeNameを使う方法

 Sub main()
    Dim sht As Worksheet
    Set sht = Worksheets.Add
    omajinai
    DoEvents
    sht.[_CodeName] = Worksheets("sheet1").Range("a1").Value
    MsgBox sht.[_CodeName]
 End Sub
 '=================================================================
 Sub omajinai()
    CommandBars("Control Toolbox").FindControl(ID:=222).Execute
    SendKeys "%{F4}", True
 End Sub

 omajinaiの実行で何とかなりませんか? 2010でも作動しましたよ!!

 2002でも既に確認済み

 つまり。Codenameで管理してみては? ということです。

 案2

 名前の定義で管理する方法

 Sub test2()
    Worksheets("sheet1").Range("a1").Name = "セルa1"
    MsgBox Application.Range("セルa1").Parent.Name
 End Sub
 
 変更できてしまうという難点はありますが、名前を非表示にして、
 超レアな名前にしておけば まあ大丈夫ではないですか?
 シート名の変更では影響されないですね
 エラーが出れば、なくなっていると解釈すればいいじゃないですか?
 シートの更新が激しいと厳しい面もありますけど・・・。

 以上ですが、検討してみてください

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=205;id=FAQ

 ichinose


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.