копирование форматированного текста в access с помощью vba

мне нужно сохранить форматированный текст из Word в базе данных Access.

до сих пор мне удалось выяснить, как хранить форматированный текст в поле доступа (создайте поле Memo в таблице и установите текстовый формат как Rich Text). Поиск, поэтому я еще не столкнулся с решением о том, как транспортировать указанный текст из word в Access.

Я знаю, что это возможно, потому что вы можете сделать это, просто скопировав и вставив информацию, если вы делаете это вручную.

мой вопрос, как я могу скопировать форматированный текст из Word в поле в таблице с помощью VBA?

экспериментально я создал следующее, чтобы проверить это. Пока безуспешно...

Sub GetComments()
'Imports Analyst Comments from Excel files als OLE Objects.
'---------------------------------

'Access Variables
Dim dbsFundDB As DAO.Database
Dim rsComments As DAO.Recordset

Set dbsFundDB = CurrentDb
Set rsComments = dbsFundDB.OpenRecordset("tblFunds")

'Word Variables
Dim doc             As Word.Application
Dim dcmt            As Word.Document
Dim sectn           As Word.Section
Dim obCommentText   As Object
Dim sAnalystText    As String

'Open New Word File
Set doc = New Word.Application
doc.Visible = True
Set dcmt = doc.Documents.Open(sPathTemplate)
Set sectn = dcmt.Sections(1)

sectn.Range.Select
Selection.InsertFile FileName:="myfile.rtf", Range:="", _
  ConfirmConversions:=False, Link:=False, Attachment:=False

sAnalystText = sectn.Range.Tables(1).cell(1, 1).Range.FormattedText

rsComments.AddNew
rsComments![Long Comment Exec] = sAnalystText
rsComments.Update

sectn.Range.Select
dcmt.Close savechanges:=False
doc.Quit

End Sub

обновление Я попытался реализовать ответ Мэтта Холла. Хотя текст действительно скопирован в базу данных, он еще не сохраняет форматирование:

вот моя реализация, как простой тест:

Option Explicit
Public Const sPathTemplate As String = "W:LBDTPProductsFundResearchToolAdvisory.docx"
Option Compare Database

Sub GetComments()
'Imports Comments from word and save in DB
'Test soubroutine
'---------------------------------

'Word Variables
Dim obCommentText As Variant
Dim strSQL As String

obCommentText = GetWordContent(sPathTemplate)

strSQL = "insert into [tblText]([TestField]) values('" & obCommentText & "')"

DoCmd.RunSQL strSQL
MsgBox "Import Successful", vbInformation Or vbOKOnly

End Sub
Private Function GetWordContent(strFile As String) As Variant

    ' This function takes the path obtained to the MS-Word Document selected in
    ' the FileToOpen function and then uses that to open that MS-Word Document
    ' and retrieve its text contents

    Dim objDoc As Word.Document

    Set objDoc = GetObject(strFile)

    GetWordContent = CVar(objDoc.Sections(1).Range.Text)

    objDoc.Close

End Function

1 ответов


вот метод, который сильно ссылается этой.

перед началом убедитесь, что у вас есть эти (или эквивалент вашей версии доступа) ссылки, отмеченные в Редакторе VBA > инструменты > ссылки:

Microsoft слово 15.0 Объекта Библиотека

Microsoft офис 15.0 Объекта Библиотека

предполагая, что вы настроили форму с командной кнопкой для запуска этого импорта MS-Word, поместите следующая функция и подпрограмма где-то в модуле VBA этой формы:

1) Функция Выбора Файла:

Это позволит вам выбрать документ MS-Word, который вы хотите использовать старое знакомое диалоговое окно файла, которое вы видите во всех окнах. В конечном счете, все это делает сохранить путь к файлу и имя файла, который вы выбрали для использования в подпрограмме, описанной в (2)...

Private Function FileToOpen() As String

    ' This function will essentially allow you to browse to MS-Word document
    ' and then store the path of that file for use in the GetWordContent function

    Dim fDialog As Office.FileDialog
    Dim varFile As Variant

    Set fDialog = Application.FileDialog(msoFileDialogFilePicker)

    With fDialog

        .AllowMultiSelect = False
        .Title = "Select Word document to import"
        .Filters.Clear
        .Filters.Add "Word files", "*.doc?"

        If _
            .Show = True _
        Then
            For Each varFile In .SelectedItems

                FileToOpen = varFile

            Next

        Else

            FileToOpen = ""

        End If

    End With

