Здравствуйте,
Нужно отсортировать данные внутри каждой ячейки не сортируя ячейки между собой.
Каждая строчка данных в ячейке разделена <br>, пример:
многофункциональное устройство - canon clc2620<br>
многофункциональное устройство - canon clc3200<br>
многофункциональное устройство - canon clc3220<br>
многофункциональное устройство - canon ir-c2620<br>
многофункциональное устройство - canon ir-c2620n<br>
многофункциональное устройство - canon ir-c3200<br>
многофункциональное устройство - canon ir-c3200n<br>
многофункциональное устройство - canon ir-c3220<br>
многофункциональное устройство - canon ir-c3220n
Классический метод сортировки сортирует строчки и столбцы.
Подскажите пжл макрос и как его интегрировать в Эксель.
Добрый день!
Я тоже, беря пример с Вас, позволю без примера...
Итак, Интегрировать в Excel просто: Alt+F11 и Вы попадаете в среду разработки макросов VBA. Ну или на ярлычке листа
ПКМ (правой кнопкой мышки) и кликнуть по
Исходный текстДалее в редакторе пишем:
Sub SortNeTarKakNado()
'Между этими "субчиками" и разместим код макроса
End Subсобственно сам мкрос, что он делает? Пробегает по ячейкам выделенного блока ячеек (ну, тут наверное следует определять что собственно выделено: часть строки - столбца или часть нескольких строк - столбцов?!). Значения каждой ячейки разбивает по параметру <br>, в одномерный массив. Массив сортирует, ну скажем "методом пузырька". Результат сортировки записывает в ячейку (ту же откуда была взята исходная информация, либо правее - левее -выше - ниже исходной ячейки).
Вот пример функции сортирующей массив, причем одномерный массив в данном случае - частный случай. Эта функция может сортировать и двумерные массивы:
Function sortArr(spisok() As String, nomColSort As Integer, glubina As Integer)
Dim rrBl() As String
Dim endArr As Long, i As Long, j As Long, k As Long
i = 0
j = 0
k = 0
endArr = 0
If glubina > 0 Then
endArr = UBound(spisok, glubina)
For i = 1 To endArr
For j = endArr To i Step -1
If spisok(nomColSort, j - 1) > spisok(nomColSort, j) Then
k = 0
For k = LBound(spisok, 1) To UBound(spisok, 1)
ReDim Preserve rrBl(k)
rrBl(k) = spisok(k, j - 1)
Next k
k = 0
For k = LBound(spisok, 1) To UBound(spisok, 1)
spisok(k, j - 1) = spisok(k, j)
spisok(k, j) = rrBl(k)
Next k
End If
Next j
Next i
Else
endArr = UBound(spisok)
For i = 1 To endArr
For j = endArr To i Step -1
If spisok(j - 1) > spisok(j) Then
tmp = spisok(j - 1)
spisok(j - 1) = spisok(j)
spisok(j) = tmp
End If
Next j
Next i
End If
sortArr = spisok
i = 0
j = 0
k = 0
Erase rrBl
Erase spisok
End Function
И так, если будут вопросы при реализации - пишите, постараюсь ответить.
Спасибо за помощь, в меру своих возможностей и полноты Вашего мануала сделал слеюдующее:
1. открыл таблицу excel
2. нажал alt+f11
3. вставил
Sub SortNeTarKakNado()
+внутри приведенны Вами код
End Sub
4. сохранил в среде VBA нажав на дискетку
5. перешел в View Microsoft Excel
6. Выделил столбец с нужными ячейками
7. Сервис > Макрос > Макросы (находится Эта книга) > команда Выполнить
Тогда, получаю ошибку:
"Compile error:
Expected end Sub"
Скрины ошибки и файл .xls прикреплен к письму, спасибо.
Цитата: spono от 20.03.2012, 14:00
3. вставил
Sub SortNeTarKakNado()
+внутри приведенны Вами код
End Sub
Вот этого не надо было делать.
Попытался нарисовать последовательность действий в редакторе VBA
Указанные Вами шаги на картинке я выполнил.
1. На картинке не указанно куда вставлять:
Sub SortNeTarKakNado()
End Sub
2. Как в таком случае, запустить макрос в Эксель?
Сервис > Макрос > Макросы (ПУСТО)
чтото типа такого
Цитата: spono от 20.03.2012, 14:25
Указанные Вами шаги на картинке я выполнил.
Теперь возвращайтесь в Excel (Alt+F11) и используйте функцию на листе.
Цитата: Serge 007 от 20.03.2012, 14:12
Попытался нарисовать последовательность действий в редакторе VBA
Здравствуйте, Sergio007!
Все хочу написать мануал, со скриншотами, для начинающих пользователей, типа как настроить VBA - редакктор, да все времени не хватает. Может продолжите Вашеп начинание и наверно его следует закрепить в начале раздела! То-то новички на ниве прогерства будут благодарны!
Удачи!
Это обязательно нужно ))
Цитировать
чтото типа такого
MCH да, сортировка в данном случае производится!!!
Однако существует косяк - форматирование отсортированных данных в одну строчку внутри ячейки!
Пример, имеем:
222
444
111
333
После использования "Вставка функции" > "Полный алфавитный перечень" > "SortBr" > "Указываем ячейку с исходными данными"
На выходе получаем:
111222333444
Исходные данные вместо 4 строк принимаю вид одной строки.
Интересно, что с моими данными(из первого поста) происходит тоже самое, однако при клике мышью внутри отсортированной ячейки и далее кликом на другой ячейке.
В ячейках с отсортированными данными снова появляются строчки.
1. Использую приведенный код:
Function sortArr(spisok() As String, nomColSort As Integer, glubina As Integer)
Dim rrBl() As String
Dim endArr As Long, i As Long, j As Long, k As Long
i = 0
j = 0
k = 0
endArr = 0
If glubina > 0 Then
endArr = UBound(spisok, glubina)
For i = 1 To endArr
For j = endArr To i Step -1
If spisok(nomColSort, j - 1) > spisok(nomColSort, j) Then
k = 0
For k = LBound(spisok, 1) To UBound(spisok, 1)
ReDim Preserve rrBl(k)
rrBl(k) = spisok(k, j - 1)
Next k
k = 0
For k = LBound(spisok, 1) To UBound(spisok, 1)
spisok(k, j - 1) = spisok(k, j)
spisok(k, j) = rrBl(k)
Next k
End If
Next j
Next i
Else
endArr = UBound(spisok)
For i = 1 To endArr
For j = endArr To i Step -1
If spisok(j - 1) > spisok(j) Then
tmp = spisok(j - 1)
spisok(j - 1) = spisok(j)
spisok(j) = tmp
End If
Next j
Next i
End If
sortArr = spisok
i = 0
j = 0
k = 0
Erase rrBl
Erase spisok
End Function
2. Делаю по Инструкциям Serge 007
3. "Вставка функции" > "Полный алфавитный перечень" > "SortBr" > "Указываем ячейку с исходными данными" > "SortArr"
Окно "Аргументы функции"
Spisok
NomColSort
Glubina
Методом исключения )) указываю различные вариации 3 аргументов выше.
Однако в 100% случаях получаю: #Знач!
Что не так?
Цитата: spono от 20.03.2012, 19:33
сортировка в данном случае производится!!!
Однако существует косяк...
ну так приложите пример в виде xls файла с информацией "что есть" и "что хочу"
А то гадать по картинкам не получается.
ɔнǝɔɐdʇɔʞє ǝн ʁ
excel файл с примерами прикреплен к сообщению
в Формате ячейки в разделе "выравнивание" поставте галку "переносить по словам"
Добрый день, коллеги!
Ставить галки, дело хорошее. Но, макрос для того и пишется, что бы работал независимо от выставленных галок.
И тут вариантов решения несколько.
Один вариант в том, что бы проверять установленные в системе настройки, важные для работы макроса и, ежли оные отличаются - программно их менять, на время работы макроса, а по окончании работы все возвернуть как було!
Второй вариант, применительно к этой задаче: при формировании строки массива, между элементами массива, вставлять принудительный перевод строки (chr(10)). Приведенная последовательность "111222333444", будет в массиве выглядеть так:
"111" & chr(10) & "222" & chr(10) & "333" & chr(10) & "444".
Цитата: GWolf от 21.03.2012, 08:51
Ставить галки, дело хорошее. Но, макрос для того и пишется, что бы работал независимо от выставленных галок.
А я макрос и не писал.
UDF которую я приводил в примере сама раставляет vbLf /Chr(10) после <br>
если открыть файл SortArray212.xls , то там есть переносы, толко в формате ячейки не разрешено переносить слова, поэтому текст отображается одной строкой
такой же текст (одной строкой), но без сортировки получится если просто записать формулу =A5, и не указать разрешение переносов.
Цитата: MCH от 21.03.2012, 12:06
... UDF которую я приводил в примере сама раставляет vbLf /Chr(10) после <br>
если открыть файл SortArray212.xls , то там есть переносы, толко в формате ячейки не разрешено переносить слова, поэтому текст отображается одной строкой
такой же текст (одной строкой), но без сортировки получится если просто записать формулу =A5, и не указать разрешение переносов.
ну тогда, все же более универсальным будет:
ЦитироватьОдин вариант в том, что бы проверять установленные в системе настройки, важные для работы макроса и, ежли оные отличаются - программно их менять, на время работы макроса, а по окончании работы все возвернуть как було!
Или я чего то путаю?
MCH Вы представили вариант, когда сортировка происходит в ячейках в конце значений которых стоит <br>
Я думаю всем будет интересно: Реализуйте пжл Макрос, чтобы в сортировка в ячейке происходила по значениям в конце которых стояла ","
или вообще было пусто, примеры:
333,
222,
444,
111
или
333
222
444
111
так?
Да, отлично. Я думаю это много кому пригодится, спасибо ))
Цитата: MCH от 21.03.2012, 16:17
так?
Спасибо большое!! 2 дня рыл инет в поисках решения=)
Работает, как надо, сортирует внутри ячейки по алфавиту, слова или фразы разделяются символом, который можно задать в формуле.
Тем, кто как и я, придет через поисковик: готовый файл с уже зашитым скриптом можно скачать с форума только после регистрации. "Ручками" так, как описано на первой странице у меня не получилось
Форумчане, возникла необходимость отсортировать данные в каждой ячейке массива (в ячейках числа, надо отсортировать в них цифры). Воспользоваться функцией, которую выложил в этой теме МСН, не получилось, тк не понятно, что подставлять в NomColSort и Glubina.
Может быть у кого-то есть подобная функция?
Создайте тему, покажите там пример...
Цитата: MCH от 21.03.2012, 16:17
так?
Не могу скачать настройки...