2012-05-23 91 views
2

我創建了以下子部分來簡單說明問題。我將活動工作表的範圍A2:E10分配給範圍變量。然後,到另一個範圍變量,我將此範圍的子範圍(單元格(1,1))分配給(3,3)。Excel vba:將範圍創建爲另一個範圍的子範圍時可能存在的錯誤

我會預期這將包括該範圍A2至C4(因爲A2是第一欄,較大範圍的第一行)。但是,當我調用每個範圍的第一個單元格的.Row方法時,我得到不同的結果:較大範圍r返回「2」,而較小範圍rSub返回「3」。

(該.Row方法返回的範圍內的絕對排它被要求)

我希望這兩個調用返回2,因爲他們都應該引用單元格A2。任何人都可以解釋爲什麼這不是這樣嗎?

*編輯:我剛纔已經改變了子,以便它調用每個範圍內的第一個單元格的.COLUMN方法,因爲它的.Row方法。正如您所預料的那樣,這將爲這兩個範圍返回「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 

回答

1

很奇怪〜

我從你的代碼相同的結果。我猜的結果來自於下面的代碼:

設置RSUB = .Range(.Cells(1,1),.Cells(3,3))

當我刪除範圍之前,我得到了點結果如我們預期

設置RSUB =範圍(.Cells(1,1),.Cells(3,3)))

反正我不知道爲什麼會這樣。

+0

我發現,如果你之前的「細胞」,而不是「範圍」前的一個取出點,它也適用。我本以爲這樣做會強制vba使用屬於活動工作表的單元格,而不是r或rSub。 我想過了,我認爲它在計算範圍時使用了.Row和.Column值。因此對於rsub的.Cells(1,1),Row的值是2.範圍的開始也是2.所以它必須做一些類似於「CellRow - RangeStartRow + 1」的事情,因此它會出現3 – Swiftslide

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)相當於:「A3」

Set rSub = r.Range("A2")解析爲

您可以使用範圍定義內部地址這種方式。例如

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

我知道你沒有使用「地址」,在你的代碼的任何地方,但就像我說的,我覺得它解析爲一個地址。在我的示例中,如果刪除「地址」,則會出現運行時錯誤。