Помогите. Как написать макрос вставляющий поле для заполнения с выпадающим списком - аналог ComboBox в vbа и заполнить его построчно!
Если связать ComboBox с полем таблицы, то он сам заполнится значениями. Если нужны уники, то в свойствах ComboBox можно указать SQL-запрос вида:
SELECT DISTINCT Поле FROM Таблица
Нет, мне не нужна таблица, мне надо чтобы макрос вызывал ComboBox, и я мог выбрать из списка значений нужное + дополнить, а далее, поиск по документу .odt с заменой маркерных слов на текст из выбранного поля ComboBox. При этом список ComboBox должен быть заполнен заранее известными фразами (пусть будет к примеру 1, 2, 3).
При помощи InputBox все работает
Dim sText As String
sText =InputBox ("Личный номер", "Поле1")
'найти и заменить
Dim oDescriptor
Dim oFound
Dim oFoundAll
Dim n%
oDescriptor = ThisComponent.createSearchDescriptor()
oDescriptor.SearchString = "Q1"
oFoundAll = ThisComponent.findAll(oDescriptor)
For n% = 0 to oFoundAll.getCount()-1
oFound = oFoundAll.getByIndex(n%)
oFound.setString(sText)
Next
Но надо с СomboBox что бы был список вариантов и возможность их корректировать
Не получается
А где Вы предполагаете хранить список значений (ведь Вы этот список будете дополнять)?
Вы хотите Combobox вызывать из диалога или разместить его на документе?
1) хранить прямо в тексте макроса - если понадобится дополнить заберусь туда.
2) вызвать из диалога.
можно хранить и в файле txt но мне кажется это сложнее
В Книге А.Питоньяка OOME_4_0.odt (https://www.pitonyak.org/OOME_4_0.odt) глава 18 посвящена диалогам. В этой книге есть также библиотека макросов (OOME_40, модуль Dialogs) и пример диалога с различными элементами управления, включая Combobox (OOMESample).
Function GetSelectedItem( oComboBoxModel As Object ) As String
GetSelectedItem = oComboBoxModel.Text
End Function
Sub Main
Dim nCount As Integer
Dim sItems As Variant
oComboBox = oDialog.getControl("ComboBox1")
nCount = oComboBox.getItemCount()
oComboBox.removeItems( 0, nCount )
sItems = Array( "Item1", "Item2", "Item3", "Item4", "Item5" )
oComboBox.addItems( sItems, 0 )
End Sub
Ругается что объектная переменная не установлена
Не спешите, книга Питоньяка предназначена для длительного непрерывного изучения.
Что такое у Вас oDialog?
Возьмите работающий макрос Питоньяка OOME_40.Dialogs.RunOOMEDlg и тренируйтесь на кошках нем. :)
AND1979 - во Writer/ODT можно использовать готовое расширение с регулярками и загрузкой/сохранением замен https://extensions.libreoffice.org/en/extensions/show/alternative-dialog-find-replace-for-writer
Наверно никто не знает как решить вопрос.
Жаль.
А что не получается? Добавьте в RunOOMEDlg (перед вызовом метода Execute):
oOOMEDlg.Model.getByName("ColorBox").StringItemList=Array( "Item1", "Item2", "Item3", "Item4", "Item5" )
и выбирайте цвет из Item1, ...
AND1979 - задача все равно не очень понятна, но вот как она решается в экосистеме OpenOffice|LibreOffice уже 16 лет:
1) Создаете таблицу в Calc с полями Личный номер, ФИО, итд. Заполняете ее (можно одновременно всем отделом, есть общий доступ по сети)
2) Создаете базу данных *.odb - файл, подключение к имеющейся, тип Таблица. ODB - это прослойка между Calc и Writer для передачи значений полей БД (ячеек Calc) - в поля документа Writer (*.odt)
3) Во Writer/Calc в своем "выходном" документе - формуляре, приказе, докладной итп - жмете Ctrl+Shift+F4 и мышью перетаскиваете поля за "заголовок" - Личный номер - в то место где он должен стоять <Личный номер>
Теперь, чтобы отразить в документе данные Иванов И.И. 5469841213 - достаточно выделиить его в верхней таблице и нажать кнопку Данные в поля.
Но это еще не всё. Если вам нужно сформировать 100, 1000, 10000 документов по всему списку - вы жмете кнопку Рассылка, Циркулярное письмо - и у вас получается один большой или N отдельных файлов, с уже заполненными данными.
А как быть, если вам нужны не все ФИО из Calc, а только те что еще работают в отделе Бухгатерия? Вот тут-то и становится понятно, почему нужна база данных, ведь в ней есть "язык для экономистов" - SQL. Открываем odb-файл и пишем в нем запрос:
SELECT * FROM Таблица WHERE Отдел="Бухгалтерия" AND ДатаУвольнения IS NULL
И теперь рассылка будет идти только по тем строкам, что вам нужно.
@ecomonist, вот я читаю, и мне всё понятно. Но не уверен, что @AND1979 не "загрустил" от обилия информации :)
Цитата: AND1979 от 8 ноября 2021, 19:37Ругается что объектная переменная не установлена
oDialog - это должен быть нарисованный вами диалог, на котором должен быть контрол вида ComboBox. Без, имхо, преувеличения, программирования событий в диалогах - самое трудное, что можно придумать себе в автоматизации. Нужно любыми путями уходить от этого геморроя. Как?
Самый лучший способ - переложить геморрой на другого. То есть рисовать аналоги диалогов в... ячейках Calc! Там есть всё что нужно - Проверка данных со Списками и готовыми ахтунг-месседжбоксами, Условное форматирование, небольшие логические проверки заполненности можно реализовать Формулами. Это красота, которую умеют почти все в офисе, и когда разрешаешь им самими делать для себя приложение с личным интрефейсом - возникает синергия.