макрос Сортировка по алфавиту (Calc)

Автор timal1234, Вчера в 09:19

0 Пользователи и 2 гостей просматривают эту тему.

timal1234

Всем привет!

Нужно в макросе отсортировать список (текстовый) массива по алфавиту ПО ЧЕЛОВЕЧЕСКОЙ логике, а не по компьютерной логике.
Вернее создать правило сравнения двух строк... переставить местами элементы массива я могу :-)
Например, сортировка автофильтром в Calc даёт (и макросом получается тоже самое):
MDR-10-12
MDR-10-5
MDR-100-5
MDR-5-12
MDR-60-48
MDR-60-5
---------------
а нужно так:
-------------
MDR-5-12
MDR-10-5
MDR-10-12
MDR-60-5
MDR-60-48
MDR-100-5
---------
уже всю голову сломал....
затык начинается, когда он (Basic) символ "дефис" считает за "минус"....
никак не могу отделить цифры от букв правильно для сравнения.
что только не пробовал (и через Asc, Val, Abs, IsNumeric).
как я понимаю надо, если идут цифры, найти последнюю идущую подряд, склеить в единое число и сравнить...
но у меня выходит какая-то лажа.

mikekaganski

"Склеить в единое число" сделает из Ваших MDR-10-12 и MDR-60-5 числа 1012 и 605, и второе будет раньше первого.

Нужно разбить текст по дефисам; а затем сравнивать получившиеся массивы по порядку (сначала первые элементы массивов: MDR с MDR, затем, если равны - вторые: 10 с 60; затем, если равны - третьи...). На каждом этапе, если получается неравенство, значит, результат сравнения найден.

Вопрос - все ли они вида "MDR-N-M", где "MDR" - это фиксированная строка, всегда одна и та же, а M и N  - это числа. Может ли быть вместо MDR что-то типа ABC? Может ли быть вместо M что-то типа 12Z? Потому что от этого зависит, как сравнивать "числа", а как - "строки".
С уважением,
Михаил Каганский

timal1234

Цитата: mikekaganski от Вчера в 10:36"Склеить в единое число" сделает из Ваших MDR-10-12 и MDR-60-5 числа 1012 и 605, и второе будет раньше первого.

это я уже понял :-)

Цитата: mikekaganski от Вчера в 10:36Вопрос - все ли они вида "MDR-N-M", где "MDR" - это фиксированная строка, всегда одна и та же, а M и N  - это числа. Может ли быть вместо MDR что-то типа ABC? Может ли быть вместо M что-то типа 12Z? Потому что от этого зависит, как сравнивать "числа", а как - "строки".

нет, все строки разные... это спецификация, и надо её отсортировать.... но стандартная сортировка не подходит...

Цитата: mikekaganski от Вчера в 10:36Потому что от этого зависит, как сравнивать "числа", а как - "строки".
а можно подробнее ?

timal1234

Цитата: mikekaganski от Вчера в 10:36Нужно разбить текст по дефисам;
к сожалению, это могут быть любые символы (наименование оборудования, модель, параметры и т.д.)

sokol92

Кстати, Calc умеет сортировать диапазоны ячеек по правилам "натуральной сортировки" (о которой идет речь в данной теме).
Владимир.

mikekaganski

Цитата: timal1234 от Вчера в 10:50
Цитата: mikekaganski от Вчера в 10:36Потому что от этого зависит, как сравнивать "числа", а как - "строки".
а можно подробнее ?

Если заранее неизвестно, какой элемент число, а какой строка, то требуется проанализировать, то есть определить, являются ли все символы десятичными числами. И что делать с подстроками типа "12Z" и "Z12"? Какое раньше?

Цитата: timal1234 от Вчера в 10:52
Цитата: mikekaganski от Вчера в 10:36Нужно разбить текст по дефисам;
к сожалению, это могут быть любые символы (наименование оборудования, модель, параметры и т.д.)

Ощущение, что изначальное "ПО ЧЕЛОВЕЧЕСКОЙ логике" предполагает ЧЕЛОВЕЧЕСКИЙ разум.

