首页 > 解决方案 > Excel VBA:用范围交换列

问题描述

我在将 A 列交换到 B 列然后将 B 列交换到 A 列时遇到问题,两列的行数均为 2563。是否有任何 vba 代码来解决这个问题?

我已经在尝试这段代码:

Private Sub CommandButton1_Click()
    Dim temp As Double
    temp = Range("A1").Value
    Range("A1").Value = Range("B1").Value
    Range("B1").Value = temp
End Sub

但它只能交换两列的第 1 行...

标签: excelvba

解决方案


使用数组会比循环快得多。在此示例中,列 A 被复制到一个数组Hold_RNG中。然后将 B 列复制到 A 列,然后将 Array 复制到 B 列。

Sub SwapCOlumns()
    Dim hold_rng() As Variant
    Dim rowsToinclude As Long, WS As Worksheet

    Set WS = ActiveSheet '<--- make sure this is correct worksheet
    rowsToinclude = 2563 '<----- might want to make more dynamic

    With WS

        hold_rng = .Range("A1:A" & rowsToinclude)

        .Range("A1:A" & rowsToinclude).Value = .Range("B1:B" & rowsToinclude).Value
        .Range("B1:B" & rowsToinclude).Value = hold_rng

    End With

End Sub

更新:我并不是要选择竞争的答案,因为它简单有效,但我们的两个答案很好地说明了为什么使用数组一次影响电子表格,比循环和编辑更有效。我构建了这段代码,它将对电子表格的每种方法(插入 E 列)的结果进行计时。通过一轮 2563 行,得分是 0 秒到 4。数组在 0 秒内继续输出,而循环方法在进行 9 次试验时下降到 41 秒。

结果的屏幕截图。

计时码可以在我的PasteBin 页面上找到(我不希望这个答案看起来长得可笑)


推荐阅读