Импорт полей формы MS Word в MS Access - PullRequest
3 голосов
/ 19 октября 2010

Я создал форму приложения, используя MS Word и целую кучу полей формы, и у меня есть база данных Access, которая может импортировать все необходимые данные из этого документа Word, благодаря этому:

http://msdn.microsoft.com/en-us/library/aa155434%28office.10%29.aspx

Теперь все работает просто отлично (мне даже удалось заставить его импортировать в несколько таблиц!), Но проблема с вышесказанным заключается в том, что мне приходится вручную вводить имя каждого файла по одному ... хорошо, если это просто случай импорта формы заявки, как она есть ... но я довольно много сижу в папке, которую нужно ввести в базу данных.

Тогда я нашел это:

Как отобразить диалоговое окно «Открыть файл» в Access 2007 VBA?

Я пытался настроить и объединить их, чтобы они работали ... но, как вы можете догадаться, безрезультатно ... (это не помогает, когда я очень начинающий пользователь Access!)

Что я хочу сделать, так это иметь возможность импортировать несколько полей документов / форм Word в MS Access с помощью диалогового окна «Открыть / Выбрать файл» ... что у меня работает, но мне бы хотелось чтобы было легче работать!

Спасибо всем Джейк

##### Коды, которые я использовал
Option Compare Database

Option Explicit

Private Sub cmdFileDialog_Click()

' This requires a reference to the Microsoft Office 11.0 Object Library.

Dim fDialog As Office.FileDialog
Dim varFile As Variant

Dim appWord As Word.Application
Dim doc As Word.Document
' Dim cnn As New ADODB.Connection
' Dim rst As New ADODB.Recordset
Dim strDocName As String
Dim blnQuitWord As Boolean

' Clear the list box contents.
' Me.FileList.RowSource = ""

' Set up the File dialog box.
Set fDialog = Application.FileDialog(msoFileDialogFilePicker)
With fDialog
' Allow the user to make multiple selections in the dialog box.
.AllowMultiSelect = True

' Set the title of the dialog box.
.Title = "Select One or More Files"

' Clear out the current filters, and then add your own.
.Filters.Clear
.Filters.Add "Microsoft Word", "*.DOC"
.Filters.Add "All Files", "*.*"

' Show the dialog box. If the .Show method returns True, the
' user picked at least one file. If the .Show method returns
' False, the user clicked Cancel.
If .Show = True Then
' Loop through each file that is selected and then add it to the list box.
For Each varFile In .SelectedItems
' Me.FileList.AddItem varFile

Set appWord = GetObject(, "Word.Application")
Set doc = appWord.Documents.Open(varFile)

' cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
'     "Data Source=M:\Medical\GPAppraisal\Contacts & Databases\" & _
'     "AppForm.mdb;"
' rst.Open "tbl_Applicants", cnn, _
'     adOpenKeyset, adLockOptimistic

' With rst
.addnew
!Title = doc.FormFields("wTitle").Result
!FirstName = doc.FormFields("wFirstName").Result
!LastName = doc.FormFields("wLastName").Result
!Address1 = doc.FormFields("wAddress1").Result
!Address2 = doc.FormFields("wAddress2").Result
!Address3 = doc.FormFields("wAddress3").Result
!City = doc.FormFields("wCity").Result
!PostCode = doc.FormFields("wPostCode").Result
!Email = doc.FormFields("wEmail").Result
!Phone1 = doc.FormFields("wPhone1").Result
!Phone2 = doc.FormFields("wPhone2").Result
!LM = doc.FormFields("wLM").Result
!LMAddress1 = doc.FormFields("wLMAddress1").Result
!LMAddress2 = doc.FormFields("wLMAddress2").Result
!LMAddress3 = doc.FormFields("wLMAddress3").Result
!LMCity = doc.FormFields("wLMCity").Result
!LMPostCode = doc.FormFields("wLMPostCode").Result
!LMEmail = doc.FormFields("wLMEmail").Result
!LMPhone = doc.FormFields("wLMPhone").Result
!LMOK = doc.FormFields("wLMOK").Result
!Probity = doc.FormFields("wProbity").Result
!Practising = doc.FormFields("wPractising").Result
!Signature = doc.FormFields("wSignature").Result
!AppDate = doc.FormFields("wAppDate").Result
!e2011012028 = doc.FormFields("w2011012028").Result
!e2011021725 = doc.FormFields("w2011021725").Result
!e2011030311 = doc.FormFields("w2011030311").Result
!e2011031625 = doc.FormFields("w2011031625").Result
!e20110203 = doc.FormFields("w20110203").Result
!e20110211 = doc.FormFields("w20110211").Result
!e20110322 = doc.FormFields("w20110322").Result
!e20110330 = doc.FormFields("w20110330").Result
.Update
.Close
End With
doc.Close
If blnQuitWord Then appWord.Quit
cnn.Close
MsgBox "Application Imported!"

Cleanup:
' Set rst = Nothing
' Set cnn = Nothing
Set doc = Nothing
Set appWord = Nothing

Next
Else
   MsgBox "You clicked Cancel in the file dialog box."
End If
End With
End Sub
#

Я пытался связываться с me.tables и мной! Формами, .add и т. Д. И т. Д. - очевидно, я здесь полный новичок !!!

То, что я хочу, - это возможность импортировать данные из полей формы в Word Doc в таблицу MS Access (что мне удалось сделать с помощью первого URL в моем предыдущем посте выше); путем выбора документа Word из диалогового окна «Открыть / Выбрать» вместо ручного ввода имен каждого документа Word.

Приношу свои извинения, если это кажется очевидным или простым - Доступ - это не моя сильная сторона!

1 Ответ

1 голос
/ 21 июля 2011

Прежде чем я начал, я не понял, почему в вашем примере кода так много некомментированных строк (lines beginnig mit '). Я предполагаю, что большинство из этих строк обычно не комментируются и являются частью рабочего кода. Или есть артефакты редактора переполнения стека?

Я вижу несколько проблем, которые могут привести вас к решению.

1) При использовании

With fDialog

вы позволяете этому «открываться» до конца кода (даже используя второй С с промежуточным значением). Я бы порекомендовал вам установить соответствующий «End With» сразу после того, как он вам больше не нужен. Помните (или обратите внимание):

With fDialog
   [... something]
   ' Set the title of the dialog box.
   .Title = "Select One or More Files"

на самом деле просто сокращение для

fDialog.Title

(т. Е. «Голый». Означает, что он должен быть добавлен к объекту в «С»), чтобы вы могли полностью отказаться от «С». В вашем примере я бы установил «End With» прямо перед

If .Show = True Then

и затем используйте

If fDialog.Show = True Then

2) Я бы установил

Set appWord = GetObject(, "Word.Application")

за пределами ваш цикл For Each (не забудьте также установить Set appWord = Nothing за пределами цикла). Помните, что с GetObject вам нужен запущенный экземпляр Word, иначе вы можете захотеть использовать

Set appWord = CreateObject("Word.Application")

или чтобы получить его обоими способами, попробуйте получить объект Word и, если он недоступен (например, Err.Number = 429), создайте новый.

On Error Resume Next
Set appWord = GetObject(, "Word.Application")

If Err.Number = 429 Then
    Set appWord = CreateObject("Word.Application")
End If
On Error GoTo 0

3) При работе или, по крайней мере, во время разработки с использованием автоматизации, я всегда устанавливал

objword.Visible = True

чтобы вы могли видеть сообщения об ошибках или другие проблемы прямо в Word.

HTH для следующих шагов (на случай, если у вас возникнет эта проблема) Andreas

...