簡體   English   中英

為什么會出現“類型不匹配”錯誤?

[英]Why am I getting a 'type mismatch' error?

我試圖將范圍從一個工作簿復制到另一個工作簿中的表以捕獲生產數據。 我能夠復制正確的范圍並成功打開帶有表的工作簿。 但是,當它嘗試將信息粘貼到表中的下一個可用行時,出現錯誤13。我對vba還是很陌生,似乎找不到解決方案,因此不勝感激。

Dim wbTime As Workbook
   Set wbTime = ThisWorkbook

   Dim wbData As Workbook

   Dim N As Long
   N = Cells(Rows.Count, "A").End(xlUp).Row + 1

   Dim UsdRws As Long
   UsdRws = Cells.Find("*", After:=Range("A32"), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

   wbTime.ActiveSheet.Range("A6:O" & UsdRws).Copy

   Set wbData = Workbooks.Open("S:\Lean Carrollton Initiative\Allen\Buffering Interrupters\1st Shift\B10\Data.xlsx")

   wbData.ActiveSheet.Paste Destination:=Worksheets(Sheet1).Range(N & "A")

   wbData.Close SaveChanges:=True
End Sub
 Destination1:=Worksheets(Sheet1).Range(N & "A") 

@QHarr 正確地識別Range(N & "A") ,並提出了針對您在Worksheets(Sheet1)遇到的類型不匹配錯誤的修復程序。

我只是想解釋一下正在發生的事情,超出了一個小的注釋框。

Sheet1Worksheet類型的隱式聲明的對象變量,其編譯時標識符由工作表的(Name)屬性確定:

Sheet1屬性工具窗口顯示(Name)屬性

如果將此屬性值更改為SummarySheet ,則Sheet1不再是有效的標識符,並且SummarySheet成為一個標識符-這就是為什么在每個模塊的頂部指定Option Explicit很重要的部分原因,因為沒有它,VBA會很高興編譯並運行,除了現在不是Sheet1是非法的,它現在是一個未定義的Variant/Empty值,可以意外地愉快地傳遞它,這會使事情很難調試(對於任何未聲明的變量,這同樣適用,而不僅僅是工作表代碼名稱)。

因此Sheet1是一個Worksheet對象引用。 如果Worksheet具有返回其Name屬性值的默認成員 ,則您的代碼將起作用。

但是Worksheet沒有默認成員 ,因此Worksheets(Sheet1)Worksheet對象引用作為參數傳遞給Worksheets.Item索引器(這是隱式的-因為Worksheets確實具有默認成員,其Item屬性),即期待Variant工作表(持在該名稱Variant/String ),或一個數字索引( Variant/IntegerVariant/Long )。

Worksheet對象傳遞給WorksheetWorksheets.Item 類型不匹配錯誤。

因此,假設Sheet1工作表是預期的目標,這將對其進行修復(對QHarr先前確定的Range參數錯誤進行抽象化):

wbData.ActiveSheet.Paste Destination:=Sheet1.Range(...)

永遠不需要從Worksheets集合中檢索ThisWorkbook編譯時存在的Worksheets

請注意,在原始代碼中:

 Destination1:=Worksheets(Sheet1).Range(N & "A") 

由於Worksheets不合格,因此它所屬的Workbook是模棱兩可的:如果該代碼是在ThisWorkbook編寫的,則Worksheets是針對Me的成員調用,即ThisWorkbook.Worksheets 否則,它“方便地”隱式地指的是當前處於活動狀態的任何工作簿 ,這對於編寫代碼通常是冒險的。

您的范圍需要正確的語法

Range("A" & N)

您也可以使用

Cells(N, "A")

並且sheet1應該是"Sheet1"Worksheets("Sheet1") Sheet1本身(未加引號)將被視為變量。 除非您有該名稱的字符串變量? 使用模塊頂部的Option Explicit檢查變量聲明。


@MathieuGuidon的其他評論:

我將添加Sheet1是新工作簿中“ Sheet1”工作表的默認代碼名稱; 這是VBA免費創建的項目范圍標識符,為您提供了對該特定Worksheet對象的編譯時引用-因此,從Worksheets集合中檢索該對象完全是多余的:Sheet1.Range(...)更可取-理想情況下,應將該工作表的(Name)屬性修改為有意義的標識符,例如SummarySheet,它使SummarySheet.Range(...)合法,而無需聲明任何SummarySheet變量

暫無
暫無

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

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