Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Переменная в операторе Sort - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Переменная в операторе Sort (Макросы/Sub)
Переменная в операторе Sort
fairylive Дата: Пятница, 11.11.2016, 17:21 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 87
Репутация: 3 ±
Замечаний: 0% ±

Excel 2016
Всем привет! Наверное я чего-то перемудрил под вечер пятницы. Хотел запихнуть переменную в оператор 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]


Сообщение отредактировал fairylive - Пятница, 11.11.2016, 17:37
 
Ответить
СообщениеВсем привет! Наверное я чего-то перемудрил под вечер пятницы. Хотел запихнуть переменную в оператор 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]

Автор - fairylive
Дата добавления - 11.11.2016 в 17:21
krosav4ig Дата: Пятница, 11.11.2016, 18:22 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1340
Репутация: 536 ±
Замечаний: 0% ±

Excel 2007, 2013
Здравствуйте, у вас ошибка в блоке [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]или вообще вот так
[vba]
Код
CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & Left(s, 1)), 2)
[/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]


(_)Õvõ(_)

Сообщение отредактировал krosav4ig - Пятница, 11.11.2016, 18:41
 
Ответить
СообщениеЗдравствуйте, у вас ошибка в блоке [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]или вообще вот так
[vba]
Код
CusOrd = Mid(Join(Array(Nil, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & Left(s, 1)), 2)
[/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]

Автор - krosav4ig
Дата добавления - 11.11.2016 в 18:22
Pelena Дата: Пятница, 11.11.2016, 18:30 | Сообщение № 3
Группа: Модераторы
Ранг: Экселист
Сообщений: 9842
Репутация: 2252 ±
Замечаний: 0% ±

Excel 2010 & Mac Excel 2011
fairylive, попробуйте так написать
[vba]
Код
CustomOrder:=CStr(CusOrd)
[/vba]


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
Сообщениеfairylive, попробуйте так написать
[vba]
Код
CustomOrder:=CStr(CusOrd)
[/vba]

Автор - Pelena
Дата добавления - 11.11.2016 в 18:30
fairylive Дата: Пятница, 11.11.2016, 23:11 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 87
Репутация: 3 ±
Замечаний: 0% ±

Excel 2016
Здравствуйте, у вас ошибка в блоке

Да ошибку эту заметил перед самым уходом с работы. Ситуацию не спасло.
Завтра попробую все предложенные методы.
Наверно всё дело в предложенном Pelena,
[vba]
Код
CustomOrder:=CStr(CusOrd)
[/vba]
 
Ответить
Сообщение
Здравствуйте, у вас ошибка в блоке

Да ошибку эту заметил перед самым уходом с работы. Ситуацию не спасло.
Завтра попробую все предложенные методы.
Наверно всё дело в предложенном Pelena,
[vba]
Код
CustomOrder:=CStr(CusOrd)
[/vba]

Автор - fairylive
Дата добавления - 11.11.2016 в 23:11
fairylive Дата: Суббота, 12.11.2016, 16:45 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 87
Репутация: 3 ±
Замечаний: 0% ±

Excel 2016
Что ж спасибо вам! Работает теперь! Сделал так в итоге:
[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

        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=Range("C1:C" & LC), _
            SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CStr(CusOrd), DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("A1:D" & LC)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
[/vba]
Получилась довольно универсальная сортировка. Хотя изначально мне всего 6 букв надо было обрабатывать (3 в русской расскладке и 3 в английской).

Правда есть подозрения что работать такая сортировка будет до М99. Потом скорей всего М100 окажется после М10.

И для чего нужен Nil?


Сообщение отредактировал fairylive - Суббота, 12.11.2016, 17:59
 
Ответить
СообщениеЧто ж спасибо вам! Работает теперь! Сделал так в итоге:
[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

        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=Range("C1:C" & LC), _
            SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=CStr(CusOrd), DataOption:=xlSortNormal
        With .Sort
            .SetRange Range("A1:D" & LC)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
[/vba]
Получилась довольно универсальная сортировка. Хотя изначально мне всего 6 букв надо было обрабатывать (3 в русской расскладке и 3 в английской).

Правда есть подозрения что работать такая сортировка будет до М99. Потом скорей всего М100 окажется после М10.

И для чего нужен Nil?

Автор - fairylive
Дата добавления - 12.11.2016 в 16:45
krosav4ig Дата: Суббота, 12.11.2016, 22:06 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1340
Репутация: 536 ±
Замечаний: 0% ±

Excel 2007, 2013
И для чего нужен Nil?

Это я немного ступил, не из той оперы. Нету Nil в vba, там должен быть "" или vbnullstring или empty. А нужно это для того, чтобы перед единицей тоже вставился разделитель [vba]
Код
"," & s
[/vba], а [vba]
Код
mid(join( ... , ...),2)
[/vba] нужно чтобы убрать лишнюю запятую в начале
И есть еще один нюанс. Если при объявлении строковой переменной задана длина, то компилятор по дефолту присваивает этой переменной значение [vba]
Код
String(n," ")
[/vba],т.е. строка, состоящая из n пробелов, где n = объявленная длина. Поэтому вместо [vba]
Код
s <> ""
[/vba]нужно [vba]
Код
trim(s) <> ""
[/vba]


(_)Õvõ(_)
 
Ответить
Сообщение
И для чего нужен Nil?

Это я немного ступил, не из той оперы. Нету Nil в vba, там должен быть "" или vbnullstring или empty. А нужно это для того, чтобы перед единицей тоже вставился разделитель [vba]
Код
"," & s
[/vba], а [vba]
Код
mid(join( ... , ...),2)
[/vba] нужно чтобы убрать лишнюю запятую в начале
И есть еще один нюанс. Если при объявлении строковой переменной задана длина, то компилятор по дефолту присваивает этой переменной значение [vba]
Код
String(n," ")
[/vba],т.е. строка, состоящая из n пробелов, где n = объявленная длина. Поэтому вместо [vba]
Код
s <> ""
[/vba]нужно [vba]
Код
trim(s) <> ""
[/vba]

Автор - krosav4ig
Дата добавления - 12.11.2016 в 22:06
fairylive Дата: Суббота, 12.11.2016, 22:16 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 87
Репутация: 3 ±
Замечаний: 0% ±

Excel 2016
krosav4ig, мне не даёт покоя ещё один вопрос почему при объединении массива в строку получается именно М1, М2... а не 1М, 2М... Вот эта строчка какая-то слишком хитрая всё равно, даже с учётом всех объяснённых нюансах.
[vba]
Код
CusOrd = Mid(Join(Array("", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & s), 2)
[/vba]
 
Ответить
Сообщениеkrosav4ig, мне не даёт покоя ещё один вопрос почему при объединении массива в строку получается именно М1, М2... а не 1М, 2М... Вот эта строчка какая-то слишком хитрая всё равно, даже с учётом всех объяснённых нюансах.
[vba]
Код
CusOrd = Mid(Join(Array("", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "," & s), 2)
[/vba]

Автор - fairylive
Дата добавления - 12.11.2016 в 22:16
krosav4ig Дата: Воскресенье, 13.11.2016, 01:50 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1340
Репутация: 536 ±
Замечаний: 0% ±

Excel 2007, 2013
а так понятнее будет?
К сообщению приложен файл: 5527543.gif(8Kb)


(_)Õvõ(_)
 
Ответить
Сообщениеа так понятнее будет?

Автор - krosav4ig
Дата добавления - 13.11.2016 в 01:50
fairylive Дата: Воскресенье, 13.11.2016, 15:25 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 87
Репутация: 3 ±
Замечаний: 0% ±

Excel 2016
а так понятнее будет?

Ещё подумав минут 15 дошло наконец-то!
Функция JOIN состоит из двух частей, обязательной (массив) и не обязательной (разделитель). Необязательная часть в моём случае это запятая и переменная "," & s. Далее разделитель вставляется между элементами массива. Поэтому нужен пустой элемент "" вначале (если бы надо было получать 1М а не М1 то пустой элемент вставлять в конце). Хотя надо заметить с тем самым Nil тоже всё работало. Ну и Mid возвращает строку начиная со второго символа.
Большое спасибо! Обязуюсь выучить эти моменты и больше с подобным не приставать)))
 
Ответить
Сообщение
а так понятнее будет?

Ещё подумав минут 15 дошло наконец-то!
Функция JOIN состоит из двух частей, обязательной (массив) и не обязательной (разделитель). Необязательная часть в моём случае это запятая и переменная "," & s. Далее разделитель вставляется между элементами массива. Поэтому нужен пустой элемент "" вначале (если бы надо было получать 1М а не М1 то пустой элемент вставлять в конце). Хотя надо заметить с тем самым Nil тоже всё работало. Ну и Mid возвращает строку начиная со второго символа.
Большое спасибо! Обязуюсь выучить эти моменты и больше с подобным не приставать)))

Автор - fairylive
Дата добавления - 13.11.2016 в 15:25
krosav4ig Дата: Воскресенье, 13.11.2016, 17:53 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1340
Репутация: 536 ±
Замечаний: 0% ±

Excel 2007, 2013
с тем самым Nil тоже всё работало
А это потому, что первой строкой модуля не прописано [vba]
Код
Option Explicit
[/vba]


(_)Õvõ(_)
 
Ответить
Сообщение
с тем самым Nil тоже всё работало
А это потому, что первой строкой модуля не прописано [vba]
Код
Option Explicit
[/vba]

Автор - krosav4ig
Дата добавления - 13.11.2016 в 17:53
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Переменная в операторе Sort (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2016 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!