プロが教える店舗&オフィスのセキュリティ対策術

エクセルでVBAの下記コードで実行すると、実行時エラー'1004'
アプリケーション定義またはオブジェクト定義のエラーとなりますが、

Worksheets("作業用").Activate
Worksheets("職員").Range(Cells(6, 1), Cells(Wrow, 12)).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("a6:c8"), CopyToRange:=Range("d6:z2000"),
Unique:=False

それを下記のようにwith end with構文で囲むとエラーとなりません。
形式的には同じコードに見えるのですが、実質的に何が違うためオブジェクト定義エラーにならないのでしょうか。
AdvancedFilterに限らず、しばしば同様の原因によるエラーに悩まされていますので、ご教示いただければ幸いです。


Worksheets("作業用").Activate
With Worksheets("職員")
.Range(.Cells(6, 1), .Cells(Wrow, 12)).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("a6:c8"), CopyToRange:=Range("d6:O2000"), Unique:=False
End With

A 回答 (1件)

こんばんは。



>Worksheets("職員").Range(Cells(6, 1), Cells(Wrow, 12)).AdvancedFilter

Cells(6,1)とCells(Wrow,12)にシートオブジェクトが付加されてないので
それがWorksheets("職員")のセルだと認識されないからです。

Worksheets("職員").Range(Worksheets("職員").Cells(6, 1), Worksheets("職員").Cells(Wrow, 12)).AdvancedFilter

とCellsにシート名を付加しなければなりません。

>with end with構文で囲むとエラーとなりません。

提示のコードにはCellsの前にドットが付加されてますので
これはWorksheets("職員")が付加されているのと同じになりますから
エラーになりません。

Range,Cellsを使うときはそれがどのシートのものか気をつける必要があります。
で、可能な限り、シート名を付加することをお勧めします。


 
    • good
    • 0
この回答へのお礼

丁寧なご教示まことにありがとうございました。
疑問が解決しました。
どのシートでオブジェクトを参照しているかによって、オブジェクトが参照される場合と参照されない場合があるため、可能なかぎりwith構文でシート名を付加する方が安全だということですね。

お礼日時:2007/04/18 23:03

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