1

複数のタブを持つ Excel ファイルがあります。正常に動作しているコードを含むワークシートがあります。このコードは、一部の「マスター」タブのデータも参照しています。このシートを複製する必要があるため、共通機能をそこからモジュールに移動しました。同じワークシートの範囲にアクセスしようとすると、VBA1004エラーが発生します。

 Dim selectedRange As Range
 Set selectedRange = Worksheets(name).Range("A1", _
 Range("A" & Rows.count).End(xlUp)) 'Error Line

このコードは、モジュールに移動するまで正常に機能しました。私が入れればそれは動作します

Worksheets(name).Select 

その前に、しかし、私はあまりにも多くを行う必要があります。このクエリに基づいて: VBA エラー 1004 - 範囲クラスの選択メソッドが失敗しました。 コードは.Select. コードがワークシート内にある限り、それは実行されます。コードをモジュールに移動すると問題が生じるのはなぜですか?

4

2 に答える 2

1

オブジェクト修飾子なしで Range プロパティと Rows プロパティを使用します。オブジェクト修飾子なしで使用すると、このプロパティはActiveSheet.Range / ActiveSheet.Rows のショートカットになります。

したがって、コードはこれを行います:

Worksheets(Name).Range("A1", ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp))

しかし、 Worksheets(name) はアクティブなシートとは異なる可能性があるため、より良いのは次のとおりです。

Worksheets(Name).Range("A1", Worksheets(Name).Range("A" & Worksheets(Name).Rows.Count).End(xlUp))

With-End With ブロック:

With Worksheets(name)
      Set selectedRange = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
End With

したがって、Range/Rows プロパティが Worksheets(name) ワークシート オブジェクトに適用されることが保証されます。

于 2012-11-28T11:31:30.910 に答える
0

シートで何かを行うとき、そのシートに対する明示的な宣言は実際には必要ありません。

ただし、モジュールで作業して他のシートとやり取りする場合は、作業するシートを指定する必要があります。したがって、範囲を選択するにシートを選択してください。つまり、子を選択する前に親を選択してください :)以下は論理的な説明に過ぎないことに注意してください。正確なコード構文ではありません。

したがって、次のワークシート変数を作成し、必要なワークシート オブジェクトを設定することをお勧めします。

例えば

Dim WS as Worksheet
Dim selectedRange As Range

Set WS = Sheets("Shee1")
Set selectedRange = WS.Range("A1", _
Range("A" & Rows.count).End(xlUp)) 'Error Line

または、すべてのシートを参照したい場合は、各シートのインデックスを使用できます

たとえばThisWorkBook.Sheets(i) 'i is an integer 、ループまたはプログラム構造に応じて何でも。

Select さらに、そのワークシート内の範囲を指すためにワークシートで使用する必要はありません。上記のコードに従って、ワークシートを設定し、処理する必要がある範囲を設定できます。VBA の実行を最適化する場合、select通常はタブーです。また、Excel 2007 では、以前のバージョンのようにアクティブ シートが保持されません。

于 2012-11-28T06:31:04.707 に答える