End Function

2) получить Форматированное текстовое содержимое MS-Word Подпрограмма Документа:

эта подпрограмма будет использовать путь к файлу и имя документа MS-Word, выбранного в функции выбора файлов (выше), чтобы открыть документ MS-Word, выберите весь текст, скопируйте его в буфер обмена, вставьте его в текстовое поле в открытой форме в Access, а затем закройте MS-Word...

Private Sub GetWordContent(strFile As String)

    ' This function takes the path obtained to the MS-Word Document selected in
    ' the FileToOpen function and then uses that to open that MS-Word Document
    ' and retrieve its text contents and paste them in to WordDocData textbox on
    ' the currently open form in Access

    ' Create an MS-Word Object:

    Dim objDoc As Object
    Set objDoc = CreateObject("Word.Application")

    ' Open the file selected in FileToOpen() and copy the contents to clipboard:

    With objDoc

        .Documents.Open strFile
        .Visible = True
        .Activate
        .Selection.WholeStory
        .Selection.Copy

    End With

    ' Set the focus to the WordDocData textbox on the Access Form and paste clipboard:

    Me.WordDocData.SetFocus
    DoCmd.RunCommand acCmdPaste

    Me.WordDocDataSrc = strFile

    ' Save record on the form:

    If _
        Me.Dirty _
    Then

        Me.Dirty = False

    End If

    ' A bit hacky this bit. When you close MS-Word after copying a lot of data,
    ' you might get a message asking you if you if you want to keep the last item
    ' you copied. This essentially overwrites the clipboard that currently has
    ' the whole document stored, to just the first 5 characters, which should allow
    ' MS-Word to be closed here without a pop-up message to deal with:

    With objDoc

        .Selection.HomeKey Unit:=wdLine
        .Selection.MoveRight Unit:=wdCharacter, Count:=5, Extend:=wdExtend
        .Selection.Copy
        .Documents.Close
        .Quit

    End With

    Set objDoc = Nothing

End Sub

событие On-click вашей командной кнопки:

эта подпрограмма должна выполняться из события on-click вашей командной кнопки. Он по существу называет и GetWordContent подпрограмма для того, чтобы пользователь мог выбрать документ MS-Word, а затем позволить VBA копировать и вставлять форматированный текст из документа MS-Word в текстовое поле заметки с богатым текстом на открытой форме в Access.

обратите внимание, что эта подпрограмма делает некоторые предположения и ссылается на имена элементов управления/таблиц/полей и тому подобное, которые вы, возможно, еще не настроили. Эти предположения:

    формы называется cmdGetWordData
  1. ваша база данных Access имеет таблицу под названием tblWordDump
  2. ваша форма привязана к таблице tblWordDump
  3. tblWordDump имеет 2 текстовых поля memo под названием WordDocDataSrc и WordDocData чтобы сохранить импортированный путь к файлу / имя и текстовое содержимое соответственно, и оба добавляются в форму
Private Sub cmdGetWordData_Click()

    ' This subroutine runs on your command button; it will call both the FileToOpen function and GetWordContent subroutine
    ' to retrieve the text contents of your chosen MS-Word Document.
    ' It will then store both the path the text contents of of your chosen MS-Word Document in 2 fields in a table in Access.

    ' NOTE: this code assumes that your Access database has:
    ' - a table called tblWordDump
    ' - a memo text field in this table called WordDocDataSrc to store the path of MS-Word file imported
    ' - a memo text field in this table called WordDocData with the TextFormat property set to "Rich Text",
    '   which will store the text and text formating of the MS-Word file imported

    Dim strFile As String
    Dim strWordContent As Variant

    ' Select file via File Dialogue

    strFile = FileToOpen

    ' Conditionals when a file was or wasn't selected

    If _
        Len(strFile) > 0 _
    Then

        DoCmd.GoToRecord , , acNewRec

        GetWordContent strFile

        MsgBox "Import Successful", vbInformation Or vbOKOnly

    Else

        MsgBox "No File Selected", vbExclamation Or vbOKOnly

    End If

End Sub

вот пример доступа к файлу этого для вас, чтобы совать нос.