Цитата: sokol92 от Вчера в 11:59Кстати, Calc умеет сортировать диапазоны ячеек по правилам "натуральной сортировки" (о которой идет речь в данной теме).

Как мне кажется, это не поможет - но без реалистичного примера (а не "я представлю примитивный пример с одинаковыми префиксами, разделителями и структурой, а потом окажется, что всё совсем не так, и дефисы не дефисы, и структура меняется, и префиксы, и длины") нельзя ничего сказать точно.
С уважением,
Михаил Каганский

timal1234

Цитата: sokol92 от Вчера в 11:59Кстати, Calc умеет сортировать диапазоны ячеек по правилам "натуральной сортировки" (о которой идет речь в данной теме).
1) мне нужно через макрос.
2) Calc не сделает как нужно, т.к. спецификация содержит разделы (одни разделы сортируются по децимальному номеру, другие по алфавиту наименования)  и наименования записываются в несколько строк.
собственно поэтому и применяю макрос.

timal1234

Цитата: mikekaganski от Вчера в 12:09Как мне кажется, это не поможет - но без реалистичного примера (а не "я представлю примитивный пример с одинаковыми префиксами, разделителями и структурой, а потом окажется, что всё совсем не так, и дефисы не дефисы, и структура меняется, и префиксы, и длины") нельзя ничего сказать точно.
попробую вырезать часть и выложить пример

timal1234

Цитата: mikekaganski от Вчера в 12:09Ощущение, что изначальное "ПО ЧЕЛОВЕЧЕСКОЙ логике" предполагает ЧЕЛОВЕЧЕСКИЙ разум.
хорошо, скажу иначе: нужна сортировка элементов спецификации по ГОСТу.
сейчас у меня есть несколько сортировок в зависимости от раздела спецификации....
вот одна из них не работает как должно быть по ГОСТ Р 2.106-2019...
могу конечно выложить цитаты из ГОСТа, как должно быть, но думаю ни к чему.

timal1234

#9
вот пример

UPD:
в "Пример.ods" повторяются позиции....
вообще их не должно быть.... я их сначала объединяю...
поэтому правильным будет "пример 2.ods"

timal1234

Цитата: sokol92 от Вчера в 11:59Кстати, Calc умеет сортировать диапазоны ячеек по правилам "натуральной сортировки" (о которой идет речь в данной теме).
вот мне бы такой макрос "натуральной сортировки"

sokol92

Пока посмотрите Ваш пример. В столбце F - результат натуральной сортировки Calc Вашего диапазона.
Натуральная сортировка производится так: Меню / Данные / Сортировка, вкладка "Параметры", "Включить естественную сортировку".

Результат устраивает?
Владимир.

timal1234

Цитата: sokol92 от Вчера в 14:35Пока посмотрите Ваш пример. В столбце F - результат натуральной сортировки Calc Вашего диапазона.
Натуральная сортировка производится так: Меню / Данные / Сортировка, вкладка "Параметры", "Включить естественную сортировку".

Результат устраивает?

не совсем... сначала должны идти английские наименования ...
а в общем - да.

sokol92

Цитата: timal1234 от Вчера в 14:42не совсем... сначала должны идти английские наименования
Попробуйте в диалоге сортировки кроме флажка "Включить естественную сортировку" указать Язык: "Английский США".
Попробуйте также сортировать другие диапазоны.

Если все правильно, то намного эффективнее будет сортировка макросом массива с помощью Calc: записываем массив в диапазон Calc на каком-нибудь скрытом листе, сортируем в Calc, забираем результат.
Владимир.

timal1234

Цитата: sokol92 от Вчера в 14:51
Цитата: timal1234 от Вчера в 14:42не совсем... сначала должны идти английские наименования
Попробуйте в диалоге сортировки кроме флажка "Включить естественную сортировку" указать Язык: "Английский США".
Попробуйте также сортировать другие диапазоны.

Если все правильно, то намного эффективнее будет сортировка макросом массива с помощью Calc: записываем массив в диапазон Calc на каком-нибудь скрытом листе, сортируем в Calc, забираем результат.
Да, так нормально.
Спасибо!
я готов попробовать, если б знал, как эту сортировку включить макросом... :-)