将一行从一张纸复制到另一张纸的另一行

时间:2020-05-21 22:12:46

标签: excel vba

我遇到错误,我不明白为什么。

我有一个数组 从数组中寻找匹配项。 匹配时,它将复制该行的使用范围,并将其粘贴到另一页的最后一行下方。

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 仍然遇到错误

1 个答案:

答案 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