Заполнить таблицу через форму Dialog

Автор Кот, 8 декабря 2022, 13:15

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

Кот

Здравствуйте!
Подскажите, где ошибка в коде для заполнения таблицы в Calc через форму Dialog?

rem Запуск диалога КНОПКОЙ
Dim oCntrl
Sub menu()
      Dim oLibContainer As Object, oLib As Object
      Dim oInputStreamProvider As Object
      Dim oDialog As Object
      Const sLibName = "Standard"
      Const sDialogName = "Dialog111"
      REM library container
      oLibContainer = DialogLibraries
      REM load the library
      oLibContainer.loadLibrary( sLibName )
      REM get library
      oLib = oLibContainer.getByName( sLibName )
      REM get input stream provider
      oInputStreamProvider = oLib.getByName( sDialogName )
      REM create dialog control
      oDialog = CreateUnoDialog( oInputStreamProvider )
      REM show the dialog
      oDialog.setTitle("A") 
      oCntrl = oDialog.getControl("TextField1")
      oDialog.execute()
     
End Sub


rem Заполнение таблицы
Sub inputtocell

Dim stext as string
Dim cell  as object

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("A2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()
   
   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("B2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("C2")  'Get the named Cell
   Cell.String = sText
   
   REM data located in field from dialog
   sText = oCntrl.getText()

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("D2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("E2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()
   
End Sub

Спасибо!

bigor

Цитата: Кот от  8 декабря 2022, 13:15Подскажите, где ошибка
в принципе работает без ошибок. Если вам не нравится, что заполняется все фамилией, то это вы виноваты, записывая во все ячейки только первое поле формы, хотя их у вас 4. Пишите каждое поле в свою ячейку и все получится

ps и вы не первый пост пишите, научитесь оформлять их. Выделяете код и жмете кнопку в виде свитка (если навести на нее мышку появится слово КОД), ваш код окажется в нужных тегах и пост будет более читабельным :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от  8 декабря 2022, 13:38
Цитата: Кот от  8 декабря 2022, 13:15Подскажите, где ошибка
в принципе работает без ошибок. Если вам не нравится, что заполняется все фамилией, то это вы виноваты, записывая во все ячейки только первое поле формы, хотя их у вас 4. Пишите каждое поле в свою ячейку и все получится


Так я написал, что на Листе1 заполнить в ячейки А2, B2, C2, D2, E2, это не правильно?

bigor

Цитата: Кот от  8 декабря 2022, 13:42это не правильно?
правильно, они и заполняются. Но теперь посмотрите чем вы их заполняете
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от  8 декабря 2022, 13:38
Цитата: Кот от  8 декабря 2022, 13:15Подскажите, где ошибка
в принципе работает без ошибок. Если вам не нравится, что заполняется все фамилией, то это вы виноваты, записывая во все ячейки только первое поле формы, хотя их у вас 4. Пишите каждое поле в свою ячейку и все получится

ps и вы не первый пост пишите, научитесь оформлять их. Выделяете код и жмете кнопку в виде свитка (если навести на нее мышку появится слово КОД), ваш код окажется в нужных тегах и пост будет более читабельным :)


принято, Спасибо!

Кот

Цитата: Кот от  8 декабря 2022, 13:42
Цитата: bigor от  8 декабря 2022, 13:38
Цитата: Кот от  8 декабря 2022, 13:15Подскажите, где ошибка
в принципе работает без ошибок. Если вам не нравится, что заполняется все фамилией, то это вы виноваты, записывая во все ячейки только первое поле формы, хотя их у вас 4. Пишите каждое поле в свою ячейку и все получится


Так я написал, что на Листе1 заполнить в ячейки А2, B2, C2, D2, E2, это не правильно?
rem Заполнение таблицы
Sub inputtocell

Dim stext as string
Dim cell  as object

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("A2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()
   
   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("B2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("C2")  'Get the named Cell
   Cell.String = sText
   
   REM data located in field from dialog
   sText = oCntrl.getText()

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("D2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()

   REM data found and put in cell
   Doc = ThisComponent
   Sheets = Doc.getSheets  'get the collection of Sheets
   Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
   Cell = Sheet.getCellRangeByName("E2")  'Get the named Cell
   Cell.String = sText

   REM data located in field from dialog
   sText = oCntrl.getText()
   
End Sub

bigor

Во, код правильно оформили, только не вижу чего там исправили. Похоже ничего.
Смотрите в первом макросе вы oCntrl = oDialog.getControl("TextField1") присваиваете значение первого поля формы.
Во втором вы всем ячейкам присваиваете oCntrl.getText(), т.е. первое поле
Что бы работало правильно нужно для каждого поля своя переменная в первом макросе и во втором в соответствующую ячейку вставлять значение соответсвующей переменной
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

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

У меня этот код

rem Запуск диалога КНОПКОЙ
Dim oCntrl
Sub menu()
      Dim oLibContainer As Object, oLib As Object
      Dim oInputStreamProvider As Object
      Dim oDialog As Object
      Const sLibName = "Standard"
      Const sDialogName = "Dialog111"
      REM library container
      oLibContainer = DialogLibraries
      REM load the library
      oLibContainer.loadLibrary( sLibName )
      REM get library
      oLib = oLibContainer.getByName( sLibName )
      REM get input stream provider
      oInputStreamProvider = oLib.getByName( sDialogName )
      REM create dialog control
      oDialog = CreateUnoDialog( oInputStreamProvider )
      REM show the dialog
      oDialog.setTitle("A")
      oCntrl = oDialog.getControl("TextField1")
      oDialog.execute()
     
End Sub

получился для кнопки на открывания окна dialog.
Добавлял к выше указанному коду
oCntrl = oDialog.getControl("TextField2")
      oCntrl.getText()
у меня ничего не получается.  :-[
Что не так?

bigor

Цитата: Кот от  9 декабря 2022, 21:16Что не так?
Цитата: Кот от  9 декабря 2022, 21:16oCntrl = oDialog.getControl("TextField1")
Цитата: Кот от  9 декабря 2022, 21:16oCntrl = oDialog.getControl("TextField2")
Вы в одну переменную пишите два поля, в лучшем случае получите везде только имя
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от  9 декабря 2022, 21:56Вы в одну переменную пишите два поля, в лучшем случае получите везде только имя
А Вы правильную запись можете написать?

Вы только не сердитесь, я не знаю ни Excel, ни LO.
Внучке для работы в школе насобирал и сделал файлы, макросы с юзерформами в Excel, обьем более 180 мб, все работает как того хотела (требовалось).
Теперь приходится переходить в LO, а для него примеров с разьяснениями очень мало, да и не подходят порой.
Вот и приходится Вас мучить своей безграмотностью в этой сфере.

Спасибо!

bigor

Чисто в познавательном варианте это можно сделать так
rem Запуск диалога КНОПКОЙ
Dim oCntrl(4)
Sub menu()
      Dim oLibContainer As Object, oLib As Object
      Dim oInputStreamProvider As Object
      Dim oDialog As Object
      Const sLibName = "Standard"
      Const sDialogName = "Dialog111"
      REM library container
      oLibContainer = DialogLibraries
      REM load the library
      oLibContainer.loadLibrary( sLibName )
      REM get library
      oLib = oLibContainer.getByName( sLibName )
      REM get input stream provider
      oInputStreamProvider = oLib.getByName( sDialogName )
      REM create dialog control
      oDialog = CreateUnoDialog( oInputStreamProvider )
      REM show the dialog
      oDialog.setTitle("A") 
     
      oCntrl(1) = oDialog.getControl("TextField1")
      oCntrl(2) = oDialog.getControl("TextField2")
      oCntrl(3) = oDialog.getControl("TextField3")
      oCntrl(4) = oDialog.getControl("TextField4")
      oDialog.execute()
     
End Sub


rem Заполнение таблицы
Sub inputtocell

Dim stext as string
Dim cell  as object

for i=1 to 4
REM data found and put in cell
Doc = ThisComponent
Sheets = Doc.getSheets  'get the collection of Sheets
Sheet = Sheets.GetByName("Лист1")  'get the specific Sheet
Cell = Sheet.getCellByPosition(i,1)  'Get the named Cell
Cell.String = oCntrl(i).getText()
next
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

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

В Ваш рабочий, красивый код я добавил формулы, и что-то код стал ругаться на строку
Sheet = Sheets.GetByName("Лист1")
REM  *****  BASIC  *****

Option VBASupport 1

Dim oCntrl(4)
Sub menu()

      REM формулы в столбцах А, Е, F
      Range("A2").Formula = "=IF(B2>0,ROW()-ROW($A$1),"""")"
      Range("E2").Formula = "=B2&"" ""&C2&"" ""&D2"
      Range("F2").Formula = "=LEFT(E2,SEARCH("" "",E2)+1)&"".""&MID(E2,SEARCH("" "",E2,SEARCH("" "",E2)+1)+1,1)&""."""

      Dim oLibContainer As Object, oLib As Object
      Dim oInputStreamProvider As Object
      Dim oDialog As Object

      REM библиотека "Standard"
      Const sLibName = "Standard"
      REM название формы "Dialog111"
      Const sDialogName = "Dialog111"

      REM библиотечный контейнер
      oLibContainer = DialogLibraries
      REM загрузите библиотеку
      oLibContainer.loadLibrary(sLibName)
      REM получить библиотеку
      oLib = oLibContainer.getByName(sLibName)
      REM получить поставщика входного потока
      oInputStreamProvider = oLib.getByName(sDialogName)
      REM создать диалоговое управление
      oDialog = CreateUnoDialog(oInputStreamProvider)
      REM показать диалоговое окно "A"
      oDialog.setTitle("A")
   
      oCntrl(1) = oDialog.getControl("TextField1")
      oCntrl(2) = oDialog.getControl("TextField2")
      oCntrl(3) = oDialog.getControl("TextField3")
      oCntrl(4) = oDialog.getControl("TextField4")
      oDialog.execute()
   
End Sub


REM Заполнение таблицы
Sub inputtocell

    Dim stext as string
    Dim cell  as object

        for i=1 to 4

        REM данные найдены и помещены в ячейку
        Doc = ThisComponent
        REM получите коллекцию листов
        Sheets = Doc.getSheets
        REM получите конкретный лист "Лист1"
        Sheet = Sheets.GetByName("Лист1")
        REM получить названную ячейку 1
        Cell = Sheet.getCellByPosition(i, 1)
        Cell.String = oCntrl(i).getText()
    Next
   
End Sub

У меня не получается при внесении данных в TextField1,2,3,4 формы Dialog111, переходить от одного TextField к другому клавишей Enter, после ввода данных в форме Dialog111 чтобы TextField очищались. А при поступлении данных из формы Dialog111, таблица на Лист1 пополнялась.
Подскажите, что не так?

Спасибо!

bigor

#12
Цитата: Кот от 11 декабря 2022, 10:44код стал ругаться
sheets это имя свойства,и я бы не рисковал его использовать как имя переменной. В 
Цитата: Кот от 11 декабря 2022, 10:44рабочий, красивый код
я использовал цикл так как ячейки куда нужно было вводить данные шли подряд. Сейчас же смысла в цикле не стало.
Зачем использовать формулы, если эти операции можно осуществить макросом?
Переход между полями формы осуществляется клавишей Tab. Но для этого нужно задать порядок обхода полей


Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Кот

Цитата: bigor от 11 декабря 2022, 15:05Зачем использовать формулы, если эти операции можно осуществить макросом?
Переход между полями формы осуществляется клавишей Tab. Но для этого нужно задать порядок обхода полей
Стыдно в моем возрасте такое говорить, не знаю и не умею этого делать.
Не получается найти что-то похожее и переделать в LO. Просто беда.

Кот

Цитата: Кот от 11 декабря 2022, 16:01Зачем использовать формулы, если эти операции можно осуществить макросом?
Переход между полями формы осуществляется клавишей Tab. Но для этого нужно задать порядок обхода полей
Хорошо бы пример какой-нибудь.
Спасибо!