Консультация № 150331
12.11.2008, 15:56
0.00 руб.
0 6 2
Здравствуйте, уважаемые эксперты!

Вопрос по Excel.
В листе есть столбец с числами. Мне нужно число "разобрать по составу" : какие цифры используются и их количество (или просто отсортировать цифры в числе). Например, в числе 17300 одна единица и три ноля, результат должен быть примерно таким: 00137.

В принципе, колонку можно переформатировать вручную, задав тип значения "строка" - так мне кажется проще. Тип значения ячейки не принципиален, можно его изменять как заблагорассудится, "лишь бы работало".
Подскажите, пожалуйста, какой функцией воспользоваться, или может, если готовой нет, напишите скрипт.

Спасибо.
С уважением, Владимир.

Обсуждение

давно
Модератор
137394
1850
12.11.2008, 18:32
общий
это ответ
Здравствуйте, Владимир Лазурко!
С помощью стандартных функций как сделать Вашу задачу я не сообразил. Поэтому написал функцию (см. в приложении). Аргумент -численный.
На всякий случай объясню, как описАть функцию (для оффиса 2003 и ранее, с 2007 не знаком)
Сервис-Макрос-Редактор Visual Basic -Insert-Module -Вставьте туда текст функции. Используйте её как стандартную. В том числе можете ссылаться и на ячейку с числом. Естественно, уровень безопасности Excel должен позволять работать макросам.
Рекомендую Сервис-Макрос-Безопасность -Средняя
Если придумаю более элегантный алгоритм-напишу.
Кстати, если у Вас всё же в аргументе не число, функция рассортирует символы аргумента по возрастанию значения их кодов
Очевидно, при таком подходе в случае десятичной дроби получим в ответе и разделитель целой-дробной части. Если всё же надо отсечь всё, и оставить только цифры, надо написать еще один If вместо строки Cipher = Cipher & SS(i):
K = Asc(SS(i))
If 48 <= K And K <= 57 Then Cipher = Cipher & SS(i)
Т.е. можете закомментировать одну строку и раскомментировать две следующие



Приложение:
Function Cipher(N_In)
S = CStr(N_In)
Cipher = ""
N = Len(S)
If N > 0 Then
ReDim SS(N)
For i = 0 To N - 1
SS(i) = Mid(S, i + 1, 1)
Next
For i = 0 To N - 1
For j = i To N - 1
If SS(i) > SS(j) Then
K = SS(i)
SS(i) = SS(j)
SS(j) = K
End If
Next
Cipher = Cipher & SS(i) ' При необходимости закомментируйте
' K = Asc(SS(i)) ' При необходимости снимите комментарий
' If 48 <= K And K <= 57 Then Cipher = Cipher & SS(i) ' При необходимости снимите комментарий
Next
End If
End Function

Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
12.11.2008, 20:00
общий
Можно это сделать и при помощи стандартных функций. Если хотите могу описать.
Неизвестный
13.11.2008, 08:29
общий
Moryarty, конечно, опишите!
--------------------------------------
megaloman, я в Visual Basic втсавил текст функции, а как мне её теперь прописать в ячейке?
давно
Модератор
137394
1850
13.11.2008, 10:03
общий
как обычную функцию, например =Cipher(1239854)
или ссылкой на ячейку =Cipher(A1).
Вот еще вариант: становимся на пустую ячейку, куда надо вставить формулу, затем сбоку от пиктограммы со знаком суммы жмем на треугольник - Другие функции-Категорию выбрать Определённые пользователем - Выберете вашу функцию - в диалоге вставьте аргумент (число, строку или ссылку на ячейку) - всё как со стандартной функцией.
На все ячейки функция размножается как стандартная (Ctrl/C - Ctrl/V) c автоматическим пересчётом аргумента.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
13.11.2008, 10:23
общий
Спасибо! Теперь работает!
Я размножил перетягиванием ячейки за правый нижний край.
Неизвестный
14.11.2008, 23:59
общий
это ответ
Здравствуйте, Владимир Лазурко!
Можно это сделать и при помощи стандартных функций, макросом правда проще.
Принцип следующий:
Предположим, что числа находятся в столбце A.
Тогда в ячейке A2 будет находиться число. В ячейку B2 забиваем формулу =ДЛСТР(A2), она нам покажет количество цифр в числе.
Далее протягиваем эту формулу по всему столбцу в соотв. с количеством чисел в столбце A. В ячейку С1 пишим формулу =МАКС(B:B), определяем максимальное количество цифр в числе. Затем в ячейку D1 пишим 1 и протягиваем по строке до числа равному числу в ячейке C1 (зажав CTRL). В ячейку D2 пишим формулу =ПСТР($A2;D$1;1) и протягиваем ее сначала по строке в соотв. с количеством цифр, а затем по столбцу в соотв. с количеством чисел. Тем самым мы разложим число на цифр. Затем полученные ячейки копируем и вставляем на другой лист через спецвставку значений. Далее остается отсортировать каждую строку по возрастанию. Данные -> Сортировка... -> Параметры... -> Сортировать столбцы диапазона.
Сложно, но без VBA.
Форма ответа