Инвертировать/обратить столбцы, для которых не задан диапазон, с помощью командной кнопки

Я знаю, что этот вопрос уже задавался, но я не могу заставить то, что нахожу, работать на меня.

Я просто хочу взять все данные, начинающиеся в столбце A и переходящие в столбец J из строки 2 до любого конца данных, и изменить порядок (обратить данные)

Я наткнулся на приведенный ниже код, но он зависает, и я не хочу делать выбор.

Private Sub CommandButton2_Click()

    Dim vTop As Variant
    Dim vEnd As Variant
    Dim iStart As Integer
    Dim iEnd As Integer

    Application.ScreenUpdating = False
    iStart = 1
    iEnd = Selection.Columns.Count

    Do While iStart < iEnd
        vTop = Selection.Columns(iStart)
        vEnd = Selection.Columns(iEnd)
        Selection.Columns(iEnd) = vTop
        Selection.Columns(iStart) = vEnd
        iStart = iStart + 1
        iEnd = iEnd - 1
    Loop
    Application.ScreenUpdating = True

End Sub

Чтобы было ясно, я хочу сделать последнюю строку первой строкой, а последнюю строку первой строкой. Это непрерывный блок данных. Ваше здоровье

до после


person Trevor Burger    schedule 17.11.2016    source источник


Ответы (3)


Другая версия кода - посмотрите, работает ли она.

Private Sub CommandButton2_Click()

Dim v(), i As Long, j As Long, r As Range

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

With Range("A1").CurrentRegion
    Set r = .Offset(1).Resize(.Rows.Count - 1)
End With

ReDim v(1 To r.Rows.Count, 1 To r.Columns.Count)

For i = 1 To r.Rows.Count
    For j = 1 To r.Columns.Count
        v(i, j) = r(r.Rows.Count - i + 1, j)
    Next j
Next i

r = v

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
person SJR    schedule 17.11.2016
comment
Успех, спасибо миллион раз и за работу над этим. Хотел бы я как-нибудь отплатить тебе, чувак. Им нужна кнопка отправки подарка здесь. - person Trevor Burger; 17.11.2016

Приведенный ниже код копирует данные в каждом столбце в столбец номер 20 — индекс текущего столбца, а в конце цикла For он удаляет исходные данные, лежащие в столбцах A:J.

Option Explicit

Private Sub CommandButton2_Click()

Dim LastRow As Long
Dim Col As Long
Dim ColStart As Long, ColEnd As Long

Application.ScreenUpdating = False

' Column A
ColStart = 1
' Column J
ColEnd = 10 ' Selection.Columns.Count

' modify "Sheet1" to your sheet's name
With Sheets("Sheet1")
    For Col = ColStart To ColEnd
        ' find last row with data for current column
        LastRow = .Cells(.Rows.Count, Col).End(xlUp).Row

        ' copy in reverse order to column 20 to 11
        ' copy current column to column 20-current column index
        .Range(Cells(2, Col), Cells(LastRow, Col)).Copy .Range(Cells(2, 20 - Col), Cells(LastRow, 20 - Col))
    Next Col
End With

' delete original data in column A:J
With Sheets("Sheet1")
    .Columns("A:J").EntireColumn.Delete
End With

Application.ScreenUpdating = True

End Sub
person Shai Rado    schedule 17.11.2016
comment
Я хочу сохранить обратные данные в тех же столбцах. Когда я попытался изменить строку копирования вашего кода, чтобы отразить это, я получил сообщение об ошибке - person Trevor Burger; 17.11.2016

Вот так? Это предполагает непрерывный блок данных из A2 (текущий регион), поэтому он будет выходить за пределы J, если есть больше данных, но может быть ограничен

Private Sub CommandButton2_Click()

Dim v, i As Long, r As Range

Application.ScreenUpdating = False

With Range("A1").CurrentRegion
    Set r = .Offset(1).Resize(.Rows.Count - 1)
End With

v = r

