[英]Type Mismatch Error In Excel VBA With “WITH”
我正在嘗試從工作簿中加載的加載項中通過名稱選擇工作表。 我的代碼迭代到With worksheets(ws1)
的行,然后拋出
類型不匹配錯誤
在該工作表上執行操作並使用with
功能的正確方法是什么?
Dim ws2 As Worksheet, ws1 As Worksheet
Dim aData
Set ws2 = ActiveWorkbook.ActiveSheet
Set ws1 = ThisWorkbook.Worksheets("Tastatas")
With Worksheets(ws1)
aData = .Range("a1").CurrentRegion
End With
With Worksheets(ws1)
當您執行Worksheets(ws1)
,實際上是在調用Application.Workbooks.Item
( Excel.Worksheets
集合類的默認屬性。
集合類的Item
屬性已參數化-它需要一個鍵來檢索Object
引用。 所以你需要一把鑰匙 。
VBA.Collection
用String
鍵輸入。 該Item
的物業Excel.Worksheets
集合類需要一個Variant
-這意味着在編譯時, 任何你給它會奏效 。 當使用Variant
值檢索與您提供的鍵相關聯的Object
時,會在運行時發生問題。
您可以對任何Long
(或Integer
)執行Set ws1 = ThisWorkbook.Worksheets(1)
以通過index檢索項目。
您可以對任何String
進行Set ws1 = ThisWorkbook.Worksheets("Sheet1")
來按名稱檢索項目。
就這樣。 字符串或數字。
Dim ws2 As Worksheet, ws1 As Worksheet
擊敗了我為什么在ws2
之前有ws1
,但無論如何ws1
是一個Worksheet
對象引用,不是String
,不是Long
。
所以您的代碼會編譯,因為您正在將該引用傳遞給Variant
參數,並在運行時因類型不匹配錯誤而崩潰 ,因為您提供的類型( Worksheet
)與預期的類型不匹配 ( String
或任何整數)數字類型)。
With
塊可以很好地為您保存該引用-從而節省了變量聲明:
With ThisWorkbook.Worksheets("Tastatas")
aData = .Range("A1").Value
End With
請注意,賦值右側的顯式.Value
:如果將其省略,它仍然存在,只有隱式 。 這是因為Range
類具有指向其Value
的默認屬性 ,該屬性是一個Variant
,可以包含字符串,日期,數字,錯誤值...將值讀入Variant
是一個好主意:如果您正在讀取的單元格包含#REF!
其他類型的不匹配錯誤#REF!
或任何其他單元格erorr值。
但是由於隱式默認值,唯一可以告訴我們aData
是值還是引用的就是賦值本身:
[Let] aData = .Range("A1") ' value assignment: aData is the cell's value.
Set aData = .Range("A1") ' reference assignment: aData is a Range object.
使用顯式代碼可以使事情變得更清楚:
aData = .Range("A1").Value
Set aData = .Range("A1")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.