копирование форматированного текста в 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
- ваша база данных Access имеет таблицу под названием tblWordDump
- ваша форма привязана к таблице tblWordDump
- 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
вот пример доступа к файлу этого для вас, чтобы совать нос.