Нумерация строк.

Автор marina, 23 февраля 2017, 12:35

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

bsi

ЦитироватьПробуйте такой минималистичный вариант, думаю не сильно плохой
Спасибо rami, вроде все работает. Для меня данный вариант очень подходит, не знаю как для marina, наверное тоже подойдёт, её условия же выполнены. Ещё раз всем огромное спасибо.

economist

#31
Партизаны не сдаются  :roll:

Быстрая нарастающая (1,2,3...) автонумерация непустых строк одной единственной формулой (пустые не нумеруем). Формулу протягиваем хоть на миллион строк.

=ЕСЛИ(B8<>"";МАКС($A$7:A7)+1;"")

См. вложение.

Коллеги, я-ж не против макросов, а только ЗА. Но макросы - это для того, что бы делать что-то, что табличные процессоры не умеют, или делать тысячекратно. "Неубиваемыми" макросы-листнеры не назовешь. Ячейки с ошибкой, режимы дизайна, смена безопасности макросов, параллельный процесс, сложности с режимом общего доступа итд - все это может огорчить. На тысячах элементов - у StarBasic будет торможение, по сравнению с формулой. Поэтому, имхо, простые формулы и функции нужно регулярно напоминать, в контексте любых практических задач.

И да... время. Единственный бесценный фактор. Свои формулы я написал даже не открывая Calc, за 1-2 минуты. Лишь для крайней иллюстрации с ODS-вложением - пришлось его открыть. Чтобы написать вышеприведенный макрос - суммарно потрачен 1 человеко-час. Макрос отличный, пару моментов пригодится и мне в более сложных моментах. Но все равно это дольше.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

rami

Цитата: economist от 25 февраля 2017, 08:50Партизаны не сдаются :roll:
Это не партизан, а мечтатель. Вот настоящий партизан:

А эта формула подойдёт под условия.

rami

#33
Цитата: JohnSUN от 25 февраля 2017, 11:13
Не подойдет... В условии первый номер в шестой строке
Ну, это мелочи, сдвинуть индексы в формуле, но основную работу делает. Если в принципе приемлема формула. Хотя желательно было это учесть.

economist

JohnSUN - я ждал этого замечания. Удалить любую пустую строку пользователь может и сам. Равно как и добавить. И все будет работать. А также продолжить нумерацию на другом листе, внеся правку за секунды. В этом сила формул/функций, они проще.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

JohnSUN

Цитата: rami от 25 февраля 2017, 11:20
Если в принципе приемлема формула.
Если не единственным, то основным недостатком формульного решения будет невозможность автоматического определения области печати - пачка пустых листов после реальной таблицы, вызванная "не пустыми" ячейками. Да, область печати можно переопределить вручную. Но в случае программной перенумерации даже этого не потребуется.
Ну, и неоправданный рост размера файла за счет формул
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

Кстати, если решать именно макросом - то листнер не лучшее решение. Вот несколько соображений:

1) Задача нумеровать заполняемое в процессе ввода - надуманна. Ориентироваться в строках можно по номерам строк самого Calc. Видеть общее кол-во введенного - правильнее формулой =СЧЁТЗ(), размещенной выше шапки таблицы, в закрепленной области (всегда на виду).  А вот перед распечаткой/пересылкой документа  - она уже актуальна. Значит нумеровать нужно макросом по другим событиям.

2) На 10000 ячейках простановка номеров будет быстрее в 10 раз через массив (Array, Range).

3) На практике должно еще что-то автоматизироваться, поэтому подзадача нумерации не может быть решена оптимально (как отдельный процесс). "За кадром" условий задач остались действия пользователя по вставке/удалению строк, подзаголовков итд, которые также делают частное решение "недолго живущим".

PS можно долго оптимизировать решения по сабжу, устроить "Олимпиаду по BASIC", но мне кажется коллективному Форуму-разуму интересней более сложные задачи. Я за любой НИОКР-кипиш :-) Всем хорошего дня!
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bsi

#37
Чтобы примирить ратующих за формулы и ратующих за макрос, есть вариант в Excel вставлять нумерацию формулами, но через макрос. Не знаю как это решаемо в OL, а в Excel код такой Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Автонумерация
Range("A6:A" & Range("B" & Rows.Count).End(xlUp).Row).FormulaR1C1 = "=IF(RC2="""","""",MAX(R1C1:R[-1]C)+1)"
End Sub

Решает все условия, заданные marina. Файл Excel во вложении.

rami

Цитата: bsi от 25 февраля 2017, 10:42Чтобы примирить ратующих за формулы и ратующих за макрос
Кто такие? Почему не знаю? Как я уже сказал, мне всё равно, как поставили задачу, так я её и решаю. Ничего не имею против любых подходящих методов решения.
Цитата: bsi от 25 февраля 2017, 10:42есть вариант в Excel вставлять нумерацию формулами, но через макрос. Не знаю как это решаемо в OL, а в Excel код такой
Решаемо примерно так же. Но мне в принципе не нравится запись формул в ячейки макросами если это не продиктовано особыми обстоятельствами.

economist

bsi - кстати, есть в Excel очень приятный вариант в макросах указывать формулы в "русском" виде, через FormulaLocal:


Range("A6:A" & Range("B" & Rows.Count).End(xlUp).Row).FormulaLocal = "=ЕСЛИ(B8<>"""";МАКС($A$7:A7)+1;"""")"
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...