Каков правильный синтаксис для программного создания документа Word в OLEBoundFrame в доступе ms - PullRequest
1 голос
/ 07 мая 2020

Мне нужно автоматически создать объект Word.Document в BoundObjectFrame, который привязан к полю OLE в моей базе данных.

В событии AfterInsert формы у меня есть следующий код:

Private Sub Form_AfterInsert()
    Dim oDocument As Object
    Dim rsParaRS As Recordset
    Dim intCurrline As Integer
    With OLEBoundWord
        .Class = "Word.Document"
        .Action = acOLECreateEmbed(0)

    End With

'    OLEBoundWord.CreateEmbed vbNullString, "Word.Document"
    Set oDocument = OLEBoundWord.Object
    Set rsParaRS = Form.Recordset
    rsParaRS.MoveLast
    rsParaRS.Edit
    rsParaRS!ParagraphOrder = rsParaRS.RecordCount
    rsParaRS!ParagraphDocE = oDocument
    rsParaRS.Update
    ' rsParaRS.Close
End Sub

Когда я пытаюсь запустить код, я получаю ошибку «ожидаемый массив» в точке, где вызывается .Action = acOLECreateEmbed (0). Как и где мне инициализировать массив для acOLECreateEmbed, или есть еще что-то, чего мне не хватает?

Есть мысли / указатели?

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Мне удалось заставить это работать, переместив мой BoundObjectFrame в отдельную форму, в которой не было представления таблицы - та, которую я не мог заставить работать, находилась в строке таблицы. В событии BoundObjectFrame GotFocus новой формы я использовал следующий код:

Private Sub OLEBoundWord_GotFocus()
    If IsNull(Me.OLEBoundWord.Value) Then
        With Me.OLEBoundWord
            .Class = "Word.Document"
            .Action = acOLECreateEmbed ''(0)

        End With
    End If
End Sub

Это сработало!

0 голосов
/ 12 мая 2020

Я предполагаю, что OP скопировал acOLECreateEmbed (0) из справочника VBA Office . Для свойства BoundObjectFrame.Action требуется константа. acOLECreateEmbed - константа. См. обозреватель объектов pi c ниже. Выражение acOLECreateEmbed (0) подразумевает компилятору, что acOLECreateEmbed - это функция, принимающая параметр numeri c, или массив.

Я предполагаю, что это задано в ваше приложение, что информация всегда будет вводиться в документ Word сразу после каждой вставки записи. В противном случае создание объекта по этому событию без нужды приведет к раздуванию базы данных. Избежать раздувания можно с помощью приведенной ниже стратегии.

Private Sub OLEWord_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If IsNull(OLEWord.Value) Then 'Avoid overwriting edited document
    With OLEWord
        .Class = "Word.Document"
        .OLETypeAllowed = acOLEEmbedded
        .Action = acOLECreateEmbed
        .AutoActivate = acOLEActivateDoubleClick
    End With
End If

End Sub

Установка BoundObjectFrame.AutoActivate на константу acOLEActivateDoubleClick открывает документ Word в событии _DblClick . Это также можно установить на странице свойств BoundObjectFrame . Событие _MouseDown создаст объект непосредственно перед тем, как _DblClick откроет его для редактирования.

Скриншот acOLECreateEmbed - это константа

Access Object Browser Pic

...