我正在尝试创建一个相对简单的复制和粘贴过程。我有一些存储在数组中的单元格地址(Results1()),我试图推断它所在的行,将整行数据复制到另一个Excel工作表中。到目前为止,我有以下内容,当我尝试定义我的'NextRow'时,我得到一个对象必需的错误。任何建议或反馈将不胜感激!
For i1 = LBound(Results1) To UBound(Results1)
Set NextRow = Worksheets("searchresult").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
Range(Results(i1)).EntireRow.Copy NextRow
Next i1
编辑代码
For i1 = LBound(Results1) To UBound(Results1)
Worksheets("properties").Select
Set p1results = Range(Results1(i1))
p1results.EntireRow.Copy
With Worksheets("SearchResult").Select
NextRow = Range("D65536").End(xlUp).Row + 1
Cells(NextRow, 1).Select
ActiveSheet.Paste
End With
Next i1
更新:实际上我的数据范围仅从列D:P开始,所以当我计算行时,我从列D(4)开始计数,因为列A-C是空的范围。这会影响我粘贴数据的方式吗?
On Error Resume Next
For i1 = LBound(Results1) To UBound(Results1)
Set NextRow = shSearchResult.Cells(shSearchResult.Rows.Count, 4).End(xlUp).Offset(1, 0)
shProperties.Range(Results1(i1)).EntireRow.Copy NextRow
If Err.Number <> 0 Then
Err.Clear
MsgBox "Bad address" & Results1(i1)
End If
Next i1
答案 0 :(得分:1)
这里有一些潜在的原因:
您的for循环引用 Results1 ,但您的副本引用结果(错误的问题?或路由原因?)
在您的Set NextRow =
行引用.Cells(Rows.Count,
不合格时,行指的是活动工作表而不是"searchresult"
工作表。可能不是你想要的,但在这种情况下也没有区别。
同样Range(Results(i1))
指的是活动表,可能没问题 - 取决于应用程序的更广泛的上下文
我怀疑你的问题是NextRow
还没有DIM
'。尝试添加
Dim NextRow as Range
到您的Sub
一般来说,最好使用Option Explicit
(模块中的第一行)。这会强制显式声明所有变量。
修改强>
根据您的修改,"Method 'Range' of object '_Global' failed"
错误可能是由无效的地址字符串
你的第一个代码实际上比你的第二个更好。这是一个重构版本
Sub zxx()
Dim Results1(0 To 1) As Variant
Dim i1 As Long
Dim NextRow As Range
Dim shProperties As Worksheet
Dim shSearchResults As Worksheet
' other code ...
Set shSearchResults = ActiveWorkbook.Worksheets("searchresult")
Set shProperties = ActiveWorkbook.Worksheets("properties")
On Error Resume Next
For i1 = LBound(Results1) To UBound(Results1)
Set NextRow = shSearchResults.Cells(shSearchResults.Rows.Count, 1).End(xlUp).Offset(1, 0)
shProperties.Range(Results1(i1)).EntireRow.Copy NextRow
Next i1
End Sub
要检测错误地址,请尝试在For和
之前添加On Error Resume Next
If Err.Number <> 0 Then
Err.Clear
MsgBox "Bad Address " & Results1(i1)
End If
复制后(在for循环内)
<强> EDIT2 强>
将EntireRow
复制到单个单元格只有在单个单元格位于A列时才有效,因为EntireRow范围会悬在工作表的右侧。
使用此值偏移回A列
Set NextRow = _
shSearchResults.Cells(shSearchResults.Rows.Count, 4).End(xlUp).Offset(1, -3)
答案 1 :(得分:0)
你永远不会使用With语句,所以只需这样做:
For i1 = LBound(Results1) To UBound(Results1)
Worksheets("properties").Select
Set p1results = Range(Results1(i1))
p1results.EntireRow.Copy
Worksheets("SearchResult").Select
NextRow = Range("D65536").End(xlUp).Row + 1
Cells(NextRow, 1).Select
ActiveSheet.Paste
Next i1
或更好:
For i1 = LBound(Results1) To UBound(Results1)
Worksheets("properties").Range(Results1(i1)).EntireRow.Copy
Worksheets("SearchResult").Cells(Range("D65536").End(xlUp).Row + 1, 1).Paste
Next i1
根据您正在做的事情,您可能希望改用PasteSpecial。