【问题标题】:What are the best ways to move excel ranges around using VBA?使用 VBA 移动 excel 范围的最佳方法是什么?
【发布时间】: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 获得相同大小的范围。

标签: excel vba


【解决方案1】:

是的,范围大小有点小问题,这是我经常不打扰的原因之一,但你可以这样做:

Sub x()

Dim r1 As Range

Set r1 = Range("A1:C3")

With r1
    Range("F1").Resize(.Rows.Count, .Columns.Count).Value = r1.Value
End With

End Sub

编辑:认为这就是 BigBen 的评论的意思。

【讨论】:

  • 他们确实需要减少最小字符数限制。
  • 谢谢!效果很好。
  • 我的荣幸。您可能希望养成接受问题答案的习惯。
【解决方案2】:

...或者更短一点?

Sub x()

With Range("A1:C3")
    Range("F1").Resize(.Rows.Count, .Columns.Count).Value = .Value
End With

End Sub

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2017-10-18
    • 2014-01-03
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多