2017-03-15 15 views
7

設定範囲について質問があります。私が試しているものがあり、それは機能していません。のは、私が書いた、たとえば私は、範囲rを持っているとしましょう:Excel用VBA - 範囲の設定

set r = range("a1") 

しかし、私はworksheet1の午前と私はr.value = 1は、それが値を変更します書く場合には、この範囲は、例えば、アクティブなワークシートに有効ですアクティブなワークシート上のそのセルの今度は、別のワークシートでその特定の範囲の値を変更したいと思います。だから私は書く

worksheets("specificworksheet").r.value =1 

しかし、私はこれを書いたとき、オブジェクトはこのプロパティやメソッドをサポートしていないと言います。何故ですか?別のワークシートの範囲(すでに設定されている範囲)をどのように割り当てることができますか?私の問題を解決するだろう

worksheets("specificworksheet").range("a1").value=1 

を書くしかし、この場合には、somethimes私はcells.find(...)を使用し、R、にセルをassinged場合など、より複雑な範囲を、持っています。 ありがとうございました!

+0

賞賛アクティブシートを参照してください。 –

答えて

4

あなたは使用することができ住所:

worksheets("specificworksheet").range(r.Address).value=1 
2

使用With-End With構文、およびドットによってすべてのRange()(およびCells())仕様の前

With Worksheets("specificworksheet") 
    .Range("a1").Value = 1 
    .Range("B3:C5").Value = 2 
End With 
+0

Downvoter私はこの答えを改善したいと思います。何が間違っているのか教えてください。 (希望@ Mat'sMagは彼の美しいフレーズを盗んで私の気にしません) – user3598756

5

あなたが行うと:

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%の時間を費やす必要がない別のシートをアクティブにしても、そのシートに残ります。それは非常に特定のワークシート上の非常に特定のアドレスを指すローカルオブジェクト変数だ - rWorksheetオブジェクトのメンバーではないので

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 - "オブジェクトはこのプロパティまたはメソッドをサポートしていません"。

あなたは、つまりは、代わりにObjectWorksheetインタフェース/クラスでは動作し、早期バインドのコールと協力して(代わりに、実行時の)コンパイル時に戻ってその型の安全性を移動することができます。

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) 
+1

@Downvoter私はこの答えを改善したいと思います。何が間違っているのか教えてください。 –

+1

再び、はるかに良い説明と解決。私は文字列のアプローチを追加することを考えましたが、その後忙しかった、ちょうど戻ってきましたが、私はそのまま残し、OPがあなたのものに変わることを願っています。 –

+1

OPの実行時エラー438のより完全な説明を含むように編集しました。 –

関連する問題