Посчитать количество зависимых ячеек

Автор meat_12237, 25 ноября 2018, 20:31

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

meat_12237

Здравствуйте.

Как посчитать количество ячеек, зависящих от определенной ячейки ? Количество зависимых ячеек нужно сохранить в другой ячейке.


JohnSUN

#1
Непосредственно зависящих или рекурсивно перебрать все цепочки зависимостей уходящие вдаль?
В первом случае -  oCell.queryDependents(False), во втором - то же самое, но True
Из результата получаешь ячейки с помощью .getCells()
Для них создаеть .createEnumeration() и обнуляешь счётчик.
Потом пока .hasMoreElements() получаешь .nextElement() и увеличиваешь счетчик на единичку.
Нужно только иметь в виду, что "саму себя" тоже посчитает - то есть если зависиміх нет, то результат все равно как минимум 1. (это желательно перепроверить - возможно, ошибаюсь)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: JohnSUN от 25 ноября 2018, 18:37Нужно только иметь в виду, что "саму себя" тоже посчитает - то есть если зависиміх нет, то результат все равно как минимум 1. (это желательно перепроверить - возможно, ошибаюсь)
Если исходная ячейка пустая, то её не считает, а если не пустая, то посчитает.

meat_12237

Я надеялся, что мне предложат какой-нибудь популярный макрос ...

А мне предложили самому его написать :) Ладно, придется изучать это дело.

P.S. Зато понял смысл подписи economist.

rami

#4
Цитата: meat_12237 от 26 ноября 2018, 08:58P.S. Зато понял смысл подписи economist.
Водка и коньяк — это для опытных программистов, для начинающих — жидкость для протирания очков или мониторов ;D

Цитата: meat_12237 от 26 ноября 2018, 08:58Я надеялся, что мне предложат какой-нибудь популярный макрос ...
Популярных макросов на эту тему нет совсем, вы первый, кому это понадобилось, кстати, зачем вам это нужно ???

Вот, совершенно не популярный макрос:
Sub DependentsCells
Dim oSheet, oCell, oDep, oEnum, i%, e
oSheet = ThisComponent.Sheets(0)         'первый лист
oCell = oSheet.getCellRangeByName("A1")  'для ячейки A1
oDep = oCell.queryDependents(True)       'False — для непосредственно зависимых, True — для всех зависимых от данной ячейки
oEnum = oDep.Cells.createEnumeration()
While oEnum.hasMoreElements()
If oEnum.nextElement().AbsoluteName<>oCell.AbsoluteName Then i=i+1
Wend
Print i     'показывает число зависимых ячеек
End Sub


P.S. подшлифовал немного макрос.

meat_12237

Спасибо за макрос !

Шутку понял. Смешно  ;D

Я составляю в Calc базу данных для актов скрытых работ. Для каждого акта указываются применяемые материалы при помощи ссылок на значения из перечня (иногда с применением функции CONCATENATE). Перечень материалов собирается на другом листе.

Для каждого акта для каждого материалы необходимо распечатать сертификаты на материалы. Для это необходимо посчитать, сколько экземпляров каждого сертификата требуется.

Просьба к rami. Может быть, превратите макрос в функцию ? Чтобы можно было в качестве аргумента указать ячейку и получить результат.

Или бежать за жидкостью ? ;D

OOKapitan

Цитата: meat_12237 от  2 декабря 2018, 23:21
Для это необходимо посчитать, сколько экземпляров каждого сертификата требуется.
А как макрос/функция от Rami определит, сколько экземпляров сертификатов нужно распечатать? Не понятен критерий расчёта необходимого количества экземпляров.

JohnSUN

Ну, скорее всего, потребуется подсчитать количество уникальных ссылок, игнорировать повторы. Тогда число покажет именно количество сертификатов, которые нужно к акту приложить.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: meat_12237 от  2 декабря 2018, 21:21Может быть, превратите макрос в функцию ? Чтобы можно было в качестве аргумента указать ячейку и получить результат.
Наверно, как-то так:
Function DEP(adr,e)                      'В ячейке пишется формула: =DEP(("A1");INT(RAND()))  <— вместо A1 любой адрес (в кавычках)
Dim oSheet, oCell, oDep, oEnum, i%, e
oSheet = ThisComponent.Sheets(0)         'первый лист
oCell = oSheet.getCellRangeByName(adr)   'ячейка
oDep = oCell.queryDependents(True)       'False — для непосредственно зависимых, True — для всех зависимых от данной ячейки
oEnum = oDep.Cells.createEnumeration()
While oEnum.hasMoreElements()
If oEnum.nextElement().AbsoluteName<>oCell.AbsoluteName Then i=i+1
Wend
dep=i     'показывает число зависимых ячеек
End Function


OOKapitan

Цитата: JohnSUN от  3 декабря 2018, 12:09
Тогда число покажет именно количество сертификатов, которые нужно к акту приложить.
Это-то да. Но автор пишет, что
Цитата: meat_12237 от  2 декабря 2018, 23:21
Для это необходимо посчитать, сколько экземпляров каждого сертификата требуется.
А вот как, используя указанный код/функцию, это посчитать?

meat_12237

Спасибо за модернизацию до функции !

Для удобства я использую этот макрос и следующую формулу:

=DEP(CELL("ADDRESS";A1);INT(RAND()))-1

* генератор случайных чисел для того, чтобы функция DEP всегда пересчитывала
* минус 1 для того, чтобы учесть то, что функция CELL тоже зависит от A1

По поводу использования:

В строку для каждого акта я ввожу ссылки на материалы.

Акт 1 - материал 1,3,8
Акт 2 - материал 1,2
Акт 3 - материал 8

На другом листе приведен перечень материалов.

1 - арматура
2 - утеплитель
3 - бетон
8 - кирпич

Приведенный макрос дает следующее:

1 - арматура - 2 экз.
2 - утеплитель - 1 экз.
3 - бетон - 1 экз.
8 - кирпич - 2 экз.

OOKapitan

Что по моему вопросу?
Цитата: meat_12237 от  6 декабря 2018, 23:04

Для удобства я использую этот макрос и следующую формулу:

=DEP(CELL("ADDRESS";A1);INT(RAND()))-1

Приложите файл, пожалуйста, а то без него как-то не очень понятно.

meat_12237

Макрос работает только для текущего листа. Т.е. считается количество зависимостей на данном листе. Ссылки с других листов в счет не идут.

Потому приходится переделывать файл. Становится некрасивым.

Может, можно заставить обрабатывать зависимости со всех листов ?

JohnSUN

Once more:
Цитата: OOKapitan от  7 декабря 2018, 11:13
Приложите файл, пожалуйста, а то без него как-то не очень понятно.

Цитата: rami от 26 ноября 2018, 14:12
...
oSheet = ThisComponent.Sheets(0)         'первый лист
...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

meat_12237