2

問題を簡単に説明するために、次のサブを作成しました。アクティブシートの範囲A2:E10を範囲変数に割り当てます。次に、別の範囲変数に、この範囲のサブ範囲であるセル(1、1)を(3、3)に割り当てます。

これにはA2からC4の範囲が含まれると予想していました(A2は最初の列であり、より大きな範囲の最初の行であるため)。ただし、各範囲の最初のセルの.Rowメソッドを呼び出すと、異なる結果が得られます。範囲rが大きいほど「2」が返され、範囲rSubが小さいほど「3」が返されます。

(.Rowメソッドは、呼び出された範囲の絶対行を返します)

どちらもセルA2を参照する必要があるため、これらの呼び出しは両方とも2を返すと予想されます。なぜこれがそうではないのか誰かが説明できますか?

*編集:.Rowメソッドと同様に、各範囲の最初のセルの.Columnメソッドを呼び出すようにsubを変更しました。ご想像のとおり、これにより両方の範囲で「1」が返されます。

Sub test()
    Dim r As Range
    Set r = Range("A2:E10")

    MsgBox r.Cells(1).Row     '= 2

    Dim rSub As Range
    With r
        Set rSub = .Range(.Cells(1, 1), .Cells(3, 3))
    End With

    MsgBox rSub.Cells(1).Row     '= 3
End Sub
4

2 に答える 2

1

かなり奇妙です〜

あなたのコードから同じ結果を得ました。結果は次のコードから得られると思います。

rSub = .Range(.Cells(1, 1), .Cells(3, 3)) を設定します

Range の前のドットを削除すると、期待どおりの結果が得られました

rSub = Range(.Cells(1, 1), .Cells(3, 3))) を設定します。

とにかく、なぜこれが起こるのか分かりません。

于 2012-05-24T04:12:25.697 に答える
0

それは興味深い。

括弧内の .cells(3,3) は、基本的に範囲内のオフセットのように機能するアドレスに解決されていると思います。同様の結果が得られるより単純なバージョンを次に示します。

Sub test()
Dim r As Range
Dim rSub As Range

Set r = Range("A2")
Set rSub = r.Range(r.Cells(1).Address) '"A2"
Debug.Print rSub.Cells(1).Address
End Sub

この行 Set rSub = r.Range(r.Cells(1).Address)は次と同等です。

Set rSub = r.Range("A2")これは「A3」に解決されます。

このように、範囲定義内でアドレスを使用できます。例えば

`? Activesheet.Range("A10:A20").Range("A2").Address` yields `$A$11`

コードのどこにも「アドレス」を使用していないことに気づきましたが、前述のように、アドレスに解決されると思います。私のサンプルでは、​​「アドレス」を削除すると、ランタイム エラーが発生します。

于 2012-06-27T04:25:23.497 に答える