當考慮@Crouzilles問題:Assigning range to array in VBA我意識到,無論是否明確使用ActiveWorkbook.ActiveSheet
來定義範圍,它都很重要。例如:將範圍分配給數組時,顯式和隱式使用ActiveSheet
Dim arr1() As Variant
Dim arr2() As Variant
arr1 = Range("A1:B2")
arr2 = ActiveWorkbook.ActiveSheet.Range("A1:B2") 'Type mismatch
我曾假定兩個右手側將返回Range
對象,這將被鑄造成的變體的陣列;然而,第二行產生一個類型不匹配錯誤:
Run-time error '13': Type mismatch
爲確保兩個語句的確返回數組我查TypeName()
:
Debug.Print TypeName(Range("A1:B2")) 'Range
Debug.Print TypeName(ActiveWorkbook.ActiveSheet.Range("A1:B2")) 'Range
我還檢查Range("A1:B1").Worksheet.Name
屬性,以確保Range("A1:B2")
是的確引用了ActiveWorkbook.ActiveSheet
.references
然後我試着將Range().Value
賦值給這兩個變量,它們的執行都是正確的:
arr1 = Range("A1:B2").Value
arr2 = ActiveWorkbook.ActiveSheet.Range("A1:B2").Value 'No error
這是有意義的爲一.Value
Range
對象轉換爲變體的陣列....相同類型arr1
和arr2
:
Debug.Print TypeName(Range("A1:B2").Value) 'Variant()
Debug.Print TypeName(ActiveWorkbook.ActiveSheet.Range("A1:B2").Value) 'Variant()
要添加到我的混亂,明確地分配兩個變化到Range
引用允許兩個陣列被分配:
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = Range("A1:B2")
Set rng2 = ActiveWorkbook.ActiveSheet.Range("A1:B2")
arr1 = rng1
arr2 = rng2 'No error
任何人都可以解釋爲什麼一個Range
由Range("A1:B2")
引用的對象可以隱式轉換爲一組變體,而ActiveWorkbook.ActiveSheet.Range("A1:B2")
不能?
這很有意義,謝謝!有沒有辦法顯示對象是以編程方式延遲綁定的?我可以看到'Dim obj As Object'顯然很明顯,但直觀上我期望'ActiveWorksheet'返回一個'Worksheet'並確實'TypeName(ActiveWorksheet)'也會提示這一點。 – stucharo
但它不是'ActiveWorksheet',它是'ActiveSheet',並且該工作表可能是Chart工作表(甚至是宏工作表) - 這就是爲什麼它返回一個Object而不是'Worksheet'。對象瀏覽器將顯示返回類型。 – Rory
@stucharo - 如果你輸入「。之後並沒有在Intellesense上獲得成員名單。 – Comintern