2009-02-08 4 views
5

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

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

ответ

0

Отсюда: Flipping Or Mirroring A Range:

Этот макрос будет изменить порядок диапазона данных. Вы можете переворачивать данные в одну строку или в один столбец данных (т. Е. Массив 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 
0

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

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

0

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

1

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

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 
9

Вы можете использовать рода, чтобы сделать это.

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

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

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 

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

Я написал a.VBS, что делает это здесь:

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

+0

Awesome, спасибо! Чтобы выполнить сортировку в Excel 2010, мне нужно было сделать следующее: _ (щелкните правой кнопкой мыши) _ -> _Sort_ -> _Custom sort ..._ -> _ [Options ...] _ -> _Sort left to right_ - > _ [OK] _ -> _Sort by_ -> _ "Строка 1" _ -> _Order_ -> _ "В наибольшей степени наименьшей" _ -> _ [OK] _ – akavel

0

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

A1 B1 C1 D1 E1 | E1 D1 C1 B1 A1

A2 B2 C2 D2 E2 | E2 D2 C2 B2 A2

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

= ИНДЕКС ($ A $ 1: $ B $ 5, ROW (A1), 6-COLUMN (A1))

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

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

Смежные вопросы