Всем привет! Наверное я чего-то перемудрил под вечер пятницы. Хотел запихнуть переменную в оператор Sort в CustomOrder. Но чёт не проходит так. Что не так делаю? Задумка была такая - если первая буква М в ячейке С1 русская то порядок сортировки из русских букв М. Если английская то английская. [vba]
Код
Sub sort() Dim CusOrd As String Dim f As String Dim s As String Dim LC As Integer Set twb = ActiveSheet 'ActiveWorkbook.Worksheets(1) With twb
LC = .Cells(Rows.count, 1).End(xlUp).Row s = .Range("c1").Value Select Case f = Left(s, 1) Case f = "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case f = "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
.Sort.SortFields.Clear .Sort.SortFields.Add Key:=Range("C1:C" & LC), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CusOrd, DataOption:=xlSortNormal With .Sort .SetRange Range("A1:D" & LC) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End with End sub
[/vba]
Всем привет! Наверное я чего-то перемудрил под вечер пятницы. Хотел запихнуть переменную в оператор Sort в CustomOrder. Но чёт не проходит так. Что не так делаю? Задумка была такая - если первая буква М в ячейке С1 русская то порядок сортировки из русских букв М. Если английская то английская. [vba]
Код
Sub sort() Dim CusOrd As String Dim f As String Dim s As String Dim LC As Integer Set twb = ActiveSheet 'ActiveWorkbook.Worksheets(1) With twb
LC = .Cells(Rows.count, 1).End(xlUp).Row s = .Range("c1").Value Select Case f = Left(s, 1) Case f = "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case f = "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
.Sort.SortFields.Clear .Sort.SortFields.Add Key:=Range("C1:C" & LC), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CusOrd, DataOption:=xlSortNormal With .Sort .SetRange Range("A1:D" & LC) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End with End sub
Select Case Left(s, 1) Case "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] или вот так [vba]
Код
f = Left(s, 1) Select Case True Case f = "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case f = "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] а если при объявлении переменной задать длину, то можно и не использовать Left() [vba]
Код
Sub sort() Dim CusOrd As String Dim f As String * 1 Dim LC As Integer Set twb = ActiveSheet 'ActiveWorkbook.Worksheets(1) With twb LC = .Cells(Rows.Count, 1).End(xlUp).Row f = .Range("c1").Value Select Case f Case "M", "М" CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & f), 2) Case Else Exit Sub End Select .sort.SortFields.Clear .sort.SortFields.Add Key:=Range("C1:C" & LC), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CusOrd, DataOption:=xlSortNormal With .sort .SetRange Range("A1:D" & LC) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With End Sub
[/vba]
Здравствуйте, у вас ошибка в блоке [vba]
Код
Select Case ... End Select
[/vba] вот так будет правильно [vba]
Код
Select Case Left(s, 1) Case "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] или вот так [vba]
Код
f = Left(s, 1) Select Case True Case f = "M" 'M англ CusOrd = "M1,M2,M3,M4,M5,M6,M7,M8,M9,M10" Case f = "М" 'M русск CusOrd = "М1,М2,М3,М4,М5,М6,М7,М8,М9,М10" End Select
[/vba] а если при объявлении переменной задать длину, то можно и не использовать Left() [vba]
Код
Sub sort() Dim CusOrd As String Dim f As String * 1 Dim LC As Integer Set twb = ActiveSheet 'ActiveWorkbook.Worksheets(1) With twb LC = .Cells(Rows.Count, 1).End(xlUp).Row f = .Range("c1").Value Select Case f Case "M", "М" CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & f), 2) Case Else Exit Sub End Select .sort.SortFields.Clear .sort.SortFields.Add Key:=Range("C1:C" & LC), _ SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CusOrd, DataOption:=xlSortNormal With .sort .SetRange Range("A1:D" & LC) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With End Sub
Да ошибку эту заметил перед самым уходом с работы. Ситуацию не спасло. Завтра попробую все предложенные методы. Наверно всё дело в предложенном Pelena, [vba]
Да ошибку эту заметил перед самым уходом с работы. Ситуацию не спасло. Завтра попробую все предложенные методы. Наверно всё дело в предложенном Pelena, [vba]
[/vba] Получилась довольно универсальная сортировка. Хотя изначально мне всего 6 букв надо было обрабатывать (3 в русской расскладке и 3 в английской).
Правда есть подозрения что работать такая сортировка будет до М99. Потом скорей всего М100 окажется после М10.
И для чего нужен Nil?
Что ж спасибо вам! Работает теперь! Сделал так в итоге: [vba]
Код
Dim s As String * 1 'строка длиной 1 символ Dim LC As Integer
LC = .Cells(Rows.count, 1).End(xlUp).Row s = .Range("c1").Value
Select Case True Case s <> "" CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & s), 2) Case Else MsgBox "что-то пошло не так" End Select
[/vba] Получилась довольно универсальная сортировка. Хотя изначально мне всего 6 букв надо было обрабатывать (3 в русской расскладке и 3 в английской).
Правда есть подозрения что работать такая сортировка будет до М99. Потом скорей всего М100 окажется после М10.
Это я немного ступил, не из той оперы. Нету Nil в vba, там должен быть "" или vbnullstring или empty. А нужно это для того, чтобы перед единицей тоже вставился разделитель [vba]
Код
"," & s
[/vba], а [vba]
Код
mid(join( ... , ...),2)
[/vba] нужно чтобы убрать лишнюю запятую в начале И есть еще один нюанс. Если при объявлении строковой переменной задана длина, то компилятор по дефолту присваивает этой переменной значение [vba]
Код
String(n," ")
[/vba],т.е. строка, состоящая из n пробелов, где n = объявленная длина. Поэтому вместо [vba]
Это я немного ступил, не из той оперы. Нету Nil в vba, там должен быть "" или vbnullstring или empty. А нужно это для того, чтобы перед единицей тоже вставился разделитель [vba]
Код
"," & s
[/vba], а [vba]
Код
mid(join( ... , ...),2)
[/vba] нужно чтобы убрать лишнюю запятую в начале И есть еще один нюанс. Если при объявлении строковой переменной задана длина, то компилятор по дефолту присваивает этой переменной значение [vba]
Код
String(n," ")
[/vba],т.е. строка, состоящая из n пробелов, где n = объявленная длина. Поэтому вместо [vba]
krosav4ig, мне не даёт покоя ещё один вопрос почему при объединении массива в строку получается именно М1, М2... а не 1М, 2М... Вот эта строчка какая-то слишком хитрая всё равно, даже с учётом всех объяснённых нюансах. [vba]
krosav4ig, мне не даёт покоя ещё один вопрос почему при объединении массива в строку получается именно М1, М2... а не 1М, 2М... Вот эта строчка какая-то слишком хитрая всё равно, даже с учётом всех объяснённых нюансах. [vba]
Ещё подумав минут 15 дошло наконец-то! Функция JOIN состоит из двух частей, обязательной (массив) и не обязательной (разделитель). Необязательная часть в моём случае это запятая и переменная "," & s. Далее разделитель вставляется между элементами массива. Поэтому нужен пустой элемент "" вначале (если бы надо было получать 1М а не М1 то пустой элемент вставлять в конце). Хотя надо заметить с тем самым Nil тоже всё работало. Ну и Mid возвращает строку начиная со второго символа. Большое спасибо! Обязуюсь выучить эти моменты и больше с подобным не приставать)))
Ещё подумав минут 15 дошло наконец-то! Функция JOIN состоит из двух частей, обязательной (массив) и не обязательной (разделитель). Необязательная часть в моём случае это запятая и переменная "," & s. Далее разделитель вставляется между элементами массива. Поэтому нужен пустой элемент "" вначале (если бы надо было получать 1М а не М1 то пустой элемент вставлять в конце). Хотя надо заметить с тем самым Nil тоже всё работало. Ну и Mid возвращает строку начиная со второго символа. Большое спасибо! Обязуюсь выучить эти моменты и больше с подобным не приставать)))fairylive