首页 > 解决方案 > 将一行从一张纸复制到另一张纸的另一行

问题描述

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

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

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

标签: excelvba

解决方案


我相信错误是由您不合格的Worksheet.Cells()财产引起的。

如果您不熟悉对象限定,让我们从Microsoft 文档中摘录该Worksheet.Cells属性

句法

表达式.Cells

表达式表示 Worksheet 对象的变量。

...

在没有对象限定符的情况下使用此属性会返回一个 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

推荐阅读