Как изменить порядок выбранного диапазона столбцов Excel с помощью VBA - PullRequest
7 голосов
/ 08 февраля 2009

Я новичок в VBA и пытаюсь выяснить, как изменить порядок выбранного диапазона столбцов без жесткого кодирования. Каждый пример, который я смотрю, либо жестко кодирует столбцы, чтобы изменить порядок, либо предполагает, что вы хотите изменить все столбцы на рабочем листе. Я не пытаюсь попросить кого-то написать это для меня, но настолько просто, насколько это должно быть, как только кто-то объяснит, что мне не хватает, я должен быть в порядке.

У кого-нибудь есть совет?

Ответы [ 6 ]

12 голосов
/ 04 октября 2009

Для этого можно использовать sort .

Используя этот метод, вы можете расположить столбцы любым способом.

Если у вас есть данные, которые выглядят так:

    A       B       C
1   header1 header2 header3
2   dataA   dataE   dataI
3   dataB   dataF   dataJ
4   dataC   dataG   dataK
5   dataD   dataH   dataL

Добавьте несколько чисел в первый ряд:

    A       B       C
1   1       2       3      
2   header1 header2 header3
3   dataA   dataE   dataI
4   dataB   dataF   dataJ
5   dataC   dataG   dataK
6   dataD   dataH   dataL

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

Сортировка по строке 1 по убыванию:

    A       B       C
1   3       2       1
2   header3 header2 header1
3   dataI   dataE   dataA
4   dataJ   dataF   dataB
5   dataK   dataG   dataC
6   dataL   dataH   dataD

Если вы хотите написать скрипт, используйте опцию сортировку по строкам вместо столбцов.

Я написал .vbs, который делает это здесь:

http://gallery.technet.microsoft.com/ScriptCenter/en-us/f6085342-a1ae-49d8-acfc-38368256ee42?lc=1033

1 голос
/ 12 июля 2009

этот код переворачивает весь диапазон по горизонтали, один ряд за раз - боль. наслаждаться

Sub FlipHorizontal()

On Error GoTo EndMacro

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Set Rng = Selection
rw = Selection.Rows.Count
cl = Selection.Columns.Count

If Rng.Cells.Count = ActiveCell.EntireRow.Cells.Count Then
    MsgBox "You May Not Select An Entire Row", vbExclamation, _
    "Flip Selection"
    Exit Sub
End If
If Rng.Cells.Count = ActiveCell.EntireColumn.Cells.Count Then
    MsgBox "You May Not Select An Entire Column", vbExclamation, _
    "Flip Selection"
    Exit Sub
End If

ReDim Arr(rw, cl)
For cc = 1 To cl ' = Rng.Columns.Count
    For rr = 1 To rw 'rr = Rng.Rows.Count
        Arr(rr, cc) = Rng.Cells(rr, cc) '.Formula
        a = Arr(rr, cc)
    Next

Next

'copy arry to range flippingnhorizontal
cc = cl

For a = 1 To cl ' to loop the columns
    For rr = 1 To rw 'rr = Rng.Rows.Count
        Rng.Cells(rr, cc) = Arr(rr, a) '=  .Formula

    Next
    cc = cc - 1
Next

EndMacro:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

End Sub
0 голосов
/ 30 сентября 2016

Я считаю, что то, что вы хотите сделать, выглядит примерно так:

A1 B1 C1 D1 E1 | E1 D1 C1 B1 A1

A2 B2 C2 D2 E2 | E2 D2 C2 B2 A2

Если это то, что вы пытаетесь сделать, попробуйте эту функцию листа:

= ИНДЕКС ($ A $ 1: $ B $ 5, СТРОКА (А1), 6-КОЛОННА (А1))

Где 6 равно 1 + количество столбцов в диапазоне, которые вы хотите повернуть вспять. Возможно, есть лучший способ выполнить эту часть, но я собирался сделать это просто.

Поместите эту функцию в ячейку F1 и скопируйте / вставьте ее в те же размеры, что и исходный диапазон. Тогда вы можете просто вырезать / вставить значения.

0 голосов
/ 10 февраля 2009

Запишите макрос с относительными ссылками на ячейки, затем изучите код. Я делаю это всякий раз, когда мне лень искать какую-то функциональность (потому что, давайте посмотрим правде в глаза, документация от MS становится все хуже и хуже для VBA).

0 голосов
/ 08 февраля 2009

Selection.Columns(Selection.Columns.Count).Column - дает номер конечного столбца
Selection.Columns(1).Column - дает начальный номер столбца

Вы можете сделать обратный цикл, используя описанное выше.

0 голосов
/ 08 февраля 2009

Отсюда : Переключение или отражение диапазона A :

Этот макрос перевернет порядок диапазона данных. Вы можете перевернуть данные в одной строке или в одном столбце данных (то есть массив N на 1 или массив 1 на N). Вы не можете выбрать и всю строку или весь столбец.

Public Sub FlipSelection()

Dim Arr() As Variant
Dim Rng As Range
Dim C As Range
Dim Rw As Long
Dim Cl As Long

On Error GoTo EndMacro

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Set Rng = Selection
Rw = Selection.Rows.Count
Cl = Selection.Columns.Count
If Rw > 1 And Cl > 1 Then
   MsgBox "Selection May Include Only 1 Row or 1 Column", _
    vbExclamation, "Flip Selection"
Exit Sub
End If

If Rng.Cells.Count = ActiveCell.EntireRow.Cells.Count Then
    MsgBox "You May Not Select An Entire Row", vbExclamation, _
        "Flip Selection"
    Exit Sub
End If
If Rng.Cells.Count = ActiveCell.EntireColumn.Cells.Count Then
    MsgBox "You May Not Select An Entire Column", vbExclamation, _
        "Flip Selection"
    Exit Sub
End If

If Rw > 1 Then
    ReDim Arr(Rw)
Else
    ReDim Arr(Cl)
End If

Rw = 0
For Each C In Rng
    Arr(Rw) = C.Formula
    Rw = Rw + 1
Next C

Rw = Rw - 1
For Each C In Rng
    C.Formula = Arr(Rw)
    Rw = Rw - 1
Next C

EndMacro:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

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