簡體   English   中英

Excel VBA中帶有“ WITH”的類型不匹配錯誤

[英]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.ItemExcel.Worksheets 集合類的默認屬性。

集合類的Item屬性已參數化-它需要一個來檢索Object引用。 所以你需要一把鑰匙

VBA.CollectionString鍵輸入。 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.

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