eeigor
|
Я использую событие листа "Content changed", и мне хватает... Кажется, я уже отвечал Вам на Ваш вопрос... Возможно я использую не тот листенер, но... другого способа не придумал. Именно так. ''''''''''''''''''''''''''''' Sheet Event Procedure '''''''''''''''''''''''''''' Sub Sheet_OnChange(oTarget As Object) '<- ScCellObj, ScCellRangeObj, ScCellRangesObj ''' Called by: OnChange (Content changed) event of this sheet.
On Local Error GoTo HandleErrors Dim oCell As Object oCell = <Ваша ячейка со списком выбора> If oCell.queryIntersection(oTarget.RangeAddress).Count > 0 Then ' Ваш код реакции на событие End If Exit Sub
HandleErrors: Msgbox "Error " & Err & " in line " & Erl & ": " & Error _ , MB_ICONSTOP, "macro:Sheet_OnChange" End Sub UPDATED: Макрос Sheet_OnChange подключается вручную щелчком ПКМ по ярлычку листа >> Sheet Events... Ваших ячеек может быть много. Определяйте через пересечение диапазонов (oCell ⋂ oTarget), что было изменено, и выполняйте соответствующий Case (Select Case). UPDATED: Ячейка не имеет метода queryIntersection, поэтому надо использовать диапазон из одной ячейки. См. исправленный пример в ответе #30.
|
|
« Последнее редактирование: 15 Январь 2022, 12:58 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
Kadet
|
Лучше поясню на примере. Есть две ячейки: "Наименование" и "Размер". Обе ячейки со списками выбора. В зависимости от данных, которые установленны в ячейке "Наименование" в ячейке "Размер" список выбора должен меняться. При одном значении "Наименования" это один список, а при другом - это уже другой список.
Для изменения списка "Размер" в зависимости от значения в ячейке "Наименование" я вешаю на ячейки "Наименование" этот листенер.
|
|
|
Записан
|
|
|
|
Kadet
|
Я использую событие листа "Content changed", и мне хватает... Попробую
|
|
« Последнее редактирование: 15 Январь 2022, 11:06 от Kadet »
|
Записан
|
|
|
|
eeigor
|
@Kadet, ответ #15 с примером содержит полный ответ на Ваш вопрос в этой теме. Как подключить, я написал. А <Ваш код реакции на событие> - это Ваша логика программы. UPDATED: зависимости от данных, которые установленны в ячейке "Наименование" в ячейке "Размер" список выбора должен меняться. Для этого не требуется программирование. Решается формулами.
|
|
« Последнее редактирование: 15 Январь 2022, 11:11 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
Kadet
|
@Kadet, ответ #15 с примером содержит полный ответ на Ваш вопрос в этой теме. Да, да... Уже разбираюсь. Макрос Sheet_OnChange подключается вручную щелчком ПКМ по ярлычку листа >> Sheet Events... Вот этот момент совсем не годится. Потому как не только листы, но и сам документ Calc у меня всегда создаётся автоматически и заново, из другой программы (Base). Теоретически, можно повесить макрос на событие и макросом, но... В общем, спасибо. Поразбираюсь и попробую. Получится/не_получится. Однако, вопрос, пока не началось. А это событие будет срабатывать всегда-всегда, когда я даже точку где угодном в этот лист вставлю?
|
|
|
Записан
|
|
|
|
economist
|
Есть две ячейки: "Наименование" и "Размер". Обе ячейки со списками выбора. В зависимости от данных, которые установлены в ячейке "Наименование" в ячейке "Размер" список выбора должен меняться. При одном значении "Наименования" это один список, а при другом - это уже другой список. Такое поведение, в смысле "связанные списки" - можно реализовать и без макроса, формулами на служебном листе. Формулы сами порождают события и грамотно их выполняют, без "дребезга". Листнеры только для этого - избыточны. Есть, конечно, места где без них 100% не обойтись - например во Writer при смене значения в полях типа Список. там штатных событий не возникает, и приходится создавать события для смены выделения, изменения текста итп. Еще один способ реализации связанных списков - обновление диапазонов базы данных в Calc (на SQL) - очень быстро работает. То есть выбрали эл-т в контроле списке А - макросом обновили диапазон B, на который ссылается контрол С для выбора эл-та.
|
|
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
eeigor
|
Цитата: eeigor от Сегодня в 10:41 Макрос Sheet_OnChange подключается вручную щелчком ПКМ по ярлычку листа >> Sheet Events... Вот этот момент совсем не годится. Можно и программно, уверен. У меня не было необходимости в этом... А это событие будет срабатывать всегда-всегда, когда я даже точку где угодном в этот лист вставлю? Да. Для этого и проверяем пересечение диапазонов. Для этого не требуется программирование. Решается формулами. Почитайте тему по MS Excel: Create Dependent Drop Down Lists
|
|
« Последнее редактирование: 15 Январь 2022, 11:38 от eeigor »
|
Записан
|
Ubuntu 18.04 LTS • LibreOffice 7.3.2.2 Community
|
|
|
Kadet
|
формулами на служебном листе обновление диапазонов базы данных в Calc (на SQL) Не слишком ли это всё усложняет? Каждый раз создавать служебный лист, формировать и переформировывать его. Мало того, уверен, что при переформировывании этого служебного листа он будет становиться активным, что зачастую бывает, и пользователь - простой обывательский юзер, будет все эти переброски и переформирование наблюдать... Оно ему нужно? К тому же, для упрощения я не описал все процедуры, которые нужно выполнить после изменения данных в ячейке, допустим, "Наименование". Помимо формирования самого списка зависимой ячейки нужно ещё: получить ID этого нового значения, взятый из БД по значению как фильтру; записать этот ID в служебную область этого листа; очистить зависимую ячейку "Размер"; скорректировать некоторые другие зависимые ячейки; сформировать и заполнить список остатков отфильтрованных по этому новому значению. А эту работу никакими формулами не осилить.
|
|
« Последнее редактирование: 15 Январь 2022, 11:43 от Kadet »
|
Записан
|
|
|
|
Kadet
|
Цитата: Kadet от Сегодня в 11:13 А это событие будет срабатывать всегда-всегда, когда я даже точку где угодном в этот лист вставлю? Да. Для этого и проверяем пересечение диапазонов. Ну, тады "Ой". Мне этот вариант никак не подходит. Выше описал, что должно происходить при изменении ячейки "Наименование". Думаю понятно, что у меня лишь одно единственное маленькое изменение в этой ячейке провоцирует целую массу изменений к контенте листа. В примере внизу обширная таблица. Вот эта таблица всякий раз при изменении полей "Наименование" и "Размер" полностью переформировывается заново, использую данные из вышеперечисленных полей как фильтры. Представьте сколько времени будет занимать удаление, а затем формирование зановой этой таблицы если после изменения в каждой ячейке будет срабатывать макрос листенера. Уму не постижимо.
|
|
|
|
mikekaganski
|
Каждый раз создавать служебный лист, формировать и переформировывать его. Мало того, уверен, что при переформировывании этого служебного листа он будет становиться активным ... А эту работу никакими формулами не осилить Я, конечно, не знаю деталей, но у меня впечатление, что велосипедостроительство можно было бы значительно упростить введением постоянных (не создаваемых каждый раз) скрытых служебных листов, ведением всех работ (в т.ч. хранением идентификаторов) там, и использованием формул, ссылающихся туда.
|
|
|
Записан
|
|
|
|
mikekaganski
|
Представьте сколько времени будет занимать удаление, а затем формирование зановой этой таблицы если после изменения в каждой ячейке будет срабатывать макрос листенера. Уму не постижимо Ох. Вы перечитайте ответ 15. Определяйте через пересечение диапазонов (oCell ⋂ oTarget), что было изменено
|
|
|
Записан
|
|
|
|
Kadet
|
Ох. Вы перечитайте ответ 15. Да понял уже весь смысл. Но, вы забываете, что даже просто обращение к листенеру, даже без каких-нибудь там проверок и т.п., при таких объёмах данных уже даёт весьма существенную задержку в работе. А базы у меня работают не на 12-ти ядерных процессорах... а на уже порядком подустаревшем оборудовании. И тут каждая миллисекунда дорога. Я подобные варианты уже проверял. Тормоза.
|
|
|
Записан
|
|
|
|
Kadet
|
Я, конечно, не знаю деталей, но у меня впечатление, что велосипедостроительство можно было бы значительно упростить введением постоянных (не создаваемых каждый раз) скрытых служебных листов, ведением всех работ (в т.ч. хранением идентификаторов) там, и использованием формул, ссылающихся туда. Не стоит забывать, что у меня при запуске каждый раз создаётся новый документ Calc с нуля. И, если следовать вашему предложению, послекаждого создания, при загрузке формы, вначале я должен несколько таблиц БД, причём весьма объёмных, загнать в некий служебный лист, а потом использовать. Не слишком ли это всё усложняет?
|
|
|
Записан
|
|
|
|
Kadet
|
Однако, главное я понял. При создании нового листа все листенеры этого типа в документе будут срабатывать. И никуда от этого не деться. Займусь созданием обходного пути. И удаление листенеров поковыряю. Есть пара идей в этом нарправлении.
Спасибо!
|
|
|
Записан
|
|
|
|
mikekaganski
|
Вы проверяли, помогает ли addActionLock/removeActionLock вокруг кода, меняющего большие массивы данных?
|
|
|
Записан
|
|
|
|
|