Как создать кнопку с формулой?

Автор ofeo, 19 октября 2013, 16:21

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

ofeo

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

JohnSUN

Конечно, это возможно...
Но создание такой кнопки - чаще всего, лишний труд. Для очистки выделенных ячеек достаточно нажать Backspace.
Если так уж хочется видеть кнопку на панели инструментов и нажимать её мышкой, можно выбрать Сервис-Настройка, перейти на вкладку Панели инструментов, выбрать из списка панель с названием Форматирование. Можно, конечно, выбрать и любую другую или даже создать новую, но именно на панели Форматирование создатели офиса поместили кнопки для вставки/удаления строк и столбцов. Как раз возле этих кнопок удобнее всего пристроить новую - по смыслу близко.
А дальше просто: нажимаешь Добавить, выбираешь категорию Правка, в командах находишь Удалить содержимое, нажимаешь Добавить и Закрыть. Если вставил не в то место панели, кнопками со стрелочками передвигаешь новую кнопку в нужное место списка и нажимаешь ОК.
Теперь достаточно выделить мышкой нужные ячейки и нажать кнопку на панели инструментов - специальное окошко переспросит какие данные нужно удалить.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ofeo

А если мне нужно кнопку не на панели инструментов, а именно в таблице, чтобы она была на определенном листе и на этом же листе очищала определенные ячейки... так возможно?

JohnSUN

Возможно и такое.
Нужно написать макрос, который очищает нужные ячейки. Это не сложно, выглядит приблизительно так:
Sub clrCells
Dim oActiveSheet As Variant
Dim oCellRangeByName As Variant
  oActiveSheet = ThisComponent.getCurrentController().getActiveSheet() ' Не заморачиваемся с поиском нужного листа -
' на этом листе кнопку нажали, значит на этом дисте и ячейки чистим
  oCellRangeByName = oActiveSheet.getCellRangeByName("D2:E18") ' Ну, адреса ячеек здесь вписаны от фонаря, впишешь нужные
  oCellRangeByName.clearContents(7) ' 7 = 1 (числа) + 2 (даты) + 4 (строки). Можно удалять и форматы, и формулы, и примечания...
End Sub
Этот макрос сохраняешь или в книге, в которой будешь им пользоваться, или прямо в библиотеке своих макросов всего офиса.
Потом через Вид-Панели инструментов-Элементы управления отображаешь панельку, с которой берешь кнопку и рисуешь её в нужном месте нужного листа. Отдельный значок на панельке - Элемент управления - откроет форму настроек, где сможешь задать надпись, цвет, картинку, размер и кучу всего разного для этой кнопки. В том числе и обработку события Выполнить действие: выбираешь для этого события только что сохраненный макрос, сохраняешь книгу, отключаешь режим разработки (кнопка с рукой на панели), закрываешь панель и пользуешься
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ofeo

Оооооо.... то что надо!!! Большое Вам спасибо!

ofeo

А еще вопрос...
А если это несколько областей ячеек.. к примеру С1:D4 и G1:H4  - как прописать такое условие адресов ячеек?

JohnSUN

#6
Лучше всего - перечислить по очереди... Есть и другие способы, но этот самый простой.
Весь код этого макроса может быть записан "в одну строчку через точку":
Sub clrCells
 ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("D2:E18").clearContents(7)
End Sub
(Подробно расписывал, чтобы читать было понятнее - а работать будет и так.)
А значит для уточнённой задачи нужно просто повторить эту строчку нужное количество раз и вписать нужные диапазоны ячеек:
Sub clrCells
 ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("C1:D4").clearContents(7)
 ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("G1:H4").clearContents(7)
' ... и так столько раз сколько понадобится  
End Sub
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

ofeo

Всё получилось. Большое спасибо!

Duelsel

Цитата: JohnSUN от 21 октября 2013, 10:21
Лучше всего - перечислить по очереди... Есть и другие способы, но этот самый простой.
Весь код этого макроса может быть записан "в одну строчку через точку":
Sub clrCells
  ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("D2:E18").clearContents(7)
End Sub
(Подробно расписывал, чтобы читать было понятнее - а работать будет и так.)
А значит для уточнённой задачи нужно просто повторить эту строчку нужное количество раз и вписать нужные диапазоны ячеек:
Sub clrCells
  ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("C1:D4").clearContents(7)
  ThisComponent.getCurrentController().getActiveSheet().getCellRangeByName("G1:H4").clearContents(7)
' ... и так столько раз сколько понадобится 
End Sub

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

bigor

Цитата: Duelsel от 21 января 2020, 09:44при повторном нажатии кнопки был возврат к исходным значениям ячеек? Как бы вернуть назад...
я вижу такой способ:
Загоняем все в массив через getDataArray
Создаем некий флаг. который инвертируется при нажатии кнопки
Если флаг false чистим диапазон
Если флаг true восстанавливаем диапазон из массива через setDataArray
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

#10
Можно старые значения макросом "хранить" в комментариях к ячейке. Удобно смотреть что там было.

Можно включить общий доступ к файлу и отслеживать изменения - история значений будет сохраняться (без макросов).

Можно использовать Сервис - Сценарии, роль которого как раз замена групп значений на другую и обратно (без макросов и даже с кнопкой). Для полной очистки - нужно создать первый сценарий с еще пустыми ячейками. Число сценариев - не ограничено ничем.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...