2015-09-15 12 views
0

Я просмотрел Google и Stack примеры того, что я пытаюсь сделать, в то время как я нашел несколько примеров выполнения части того, что я пытаюсь сделать, у меня возникают проблемы выполняя желаемый результат. Я включил приведенный ниже код, который, похоже, будет выглядеть так, как я буду делать. К сожалению, я получаю «Подзаголовок вне диапазона», который, как я полагаю, имеет отношение к моему синтаксису.Сортировка коллекции столбцов на основе диапазона

На скриншотах включены Я пытаюсь сортировать столбцы, найденные на «Sheet2», порядка значений, найденных в столбце A на «Sheet1». Понятно, что

Я считаю, что лучшим маршрутом было бы присвоение значений в sheet1 массиву, столбцам в sheet2 для массива и последующему порядку array2 в соответствии с массивом.

Любые мысли о том, как это сделать? Любая помощь приветствуется:

Public Sub sortColumn() 
Dim rng As Range 
Dim i As Integer 
Dim J As Integer 
Dim Temp 
Dim nams As Variant 
Dim F 
Dim Dex As Integer 
Dim Arr As Variant 


nams = Array(Worksheets("Sheet1").Range("A1:A350").Value2) 

Set rng = Worksheets("Sheet2").Range("B1:JS1") 
For i = 1 To rng.Columns.Count 
    For J = i To rng.Columns.Count 
     For F = 0 To UBound(nams) 
      If nams(F) = rng(J) Then Dex = F: Exit For 
     Next F 
     If F < i Then 
      Temp = rng.Columns(i).value 
      rng(i).Resize(rng.Rows.Count) = rng.Columns(J).value 
      rng(J).Resize(rng.Rows.Count) = Temp 
     End If 
    Next J 
Next i 


End Sub 

Над кодом, как указано выше, результаты в «Sub сценария из диапазона». Я проверял имена диапазонов, и они действительны. Ниже графики показывают, что я работаю с:

enter image description here

enter image description here

+0

Вы можете создать собственный список, основанный на листе один, два рода листа слева направо, а затем удалить пользовательский список, который вы только что создали. Вдоль тех же строк, что и [this] (http://stackoverflow.com/questions/6100944/code-an-excel-vba-sort-with-a-custom-order-and-a-value-containing-commas) –

+0

Когда вы создаете собственный список, список остается статичным. Значения на листе1, к сожалению, постоянно меняются, – Singularity20XX

+0

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

ответ

0

Может быть достигнуто без VBA, если строка добавляется к верхней части второго листа с формулой, такие как:

=MATCH(B2,Sheet1!$A:$A,0) 

в B1 скопированы напротив, а затем столбцы B, отсортированные по строке Row1.

0

Как обсуждалось в комментариях ОП.

Сначала создайте пользовательский список на основе содержимого на sheet1 (я положу их все вместе):

Dim cstListArr() As Variant 
cstListArr = wst1.Range(Range("A1"), Range("A1").End(xlDown)) 
Application.AddCustomList ListArray:=cstListArr 

затем сортировать слева направо

Set srtRng = wst2.Range(Range("B1"), Range("B1").End(xlDown).End(xlToRight)) 

wst2.Sort.SortFields.Clear 
srtRng.Sort Key1:=wst2.Range("B1:JS1"), Order1:=xlAscending, Header:=xlGuess, _ 
OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _ 
Orientation:=xlLeftToRight, DataOption1:=xlSortNormal 

затем избавиться от обычая сортировать только что созданный.

Application.DeleteCustomList Application.CustomListCount 

Так все вместе:

Dim wst1 As Worksheet 
Dim wst2 As Worksheet 
Set wst1 = ActiveWorkbook.Worksheets("Sheet1") 
Set wst2 = ActiveWorkbook.Worksheets("Sheet2") 
Dim srtRng As Range 

wst1.Activate 
Dim cstListArr() As Variant 
cstListArr = wst1.Range(Range("A1"), Range("A1").End(xlDown)) 
Application.AddCustomList ListArray:=cstListArr 

wst2.Activate 
Set srtRng = wst2.Range(Range("B1"), Range("B1").End(xlDown).End(xlToRight)) 

wst2.Sort.SortFields.Clear 
srtRng.Sort Key1:=wst2.Range("B1:JS1"), Order1:=xlAscending, Header:=xlGuess, _ 
    OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _ 
    Orientation:=xlLeftToRight, DataOption1:=xlSortNormal 


Application.DeleteCustomList Application.CustomListCount 
Смежные вопросы