For i = 1 To r.Rows.Count
    r.Rows(i).Cells = Application.Index(v, r.Rows.Count - i + 1, 0)
Next i

Application.ScreenUpdating = True

End Sub
person SJR    schedule 17.11.2016
comment
это перевернуло столбцы, в которых находились данные, и не изменило их. Мне нужно, чтобы последняя строка стала первой строкой, а первая строка была последней строкой. - person Trevor Burger; 17.11.2016
comment
Отредактировано выше. Было неясно, что вам нужно, поскольку ваш исходный код только переворачивал столбцы. - person SJR; 17.11.2016
comment
что-то не так. эти удаленные данные, а затем скопированные некоторые, чтобы сделать дубликаты одной и той же строки. извините не понятно было в начале. - person Trevor Burger; 17.11.2016
comment
Я проверил это на образце, и, похоже, это сработало. Не могли бы вы опубликовать скриншот того, что вы хотите, и уточнить, где вы хотите получить результаты? Изменение этой строки поместит результаты под .Cells.Offset(.Rows.Count + 1) = v - person SJR; 17.11.2016
comment
Я добавил две ссылки внизу сообщения, чтобы показать, что происходит, когда я его запускаю. Он также переворачивает первую строку, которую я хочу оставить прежней. - person Trevor Burger; 17.11.2016
comment
ок, переделали еще раз. Это перезаписывает, но если вы не хотите, чтобы это было легко сделать, просто скажите, где вы хотите их изменить. - person SJR; 17.11.2016
comment
Я просто хочу, чтобы они были в том же месте. Столбец A остается в столбце A и так далее. на самом деле это заканчивается в столбце i, но я не думаю, что это имеет значение. Так что это сделало работу, но снова переместило расположение столбцов (изменил порядок столбцов) - person Trevor Burger; 17.11.2016
comment
Вы имеете в виду, что просто хотите поменять местами строки? - person SJR; 17.11.2016
comment
Мне очень жаль. Да, это все. Я поздно добавил комментарий к исходному сообщению, чтобы сказать, что, потому что я не понимал, что код, который я разместил, предназначен для изменения столбцов. - person Trevor Burger; 17.11.2016
comment
Я получил ошибку в строке, начинающейся с r.Row(i) - person Trevor Burger; 17.11.2016
comment
так вроде работает, но excel вылетает. Поэтому я должен принудительно закрыть Excel, спрашивая меня, хочу ли я перезапустить его. когда я это делаю, появляется окно отладки и сообщает мне об ошибке автоматизации, вызванный объект отключился от своих клиентов. Я думаю, что это может застрять в петле. Может быть, что-то вроде: LastRow = .Cells(.Rows.Count, Col).End(xlUp).Row - person Trevor Burger; 17.11.2016
comment
Странно, не думаю, что это как-то связано с петлей. Сколько строк и столбцов данных у вас есть на самом деле? У вас есть другой код в книге? - person SJR; 17.11.2016
comment
всего 9 столбцов, но около 15 000 строк. У меня есть еще одна кнопка для импорта данных, но это все - person Trevor Burger; 17.11.2016
comment
Как импортируются данные - откуда? - person SJR; 17.11.2016
comment
из двоичного файла excel .xlsb, расположенного в той же папке, пользователь выбирает файл - person Trevor Burger; 17.11.2016
comment
Если вы ищете эту ошибку, кажется, что есть множество причин и решений, например stackoverflow.com/questions/17302918/ Я не уверен в причине - возможно, потребуется добавить книга ссылается на код, если у вас открыто более одного файла при запуске кода (?) - person SJR; 17.11.2016
comment
другой файл не открывается при запуске кода. Он закрывается после импорта данных. Он выполнил реверсирование данных, когда он также реверсировал столбцы, поэтому я не думаю, что это проблема. - person Trevor Burger; 17.11.2016
comment
Я добавил немного другой код — посмотрите, работает ли он. - person SJR; 17.11.2016