Поле ввода вместо точки в него макрос вставляет запятую

Автор Ципихович Эндрю, 7 апреля 2026, 19:05

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

Ципихович Эндрю

здравствуйте есть в документе врайтер "Поле ввода" вкладка "Формат" там пусто, если было "Числовой" - было бы понятно поле "Имя" там указано "г. Новосибирск", а в поле, вставляется вместо точки запятая "г, Новосибирск" это всё вставляется макросом:

Sub FillInputsFromTable()
    Dim oDoc As Object, oTables As Object, oTable As Object
    Dim iRows As Integer, iCols As Integer, i As Integer
    Dim oCell1 As Object, oCell2 As Object
    Dim sKey As String, sValue As String
    Dim oPort As Object
   
    oDoc = ThisComponent
   
    ' Проверяем наличие таблиц
    oTables = oDoc.getTextTables()
    If oTables.getCount() = 0 Then
        MsgBox "Таблиц не найдено!"
        Exit Sub
    End If
   
    ' Берём первую таблицу
    oTable = oTables.getByIndex(0)
   
    ' Проверяем количество столбцов
    iCols = oTable.getColumns().getCount()
    If iCols <> 2 Then
        MsgBox "Первая таблица должна иметь 2 столбца, а не " & iCols
        Exit Sub
    End If
   
    iRows = oTable.getRows().getCount()
   
    ' Проходим по всем строкам
    For i = 0 To iRows - 1
        ' Получаем ячейки
        oCell1 = oTable.getCellByPosition(0, i)
        oCell2 = oTable.getCellByPosition(1, i)
       
        sKey = Trim(oCell1.getString())
        sValue = Trim(oCell2.getString())
       
        ' Если 2-й столбец не пустой
        If Len(sValue) > 0 Then
            ' Ищем поле ввода
            oPort = FindInputFieldPortion(oDoc, sKey)
           
            If Not (oPort Is Nothing) Then
                ' Передаём oDoc в подпрограмму!
                UpdateInputField oDoc, oPort, sValue
                MsgBox "Заполнено: " & sKey & " = " & sValue, 64, "Успех"
            Else
                MsgBox "Поле с подсказкой '" & sKey & "' не найдено!", 48, "Внимание"
            End If
        End If
    Next i
   
    MsgBox "Обработка завершена!", 64, "Готово"
End Sub

' Поиск TextPortion с полем ввода
Function FindInputFieldPortion(oDoc As Object, sHint As String) As Object
    Dim oEnum As Object, oPara As Object
    Dim oPortEnum As Object, oPort As Object
   
    oEnum = oDoc.getText().createEnumeration()
    Do While oEnum.hasMoreElements()
        oPara = oEnum.nextElement()
        If oPara.supportsService("com.sun.star.text.Paragraph") Then
            oPortEnum = oPara.createEnumeration()
            Do While oPortEnum.hasMoreElements()
                oPort = oPortEnum.nextElement()
                On Error Resume Next
                If Not IsNull(oPort.TextField) Then
                    If oPort.TextField.Hint = sHint Then
                        FindInputFieldPortion = oPort
                        Exit Function
                    End If
                End If
                On Error GoTo 0
            Loop
        End If
    Loop
   
    FindInputFieldPortion = Nothing
End Function

' Обновление поля ввода — с параметром oDoc!
Sub UpdateInputField(oDoc As Object, oPort As Object, sNewValue As String)
    Dim oField As Object
    Dim oText As Object, oTextCursor As Object
    Dim oAnchor As Object
    Dim oNewField As Object
    Dim sHint As String
   
    oField = oPort.TextField
    sHint = oField.Hint
   
    ' Получаем текст и позицию
    oAnchor = oField.getAnchor()
    oText = oAnchor.getText()
   
    ' Создаём курсор на месте поля
    oTextCursor = oText.createTextCursorByRange(oAnchor)
   
    ' Выделяем поле
    oTextCursor.gotoRange(oAnchor, True)
   
    ' Удаляем старое поле
    oText.removeTextContent(oField)
   
    ' Создаём новое поле с новым значением
    oNewField = oDoc.createInstance("com.sun.star.text.TextField.Input")
    oNewField.Hint = sHint
    oNewField.Content = sNewValue
   
    ' Вставляем новое поле
    oText.insertTextContent(oTextCursor, oNewField, False)
End Sub
но вроде он не при чём, он сигнализирует "Заполнено: Место составления = г. Новосибирск" - то есть с точкой, видимо что-то с полем, что?

Ципихович Эндрю

здравствуйте, догадки конечно есть, поэтому:
Сервис → Автозамена → Параметры автозамены... → Replace, там нет «г.»
Options пункта «Аббревиатуры» нет
Expections Сокращения, после которых не следует прописных букв удалил «г.» - не помогло, в чём же проблема?

Ципихович Эндрю

#2
кто-то говорил, трудно искать чёрную кошку в тёмном помещении, особенно когда её там нет...
так вот после обновления поля вижу: гЗПТ Новосибирск, выделяю нажимаю контрол+Р=направить на печать и чудным образом вижу гТЧК Новосибирск, вау, что это?
какой бы не был ответ, суть его я догадываюсь, вопрос в том как сделать, чтобы было согласно тому, что было в таблице, то и вставило в поле: г. Новосибирск, как?

sokol92

Цитата: Ципихович Эндрю от  7 апреля 2026, 19:05в поле, вставляется вместо точки запятая "г, Новосибирск"
У меня вставляется точка.
Проверил на версиях 26.2.0 и 25.8.4
Владимир.

Ципихович Эндрю

у меня нет)) либра
Version: 26.2.1.2 (X86_64)
Build ID: 620(Build:2)
CPU threads: 12; OS: Windows 11 X86_64 (build 26200); UI render: Skia/Vulkan; VCL: win
Locale: ru-RU (ru_RU); UI: ru-RU
Calc: threaded
вроде последняя...

sokol92

Увеличьте масштаб экрана. Возможно там точка, которая помечена волнистой чертой при проверке орфографии.
Владимир.

Ципихович Эндрю

Цитата: sokol92 от  8 апреля 2026, 16:52Увеличьте масштаб экрана. Возможно там точка, которая помечена волнистой чертой при проверке орфографии.
ловкость рук и никакого мошенничества-так и есть, спасибо