在 VBA 中使用数组复制和粘贴
Posted
技术标签:
【中文标题】在 VBA 中使用数组复制和粘贴【英文标题】:Copy and Paste using array in VBA 【发布时间】:2011-06-27 06:16:28 【问题描述】:我正在尝试创建一个相对简单的复制和粘贴程序。我将某些单元格地址存储在一个数组 (Results1()) 中,我试图推断它所在的行以将整行数据复制到另一个 Excel 表中。到目前为止,我有以下内容,目前当我尝试定义我的“NextRow”是什么时,我收到了一个 object required 错误。任何建议或反馈将不胜感激!
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
【问题讨论】:
【参考方案1】:这里有几个潜在的原因:
您的 for 循环引用 Results1,但您的副本引用 Results(有问题的错字?或路由原因?)
在您的Set NextRow =
行引用.Cells(Rows.Count,
不合格,行指的是活动工作表而不是"searchresult"
工作表。可能不是您想要的,但在这种情况下也不会有所不同。
同样Range(Results(i1))
指的是活动表,可能没问题 - 取决于您的应用程序的更广泛的上下文
我怀疑你的直接问题是NextRow
还没有被DIM
'd。尝试添加
Dim NextRow as Range
给你的子
一般来说,最好使用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
仅当单个单元格在 A 列中时,将 EntireRow
复制到单个单元格中才有效,因为 EntireRow 范围悬垂在工作表的右侧。
使用它来偏移回 A 列
Set NextRow = _
shSearchResults.Cells(shSearchResults.Rows.Count, 4).End(xlUp).Offset(1, -3)
【讨论】:
@ren 很高兴为您提供帮助,欢迎来到 SO。顺便说一句,如果答案解决了您的问题,您应该接受它 9click 勾号)SO 的工作原理 克里斯,感谢您的建议,但是当我尝试运行代码时,我在“设置 NextRow=...”行中收到“需要对象”错误。关于为什么会这样的任何解释? @ren 你有 Dim NextRow 作为 Range 吗? “需要对象”错误意味着 NextRow 不是对象。没有 Dim(也没有 Option Explicit)的变量默认为 Variant @Chris Neilson 是的,我刚刚意识到我必须更改 NextRow 的变量定义。尝试调试大量代码相当耗时。该宏不再崩溃,但当前未显示任何搜索结果。至少是一种进步! @ren progress then...随时就代码的其他方面发布另一个问题(在回答时我做了一个模型,它确实复制了Results1中提到的行。如果它没有给出预期结果我猜Results1中包含的地址是可疑的)【参考方案2】:您从不使用 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。
【讨论】:
以上是关于在 VBA 中使用数组复制和粘贴的主要内容,如果未能解决你的问题,请参考以下文章