2016-10-07 2 views
0

Я пытаюсь выяснить, как заказать значения на кратные столбцов, но я не могу найти ответКак заказать значения на кратные столбцов

Ниже приводится как значения прямо сейчас:

  A B C D E F 
Row(1)  20 1 3 5 2 4 
Row(2)  19 11 12 14 16 8 

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

  A B C D E F 
Row(1)  1 2 3 4 5 8 
Row(2)  11 12 14 16 19 20 

выше является лишь частью огромного стола у меня есть, но я могу только сортировать информацию по столбцам или по строкам, но не все данные

Любая идея, как это сделать?

+0

Каково фактическое требование и почему * должно быть сделано * так, а не таким образом, который поддерживается (и интуитивно понятным) для пользователей/потребителей электронных таблиц? –

+0

Например, я могу видеть, что требование «Сгладить массив и отсортировать его по возрастанию, но разбить его после каждого столбца * n * (в этом примере: 6) и обернуть в следующую строку. –

+0

Я работаю с таблицами распределения частот и в соответствии с информацией, которую я имею значения, большинство из них должно быть порядка, как на втором примере. – Sam

ответ

3

Вы можете использовать System.Collections.ArrayList, чтобы сгладить двумерный диапазон. Объект ArrayList имеет метод .Sort (а также метод .Reverse, если вам это понадобится).

Таким образом, этот подход фиксирует диапазон, отвалов его к ArrayList, сортирует его (по возрастанию), а затем записывает его обратно в исходный диапазон:

Option Explicit 
Sub foo() 
Dim sel As Range 

Dim arr As Variant, val As Variant 
Dim lst As Object 
Dim i As Long 

'Simplistic case of capturing the range to operate against, modify if needed 
Set sel = Application.InputBox("Please select the table (excluding headers) to sort", "Flatten & sort", Type:=8) 
' Dump the range values in a 2-d array 
arr = sel.Value 

'Flatten the range/array in to the ArrayList object 
Set lst = CreateObject("System.Collections.ArrayList") 
For Each val In arr 
    lst.Add val 
Next 

'Sort the ArrayList 
lst.Sort 
' If you ever need to reverse the list, you can do: 
' lst.Reverse 

' Dump the sorted ArrayList values back to the worksheet: 
For i = 1 To lst.Count 
    sel(i) = lst.Item(i - 1) 
Next 

End Sub 

До:

enter image description here

После:

enter image description here

+0

Ты мужчина! читал о макросах, и я все еще участвую, но то, что вы сделали, было красивым. Я очень благодарен вам за то, что вы нашли время, чтобы помочь мне :) Вы - awsome !!! – Sam

+0

Объект 'ArrayList' не является часто используется, и вы не найдете простой ссылки на него, но он есть - я узнал об этом здесь, в StackOverflow :), и я подумал, что это было бы полезно для него, что не предполагало создание временной спецификации для сортировки список (это другой способ сделать это, но он будет менее элегантным). –

+1

'arr = Selection.Value' необходимо изменить на' arr = sel.Value' и должна быть некоторая обработка ошибок. Но хорошая работа +1 –

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