Есть разные переменные (А1-А8), которые отвечают каждая за свой столбец.
[vba]
Код
If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal
[/vba]
Как можно упростить этот код через цикл For? Данные конструкция у меня отказывается работать, возможно нужно задать тип переменной... [vba]
Код
For i = 1 To 8 If ("A" & i) = "" Then .SortFields.Add ("A" & i), xlSortOnValues, OrderSwitch, xlSortNormal Next
[/vba]
Есть разные переменные (А1-А8), которые отвечают каждая за свой столбец.
[vba]
Код
If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal
[/vba]
Как можно упростить этот код через цикл For? Данные конструкция у меня отказывается работать, возможно нужно задать тип переменной... [vba]
Код
For i = 1 To 8 If ("A" & i) = "" Then .SortFields.Add ("A" & i), xlSortOnValues, OrderSwitch, xlSortNormal Next
Конечно не будет работать, ВБА не понимает "склеенные переменные" Чтобы работало как Вы хотите нужно использовать либо массив, либо словарь или коллекцию, и т.д. Так из кода ничего не понятно - где и как Вы присваиваете эти переменные? Положите файл-пример
Конечно не будет работать, ВБА не понимает "склеенные переменные" Чтобы работало как Вы хотите нужно использовать либо массив, либо словарь или коллекцию, и т.д. Так из кода ничего не понятно - где и как Вы присваиваете эти переменные? Положите файл-пример SLAVICK
_Boroda_, немного не то, т.к. А1 переменная и равна: A1 = [B1] и т.д. Файл примера приложить не получилось, ибо состоит из кучи сторонних макросов, разъединить не получилось )
Раз переменные склеить нельзя, то и вопрос мой отпадает. Спасибо
_Boroda_, немного не то, т.к. А1 переменная и равна: A1 = [B1] и т.д. Файл примера приложить не получилось, ибо состоит из кучи сторонних макросов, разъединить не получилось )
Раз переменные склеить нельзя, то и вопрос мой отпадает. Спасибоrever27
_Boroda_, может я ошибаюсь, но по моему есть нарушение Пункта 3 правил форума. Общие ответы, как это сделать уже дали. Вы, получается, дальше помогаете без конкретного примера Мы же не знаем, где и когда объявляются переменные :) [moder]Было разъяснение Сергея его понимания политики по поводу приложения файла-примера. Поищите. Это не мое мнение, более того, я с ним не согласен, но хозяин сайта он.
_Boroda_, может я ошибаюсь, но по моему есть нарушение Пункта 3 правил форума. Общие ответы, как это сделать уже дали. Вы, получается, дальше помогаете без конкретного примера Мы же не знаем, где и когда объявляются переменные :) [moder]Было разъяснение Сергея его понимания политики по поводу приложения файла-примера. Поищите. Это не мое мнение, более того, я с ним не согласен, но хозяин сайта он.SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал _Boroda_ - Понедельник, 20.07.2015, 11:22
Там 2 макроса, отвечающие за сортировку по столбцам R и S. И один общий макрос для выполнения данной сортировки. Все так усложнено, потому что для каждой сортировки нужна определенная последовательность столбцов. Вопрос же остается прежним. Как визуально улучшить вид макроса, сократив перечень повторяющихся операций?
Товарищи, вот файл примера
Там 2 макроса, отвечающие за сортировку по столбцам R и S. И один общий макрос для выполнения данной сортировки. Все так усложнено, потому что для каждой сортировки нужна определенная последовательность столбцов. Вопрос же остается прежним. Как визуально улучшить вид макроса, сократив перечень повторяющихся операций?rever27
'Dim A1, A2, A3, A4, A5, A6, A7, A8, A9 Sub b_Sort_Settings(ParamArray aSortKeys()) 'Общая сортировка значений (Не работает отдельно)
If Selection.Count > 20 Then If SortSwitch = False Then SortSwitch = True Else SortSwitch = False Else: If Selection.Count = 1 Then SortSwitch = False End If
If SortSwitch = True Then OrderSwitch = xlDescending Else OrderSwitch = xlAscending
Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).End(xlDown)).Select With ActiveSheet.Sort .SortFields.Clear
For i = 0 To UBound(aSortKeys) If TypeName(aSortKeys(i)) = "Range" Then .SortFields.Add aSortKeys(i), xlSortOnValues, OrderSwitch, xlSortNormal End If Next i ' If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal ' If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal ' If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal ' If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal ' If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal ' If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal ' If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal ' If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal ' If A9 = "" Then .SortFields.Add A9, xlSortOnValues, xlDescending, xlSortNormal .SetRange Selection .Apply End With
End Sub Sub b_Sort_R() 'Сортировка по столбцу R ' Set A1 = [R1]: Set A2 = [Q1]: Set A3 = [U1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings b_Sort_Settings [R1], [Q1], [U1] End Sub Sub b_Sort_S() 'Сортировка по столбцу S ' Set A1 = [S1]: Set A2 = [Q1]: Set A3 = [M1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings b_Sort_Settings [S1], [Q1], [M1] End Sub
[/vba]
предложу так:
[vba]
Код
'Dim A1, A2, A3, A4, A5, A6, A7, A8, A9 Sub b_Sort_Settings(ParamArray aSortKeys()) 'Общая сортировка значений (Не работает отдельно)
If Selection.Count > 20 Then If SortSwitch = False Then SortSwitch = True Else SortSwitch = False Else: If Selection.Count = 1 Then SortSwitch = False End If
If SortSwitch = True Then OrderSwitch = xlDescending Else OrderSwitch = xlAscending
Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).End(xlDown)).Select With ActiveSheet.Sort .SortFields.Clear
For i = 0 To UBound(aSortKeys) If TypeName(aSortKeys(i)) = "Range" Then .SortFields.Add aSortKeys(i), xlSortOnValues, OrderSwitch, xlSortNormal End If Next i ' If A1 = "" Then .SortFields.Add A1, xlSortOnValues, OrderSwitch, xlSortNormal ' If A2 = "" Then .SortFields.Add A2, xlSortOnValues, OrderSwitch, xlSortNormal ' If A3 = "" Then .SortFields.Add A3, xlSortOnValues, OrderSwitch, xlSortNormal ' If A4 = "" Then .SortFields.Add A4, xlSortOnValues, OrderSwitch, xlSortNormal ' If A5 = "" Then .SortFields.Add A5, xlSortOnValues, OrderSwitch, xlSortNormal ' If A6 = "" Then .SortFields.Add A6, xlSortOnValues, OrderSwitch, xlSortNormal ' If A7 = "" Then .SortFields.Add A7, xlSortOnValues, OrderSwitch, xlSortNormal ' If A8 = "" Then .SortFields.Add A8, xlSortOnValues, OrderSwitch, xlSortNormal ' If A9 = "" Then .SortFields.Add A9, xlSortOnValues, xlDescending, xlSortNormal .SetRange Selection .Apply End With
End Sub Sub b_Sort_R() 'Сортировка по столбцу R ' Set A1 = [R1]: Set A2 = [Q1]: Set A3 = [U1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings b_Sort_Settings [R1], [Q1], [U1] End Sub Sub b_Sort_S() 'Сортировка по столбцу S ' Set A1 = [S1]: Set A2 = [Q1]: Set A3 = [M1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings b_Sort_Settings [S1], [Q1], [M1] End Sub
Dim m 'A1, A2, A3, A4, A5, A6, A7, A8, A9 Sub b_Sort_Settings() 'Общая сортировка значений (Не работает отдельно)
If Selection.Count > 20 Then If SortSwitch = False Then SortSwitch = True Else SortSwitch = False Else: If Selection.Count = 1 Then SortSwitch = False End If
If SortSwitch = True Then OrderSwitch = xlDescending Else OrderSwitch = xlAscending
Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).End(xlDown)).Select With ActiveSheet.Sort .SortFields.Clear For i = 0 To 8 If Not m(i) = "NO" Then If Range(m(i)) = "" Then .SortFields.Add Range(m(i)), xlSortOnValues, OrderSwitch, xlSortNormal Next .SetRange Selection .Apply End With End Sub Sub b_Sort_R() 'Сортировка по столбцу R
m = Array("R1", "Q1", "U1", "NO", "NO", "NO", "NO", "NO", "NO"): b_Sort_Settings ' Set A1 = [R1]: Set A2 = [Q1]: Set A3 = [U1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings End Sub Sub b_Sort_S() 'Сортировка по столбцу S
' Set A1 = [S1]: Set A2 = [Q1]: Set A3 = [M1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings End Sub
[/vba]
Саня опередил
Так?:
[vba]
Код
Dim m 'A1, A2, A3, A4, A5, A6, A7, A8, A9 Sub b_Sort_Settings() 'Общая сортировка значений (Не работает отдельно)
If Selection.Count > 20 Then If SortSwitch = False Then SortSwitch = True Else SortSwitch = False Else: If Selection.Count = 1 Then SortSwitch = False End If
If SortSwitch = True Then OrderSwitch = xlDescending Else OrderSwitch = xlAscending
Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).End(xlDown)).Select With ActiveSheet.Sort .SortFields.Clear For i = 0 To 8 If Not m(i) = "NO" Then If Range(m(i)) = "" Then .SortFields.Add Range(m(i)), xlSortOnValues, OrderSwitch, xlSortNormal Next .SetRange Selection .Apply End With End Sub Sub b_Sort_R() 'Сортировка по столбцу R
m = Array("R1", "Q1", "U1", "NO", "NO", "NO", "NO", "NO", "NO"): b_Sort_Settings ' Set A1 = [R1]: Set A2 = [Q1]: Set A3 = [U1]: A4 = "NO": A5 = "NO": A6 = "NO": A7 = "NO": A8 = "NO": A9 = "NO": b_Sort_Settings End Sub Sub b_Sort_S() 'Сортировка по столбцу S