скопировать форматированный текст в доступ с помощью VBA

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

До сих пор мне удалось выяснить, как хранить отформатированный текст в поле доступа (создайте памятное поле в таблице и установите формат текста как расширенный текст). В поисках SO я еще не нашел решения о том, как перенести указанный текст из слова в Access.

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

Мой вопрос, как я могу скопировать форматированный текст из слова в поле таблицы с помощью 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

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

Вот моя реализация в виде простого теста:

 Option Explicit
Public Const sPathTemplate As String = "W:\L\BDTP\Products\FundResearchTool\Advisory.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
7 голосов | спросил rohrl77 12 J0000006Europe/Moscow 2015, 17:35:24

1 ответ


0

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

Прежде чем начать, убедитесь, что эти (или эквивалент вашей версии Access) отмечены галочкой в ​​редакторе VBA> Инструменты> Ссылки:

  

Microsoft Word 15.0. Библиотека объектов

     

Microsoft Office 15.0. Библиотека объектов

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

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

Это позволит вам выбрать нужный документ MS-Word, используя диалоговое окно старого файла, которое вы видите в Windows. В конечном итоге все, что он делает - это сохраняет путь к файлу и имя файла, который вы выбрали для использования в подпрограмме, описанной в (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

Событие нажатия кнопки командной кнопки:

Эта подпрограмма должна запускаться из события нажатия кнопки командной кнопки. По сути, он вызывает функцию FileToOpen и GetWordContent Подпрограмма, чтобы пользователь мог выбрать документ MS-Word, а затем позволить VBA скопировать и вставить форматированный текст из документа MS-Word в текстовое поле текстового примечания в открытой форме в Access.

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

  1. Командная кнопка вашей формы называется cmdGetWordData .
  2. В вашей базе данных Access есть таблица с именем tblWordDump .
  3. Ваша форма связана с таблицей tblWordDump
  4. tblWordDump имеет 2 текстовых поля с напоминаниями, которые называются 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

Вот пример файла Access этого для ты тыкаешь в.

ответил Matt Hall 15 J0000006Europe/Moscow 2015, 19:03:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132