我遇到错误,我不明白为什么。
我有一个数组 从数组中寻找匹配项。 匹配时,它将复制该行的使用范围,并将其粘贴到另一页的最后一行下方。
Dim iCL As Integer, USCurRow As Integer, USlRow As Integer, USlCol As Integer, USlRow2 As Integer
Dim USCountryList(1 To 1) As String
Dim USCtry As String
USCountryList(1) = "Country1"
For iCL = 1 To UBound(USCountryList)
USCtry = USCountryList(iCL)
USlRow = Sheets("US Confirmed").Cells(Rows.Count, 1).End(xlUp).Row
USlCol = Sheets("US Confirmed").Cells(1, Columns.Count).End(xlToLeft).Column
USlRow2 = Sheets("World Confirmed").Cells(Rows.Count, 2).End(xlUp).Row
For USCurRow = 2 To USlRow
If Sheets("US Confirmed").Cells(USCurRow, 1) = USCtry Then
Sheets("World Confirmed").Range(Cells(USlRow2 + 1, 1), Cells(USlRow2 + 1, USlCol)) = _
Sheets("US Confirmed").Range(Cells(USCurRow, 1), Cells(USCurRow, USlCol))
End If
Next USCurRow
Next iCL
在复制部分期间,我一直收到application-defined or object-defined error
。
单步执行变量的值似乎是有效的:
对其进行硬编码:
Sheets("World Confirmed").Range(Cells(268,1),cells(268,121))= _
Sheets("US Confirmed").Range(Cells(3, 1), Cells(3, 121))
产生相同的application-defined or object-defined error
错误。
我也尝试过range select. selection copy
range select selection paste
仍然遇到错误
答案 0 :(得分:1)
我认为该错误是由您不合格的Worksheet.Cells()
属性引起的。
如果您不熟悉对象资格,让我们从Microsoft documentation for the Worksheet.Cells
property中摘录一下:
语法
表达式。单元格
expression 代表工作表对象的变量。
...
使用此属性而不使用对象限定符将返回一个Range对象,该对象代表活动工作表上的所有单元格
所以在你的行中
Sheets("World Confirmed").Range(Cells(USlRow2 + 1, 1), Cells(USlRow2 + 1, USlCol)) = _
Sheets("US Confirmed").Range(Cells(USCurRow, 1), Cells(USCurRow, USlCol))
Range()
属性符合Sheets("World Confirmed")
和Sheets("US Confirmed")
的条件,但定义范围的开始和结束单元格的Cells()
属性却没有。
如果您将Cells()
属性限定为相关工作表,则运行时错误将停止,但您可能会发现这些值将不会按预期分配给Sheet1
。
在每个范围上使用.Value
属性可以解决此问题,如下所示:
For USCurRow = 2 To USlRow
If Sheets("US Confirmed").Cells(USCurRow, 1) = USCtry Then
Sheets("World Confirmed").Range(Sheets("World Confirmed").Cells(USlRow2 + 1, 1), Sheets("World Confirmed").Cells(USlRow2 + 1, USlCol)).Value = _
Sheets("US Confirmed").Range(Sheets("US Confirmed").Cells(USCurRow, 1), Sheets("US Confirmed").Cells(USCurRow, USlCol)).Value
End If
Next USCurRow
为提高可读性和可维护性,建议您将工作表分配给一个变量,如下所示:
Dim SourceSheet as Worksheet
Dim DestinationSheet as Worksheet
Set SourceSheet = Thisworkbook.Sheets("US Confirmed")
Set DestinationSheet = ThisWorkbook.Sheets("World Confirmed")
For USCurRow = 2 To USlRow
If Sheets("US Confirmed").Cells(USCurRow, 1) = USCtry Then
DestinationSheet.Range(DestinationSheet.Cells(USlRow2 + 1, 1), DestinationSheet.Cells(USlRow2 + 1, USlCol)).Value = _
SourceSheet.Range(SourceSheet.Cells(USCurRow, 1), SourceSheet.Cells(USCurRow, USlCol)).Value
End If
Next USCurRow