Excel VBA: поменять местами столбцы - PullRequest
0 голосов
/ 04 июля 2019

У меня проблема с заменой столбца 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 обоих столбцов ...

Ответы [ 4 ]

1 голос
/ 04 июля 2019

Я предпочитаю использовать 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
1 голос
/ 04 июля 2019

Использование массива будет намного быстрее, чем зацикливание.В этом примере столбец 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

Обновлено: Я не хочу выбирать конкурирующий ответ, поскольку он прости эффективны, но наши два ответа дают хорошую иллюстрацию того, почему использование массивов для одновременного воздействия на электронную таблицу гораздо эффективнее, чем циклическое редактирование и редактирование.Я построил этот код , который будет синхронизировать результаты каждого подхода (вставка в столбец E) электронной таблицы.В одном раунде из 2563 строк результат был от 0 секунд до 4. Массив продолжал выводить данные в течение 0 секунд, в то время как циклический подход упал до 41 секунды при выполнении 9 испытаний.

Снимок экрана результатов.

Код времени можно найти на моей странице PasteBin (я не хочу, чтобы этот ответ выглядел смехотворно долго)

1 голос
/ 04 июля 2019

Вы можете поменять их местами по циклу. В вашем случае цикл должен идти 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
0 голосов
/ 04 июля 2019

Просто добавьте это в микс, есть третий способ.

Вставьте столбец после B. Скопируйте A в C. Удалить A.

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

(Предполагается, что вы хотите переместить весь столбец, но обычно это происходит.)

Однако скорость, с которой это будет выполняться, зависит от размера рабочего листа и количества формул, которые он имеет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...