Новости:

Подпишитесь на рассылку новых сообщений форума через службу рассылок: Subscribe.ru

Главное меню

Сортировка данных внутри ячейки, как?

Автор spono, 20.03.2012, 12:30

« назад - далее »

spono

Здравствуйте,
Нужно отсортировать данные внутри каждой ячейки не сортируя ячейки между собой.
Каждая строчка данных в ячейке разделена <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

Классический метод сортировки сортирует строчки и столбцы.
Подскажите пжл макрос и как его интегрировать в Эксель.

GWolf

#1
Добрый день!
Я тоже, беря пример с Вас, позволю без примера...

Итак, Интегрировать в 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
И так, если будут вопросы при реализации - пишите, постараюсь ответить.
Путей к вершине - множество. Этот один из многих!

spono

Спасибо за помощь, в меру своих возможностей и полноты Вашего мануала сделал слеюдующее:

1. открыл таблицу excel
2. нажал alt+f11
3. вставил
Sub SortNeTarKakNado()
+внутри приведенны Вами код   
End Sub
4. сохранил в среде VBA нажав на дискетку
5. перешел в View Microsoft Excel
6. Выделил столбец с нужными ячейками
7. Сервис > Макрос > Макросы (находится Эта книга) > команда Выполнить

Тогда, получаю ошибку:
"Compile error:
Expected end Sub"

Скрины ошибки и файл .xls прикреплен к письму, спасибо.

Serge 007

Цитата: spono от 20.03.2012, 14:00

3. вставил
Sub SortNeTarKakNado()
+внутри приведенны Вами код    
End Sub

Вот этого не надо было делать.
Попытался нарисовать последовательность действий в редакторе VBA
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

spono

Указанные Вами шаги на картинке я выполнил.

1. На картинке не указанно куда вставлять:
Sub SortNeTarKakNado()
End Sub

2. Как в таком случае, запустить макрос в Эксель?
Сервис > Макрос > Макросы (ПУСТО)

MCH

чтото типа такого

Serge 007

Цитата: spono от 20.03.2012, 14:25
Указанные Вами шаги на картинке я выполнил.
Теперь возвращайтесь в Excel (Alt+F11) и используйте функцию на листе.
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

GWolf

Цитата: Serge 007 от 20.03.2012, 14:12
Попытался нарисовать последовательность действий в редакторе VBA
Здравствуйте, Sergio007!
Все хочу написать мануал, со скриншотами, для начинающих пользователей, типа как настроить VBA - редакктор, да все времени не хватает. Может продолжите Вашеп начинание и наверно его следует закрепить в начале раздела! То-то новички на ниве прогерства будут благодарны!
Удачи!
Путей к вершине - множество. Этот один из многих!

spono

#8
Это обязательно нужно ))

spono

#9
Цитировать
чтото типа такого
MCH да, сортировка в данном случае производится!!!
Однако существует косяк - форматирование отсортированных данных в одну строчку внутри ячейки!
Пример, имеем:
222
444
111
333

После использования "Вставка функции" > "Полный алфавитный перечень" > "SortBr" > "Указываем ячейку с исходными данными"
На выходе получаем:
111222333444

Исходные данные вместо 4 строк принимаю вид одной строки.

Интересно, что с моими данными(из первого поста) происходит тоже самое, однако при клике мышью внутри отсортированной ячейки и далее кликом на другой ячейке.
В ячейках с отсортированными данными снова появляются строчки.

spono

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% случаях получаю: #Знач!
Что не так?

MCH

Цитата: spono от 20.03.2012, 19:33
сортировка в данном случае производится!!!
Однако существует косяк...
ну так приложите пример в виде xls файла с информацией "что есть" и "что хочу"
А то гадать по картинкам не получается.
ɔнǝɔɐdʇɔʞє ǝн ʁ

spono

#12
excel файл с примерами прикреплен к сообщению

MCH

в Формате ячейки в разделе "выравнивание" поставте галку "переносить по словам"

GWolf

Добрый день, коллеги!

Ставить галки, дело хорошее. Но, макрос для того и пишется, что бы работал независимо от выставленных галок.
И тут вариантов решения несколько.
Один вариант в том, что бы проверять установленные в системе настройки, важные для работы макроса и, ежли оные отличаются - программно их менять, на время работы макроса, а по окончании работы все возвернуть как було!
Второй вариант, применительно к этой задаче: при формировании строки массива, между элементами массива, вставлять принудительный перевод строки (chr(10)). Приведенная последовательность "111222333444", будет в массиве выглядеть так:
"111" & chr(10) & "222" & chr(10) & "333" & chr(10) & "444".
Путей к вершине - множество. Этот один из многих!