Excel VBA:带范围的交换列

时间:2019-07-04 03:13:39

标签: 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

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

4 个答案:

答案 0 :(得分:1)

您可以循环交换它们。对于您的情况,循环应进行2563次。

Private Sub CommandButton1_Click()

    For i = 1 To 2563
        temp = Cells(i, 1).Value
        Cells(i, 1).Value = Cells(i, 2).Value
        Cells(i, 2).Value = temp
    Next i

End Sub

答案 1 :(得分:1)

使用数组比循环快得多。在此示例中,列A被复制到数组Hold_RNG中。然后将B列复制到A列,然后将数组复制到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

更新:我并不是要选择竞争性答案,因为它既简单又有效,但是我们的两个答案很好地说明了为什么要使用数组来影响电子表格一次,比循环和编辑要有效得多。我建立了this code,它将为电子表格的每种方法(插入E列)的时间计时。一轮2563行的得分为0秒到4。该阵列在0秒内继续输出,而在进行9次试验时,循环方法降至41秒。

Screen Shot Of Results.

可以在我的PasteBin page上找到计时代码(我不想这个答案看起来很长)

答案 2 :(得分:1)

我更喜欢使用arrays,因为速度更快。

Option Explicit

Sub test()

    Dim i As Long
    Dim arrA As Variant, arrB As Variant
    Dim ValueA As Double, ValueB As Double

    'Cahng if needed
    With ThisWorkbook.Worksheets("Sheet1")

        arrA = .Range("A1:A2563")
        arrB = .Range("B1:B2563")

        For i = 1 To 2563

            ValueA = arrA(i, 1)
            ValueB = arrB(i, 1)

            arrA(i, 1) = ValueB
            arrB(i, 1) = ValueA

        Next i

            .Range("A1").Resize(UBound(arrA), 1) = arrA
            .Range("B1").Resize(UBound(arrB), 1) = arrB

    End With

End Sub

答案 3 :(得分:0)

只是将其添加到混合中,还有第三种方法。

在B之后插入一列。将A复制到C。删除A。

With ThisWorkbook.Worksheets(1)
    .Columns(3).Insert
    .Columns(1).Copy .Columns(3)
    .Columns(1).Delete
End With

(假设您要移动整列,但通常会这样做。)

但是,其运行速度取决于工作表的大小以及它具有多少个公式。