Поле для заполнения с выпадающим списком

Автор AND1979, 8 ноября 2021, 12:10

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

AND1979

Помогите. Как написать макрос вставляющий поле для заполнения  с выпадающим списком - аналог ComboBox в vbа и заполнить его построчно!

economist

Если связать ComboBox с полем таблицы, то он сам заполнится значениями. Если нужны уники, то в свойствах ComboBox можно указать SQL-запрос вида:

SELECT DISTINCT Поле FROM Таблица
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

AND1979

Нет, мне не нужна таблица, мне надо чтобы макрос вызывал 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 что бы был список вариантов и возможность их корректировать

Не получается

sokol92

А где Вы предполагаете хранить список значений (ведь Вы этот список будете дополнять)?
Вы хотите Combobox вызывать из диалога или разместить его на документе?
Владимир.

AND1979

1) хранить прямо в тексте макроса - если понадобится дополнить заберусь туда.
2) вызвать из диалога.

AND1979

можно хранить и в файле txt но мне кажется это сложнее

sokol92

В Книге А.Питоньяка OOME_4_0.odt глава 18 посвящена диалогам. В этой книге есть также библиотека макросов (OOME_40, модуль Dialogs) и пример диалога с различными элементами управления, включая Combobox (OOMESample).
Владимир.

AND1979

 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
Ругается что объектная переменная не установлена

sokol92

Не спешите, книга Питоньяка предназначена для длительного непрерывного изучения.
Что такое у Вас oDialog?

Возьмите работающий макрос Питоньяка OOME_40.Dialogs.RunOOMEDlg и тренируйтесь на кошках нем.  :)
Владимир.

economist

AND1979 - во Writer/ODT можно использовать готовое расширение с регулярками и загрузкой/сохранением замен https://extensions.libreoffice.org/en/extensions/show/alternative-dialog-find-replace-for-writer
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

AND1979


Наверно никто не знает как решить вопрос.
Жаль.

sokol92

А что не получается? Добавьте в RunOOMEDlg (перед вызовом метода Execute):
  oOOMEDlg.Model.getByName("ColorBox").StringItemList=Array( "Item1", "Item2", "Item3", "Item4", "Item5" )
и выбирайте цвет из Item1, ...
Владимир.

economist

#12
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    

И теперь рассылка будет идти только по тем строкам, что вам нужно.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

eeigor

@ecomonist, вот я читаю, и мне всё понятно. Но не уверен, что @AND1979 не "загрустил" от обилия информации  :)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

Цитата: AND1979 от  8 ноября 2021, 19:37Ругается что объектная переменная не установлена

oDialog - это должен быть нарисованный вами диалог, на котором должен быть контрол вида ComboBox. Без, имхо, преувеличения, программирования событий в диалогах - самое трудное, что можно придумать себе в автоматизации. Нужно любыми путями уходить от этого геморроя. Как?

Самый лучший способ - переложить геморрой на другого. То есть рисовать аналоги диалогов в... ячейках Calc! Там есть всё что нужно - Проверка данных со Списками и готовыми ахтунг-месседжбоксами, Условное форматирование, небольшие логические проверки заполненности можно реализовать Формулами. Это красота, которую умеют почти все в офисе, и когда разрешаешь им самими делать для себя приложение с личным интрефейсом - возникает синергия.   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...