あなたが行うと:
Set r = Range("A1")
あなたは何ですか本当にやってこれです:
Dim r As Variant
Set r = Application.ActiveSheet.Range("A1")
だから、すべての変数を宣言し、常にすべてのモジュールの上部にOption Explicit
を指定 - VBAが宣言されていない変数(またはタイプミス)を使用してコードをコンパイルすることを拒否しますそのように。そして、明示的な型を使用して変数を宣言:
Dim r As Range
Range
オブジェクトは、それが属するワークシートでそのParent
、知っています。その理由は、あなたが指摘したように、この範囲はアクティブなワークシートに有効です。とにかく99.999%の時間を費やす必要がない別のシートをアクティブにしても、そのシートに残ります。それは非常に特定のワークシート上の非常に特定のアドレスを指すローカルオブジェクト変数だ - r
がWorksheet
オブジェクトのメンバーではないので
Worksheets("Sheet42").r.Value = 1
:あなたがこれを行うことはできません理由です
。
Dim sheet As Worksheet
Set sheet = Worksheets.Item("Sheet42")
そしてWorksheets
コレクションのItem
プロパティがObject
を返し、すべてのメンバーがあなたを呼び出す意味:あなたはWorksheets("Sheet42")
行う際さて、あなたは本当に、そのItem
プロパティですWorksheets
コレクションクラスのデフォルトプロパティを、アクセスしていますそれは実行時に遅延バインディング/解決になるだろうされた後に追加します。
Dim obj As Object
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway
実行時に、VBAはAnythingYouWantHereWillCompileAnyway
を探すために、オブジェクトのインターフェイスを照会し、そのメンバーを見つけることができません - それは方法ですあなたは実行時エラー438 - "オブジェクトはこのプロパティまたはメソッドをサポートしていません"。
あなたは、つまりは、代わりにObject
のWorksheet
インタフェース/クラスでは動作し、早期バインドのコールと協力して(代わりに、実行時の)コンパイル時に戻ってその型の安全性を移動することができます。
Dim obj As Worksheet
Set obj = Worksheets.Item("Sheet42")
obj.AnythingYouWantHereWillCompileAnyway 'nope. that won't compile anymore.
(別のワークシートにすでに設定されている範囲を割り当てるにはどうすればよいですか?の場合、Range
オブジェクトはアドレス以外のものであると仮定しています。その仮定は間違っています。
Range
は、多くは以上のアドレスです。それが単なるアドレスであれば、オブジェクトではなく文字列リテラルになります。
あなたがアドレスを表す変数が必要な場合、あなたはString
変数であることを行うことができます。修飾されていない `Range`が暗黙的に呼び出すことを認識すると、` `SELECT`とActivate`をデフォルトではないため
Dim a As String
a = "A1"
Dim r1 As Range
Set r1 = Sheet1.Range(a)
Dim r2 As Range
Set r2 = Sheet2.Range(a)
賞賛アクティブシートを参照してください。 –