タイトル : Re^9: Excel処理の繰り返しでNG 投稿日 : 2010/02/20(Sat) 18:26 投稿者 : 魔界の仮面弁士
> Set xlSheet = xlBook.Worksheets(1) > これを記述した段階でアクティブになってしまうのかな? 変数に Set しただけでは、アクティブなシートは切り替わりません。 > そのシートを扱うときには入れるものと覚えてしまったので、無意識に入れてます。 多くの場合、シートを操作する際にシートをアクティブにする必要は無いはずです。 無闇に利用するのではなく、「選択状態にしないと操作できない場合」などの 明確な目的がある場合にのみ使う事をおすすめします。 Activate/Select すると言うことは、そこでフォーカスの切り替えが発生するため、 その分処理効率も落ちますから。(ループ中などで複数回アクセスする場合は特に顕著) > > > Set xlSheet = xlBook.Worksheets("Sheet1") > > > With xlBook.Sheets(2) 前者 [Worksheets] は「ワークシートのみ」が対象で、 後者 [Sheets] は「ワークシート以外のシート」も対象になります。 (マクロシートや、グラフシートなど) > シート名を明確にして宣言したものが上。やはり仕様が違うのでしょうか? 上記のように、Worksheets と Sheets の仕様は異なります。ただし、 名前指定と番号指定の事を指しているのだとしたら、それらは機能的には同一です。 番号指定が良いか名前指定が良いかはケースバイケースなので、 適宜、使い分けていくことになるかと思います。 たとえば、新たなシートが挿入されたり、あるいは既存の不要なシートを 削除したりすると、それ以降のシート番号がずれますよね。 または、ユーザーがシートの順番を変えることもあるかも知れません。 そのような場合でも、.Worksheets(3) ではなく .Worksheets("Sheet3") とすれば 目的のシートを正しく操作できます。 一方、シートを .Copy した時などは、コピー後の新シートを得るために、 番号(Index)が必要になってくるかと思います。 > 実は、"Sheet1"をコピーする前に、シートの名前を変更しております。 > xlBook.Sheets(1).Name = "Test1-" > xlSheet.Copy After:=xlBook.Sheets(1) 上記の「xlSheet」変数の中身は何ですか? Worksheets でしょうか。それとも Worksheet でしょうか? シートだとしたら、それは Sheets(1) でしょうか? Sheets(1) 以外でしょうか? 変数の中身が分からないので、何をどこにコピーしようとしているのか 読み切れませんでしたが、プログラムの途中で番号や名前が変化する場合には、 Set xlSheet1 = xlBook.Worksheets("Sheet1") Set xlSheet2 = xlBook.Worksheets("Sheet2") xlSheet2.Name = "Test1" xlSheet1.Copy After:=xlSheet2 のように、あらかじめ変数に Set しておき、それを使った方が混乱が少ないかと。 > 途中で名前を変えてしまう様な時には、Set xlSheet = xlBook.Worksheets(1) > こちらの方が宜しいのでしょうか? どちらでも良いとは思います。ただ、名前を変更する場合に限らず、そのシートを 繰り返し呼ぶ場合には、変数を用意した方が便利だとは思います。 たとえば xlBook.Worksheets(1) というコードは、 ・変数 xlBook は、Workbook オブジェクトである。 ・Workbook オブジェクトの Worksheets プロパティから、Sheets オブジェクトを取得。 ・Sheets オブジェクトの 既定のプロパティから、Worksheet オブジェクトを取得。 という段階を経て、Worksheet オブジェクトを得ますが、xlSheet に格納しておけば、 このプロパティ呼び出しを省略できるため、ループ回数が多い場合には有効です。 (もっとも、数回程度の呼び出しなら、その都度 .Worksheets から得ても大差ありません) この他、変数に入れると IntelliSense (入力候補)を活用できるメリットもあります。 たとえば、「xlBook.Worksheets(1).」と打った場合には、入力ヒントが出ませんが、 「xlSheet.」と打った場合には、入力ヒントが利用できるというメリットがあります。 |