簡體   English   中英

ActiveCell在VBA中Cell和Range()之間的關系

[英]Relationship between Cell and Range() in VBA with ActiveCell

我在學習VBA,對於Range()對於VBA的確切接受感到非常困惑。 我對OOP和Java / Python等語言有相當扎實的了解,但是VBA在這里給我帶來了一些麻煩。

嘗試使用時出現錯誤

Set MyRange = Range(ActiveCell, Range(ActiveCell.End(xlDown)))

我知道正確的解決方案是

Set MyRange = Range(ActiveCell,ActiveCell.End(xlDown))

但是我試圖理解為什么會這樣。 該錯誤專門來自Range(ActiveCell.End(xlDown)) 我知道.End()MSDN文檔返回一個Range對象。

但是,當我寫

MsgBox (TypeName(ActiveCell))

我被告知ActiveCell是一個Range對象。 Range("A1")可以正常工作(當然),而Range(ActiveCell)會引發錯誤,因此我想這可以確認Range()不會接受Range對象。

但是, "A1"顯然是String 當我在VBA編輯器中鍵入Range() ,我看到Range()接受Cell作為參數參數。 那么在VBA世界中, CellRange之間是什么關系? Range是否從Cell繼承? 我對為什么Range()接受其他Range對象以及String感到困惑。

如果Range()不接受Range對象作為參數,那么以下這段代碼為什么起作用?

Range("A2", Range("A2").End(xlDown).End(xlToRight))

.End()不是在這里返回Range對象嗎?

范圍正在尋找一個表示單元格地址的字符串或兩個記錄范圍范圍的范圍對象。

ActiveCell本身就是一個范圍對象。 因此,在Range中使用它時:

Range(ActiveCell.End(xlDown))

該范圍正在尋找第二個范圍對象。

您可以將地址作為字符串返回:

Range(ActiveCell.End(xlDown).Address)

這將起作用,但將迫使vbe進行大量轉換。 這就像將直流電從交流電轉換回直流電為手機充電。

只需使用:

ActiveCell.End(xlDown)

作為范圍對象的作品。

Set MyRange = Range(ActiveCell, ActiveCell.End(xlDown))

這就是Range("A2", Range("A2").End(xlDown).End(xlToRight))工作的原因。 您將返回兩個范圍對象。 vbe假定范圍的第一位的"A2"Range("A2")

Range(Range("A2"), Range("A2").End(xlDown).End(xlToRight))

當每個內部范圍都使用字符串創建范圍對象時起作用。

您的第一個是:

Range("A2", Range(Range("A2")).End(xlDown).End(xlToRight))

如您所見,第二個Range現在正嘗試僅使用一個range對象查找一個范圍,因此需要兩個對象才能成為可行的范圍。

由於ActiveCell.End(xlDown)已經返回一個范圍,因此您無需將其包裝到Range()中

試試看

Set MyRange = Range(ActiveCell, ActiveCell.End(xlDown))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM