【发布时间】:2020-03-18 19:16:01
【问题描述】:
使用 VBA 移动 excel 范围的最佳方法是什么?因为只要我需要这样做,我仍然会遇到很多麻烦。我想展示我最常用的方法来批评和/或建议移动范围的新方法。
剪切/复制方法似乎非常挑剔,尤其是在涉及多个工作表或变量时。例如:
Dim wkb1 as Workbook
Dim wks1 as Worksheet, wks2 as Worksheet
Set wbk1 = ThisWorkbook
Set wks1 = wbk1.Worksheets(1)
Set wks2 = wbk1.Worksheets(2)
wks1.Range("A1:A5").Copy (wks2.Range("A1"))
' Error: Object variable or With Block variable not set.
wbk1.Worksheets(1).Range("A1:A5").Copy (wbk1.Worksheets(2).Range("A1"))
' This works.
我认为避免使用剪贴板会提高执行速度。在这里,我只是将一个范围等同于另一个范围。缺点是它需要等维度的范围:
' Copy a range of two equal dimensions.
WrkSht2.Range("A1:F" & (rngEndRange.row - 10)).Value = _
WrkSht2.Range("A10", rngEndRange).Value
我喜欢使用集合的想法,但是需要使用循环会增加复杂性。
Sub UseCollection()
Dim MySheet As Worksheet
Dim lngLastRow As Long
Dim rngSearch As Range, rngCell As Range, rngCopy As Range
Dim MyCollection As New Collection
Set MySheet = ThisWorkbook.Worksheets(1)
Set CopySheet = ThisWorkbook.Worksheets(3)
lngLastRow = MySheet.Range("A1").End(xlDown).Row
Set rngSearch = MySheet.Range("A1:A" & lngLastRow)
Set rngCopy = CopySheet.Range("A1")
For Each rngCell In rngSearch
MyCollection.Add rngCell.Value
Next rngCell
i = 1
For Each Element In MyCollection
rngCopy(i, 1) = Element
i = i + 1
Next Element
End Sub
那么你们都是如何复制范围的呢?理想情况下,一种方法应该易于与工作表/范围变量一起使用,并且应该相对简单。
【问题讨论】:
-
注意:删除目的地周围的括号:
wks1.Range("A1:A5").Copy wks2.Range("A1")...见this question。我个人觉得这种风格更清晰:wks1.Range("A1:A5").Copy Destination:=wks2.Range("A1"). -
至于价值转移
[...].Value = [...].Value- 使用Resize获得相同大小的范围。