2017-06-21 12 views
0

Microsoft Wordフォームの内容をAccessデータベースにインポートする作業が行われました。これは、フォームからトリガーされ、次のVBAコード使用して正常に動作しています:Microsoft Access VBA - 名前のないWordフォームフィールドからデータをインポートする

Private Sub cmdFileDialog_Click() 
    On Error GoTo ErrorHandler 
    Dim objDialog As Object 
    Dim varFile As Variant 
    Dim rec, rec2 As Recordset 
    Dim db As Database 

    'New Word Document Variables 
    Dim appWord As Word.Application 
    Dim doc As Word.Document 

    Const DEST_TABLE = "ap_behaviour_referrals" 'change to suit 
    Const PATH_DELIM = "\" 

    Set objDialog = Application.FileDialog(3) 
    ' Clear listbox contents. 
    Me.fileList.RowSource = "" 

With objDialog 
    .AllowMultiSelect = False 
    ' Set the title of the dialog box. 
    .Title = "Please select a behaviour referral to import" 
    ' Clear out the current filters, and add our own. 
     .Filters.Clear 
     .Filters.Add "Microsoft Word Forms", "*.docx" 
     .Filters.Add "All Files", "*.*" 
    .Show 
    If .SelectedItems.Count = 0 Then 
     MsgBox "No file selected." 
    Else 
     For Each varFile In .SelectedItems 
      'New docx Variable Actions 
      Set appWord = GetObject(, "Word.Application") 
      Set doc = appWord.Documents.Open(varFile) 

     Next 

     Set db = CurrentDb 
     Set rec = db.OpenRecordset(DEST_TABLE) 

     With rec 
      .AddNew 
      ' my data 
      'preformat the date fields from the form 
      Dim unformattedpupildob As String 
      Dim formattedpupildob As Date 
      unformattedpupildob = doc.FormFields("Text2").Result 
      unformattedpupildob = Replace(unformattedpupildob, ".", "/") 
      formattedpupildob = Format(unformattedpupildob, "dd/mm/yy") 
      'And now insert the record into the table 
      !pupil_name = doc.FormFields("Text1").Result 
      !pupil_dob = formattedpupildob 
      !pupil_yr_grp = doc.FormFields("Text3").Result 
      !pupil_submitted_eth = doc.FormFields("Text4").Result 
      !pupil_upn = doc.FormFields("Text5").Result 
      !pupil_looked_after = doc.FormFields("Text6").Result 
      !sen_pre_statement = doc.FormFields("Text7").Result 
      !sen_ehcp = doc.FormFields("Text8").Result 
      !cat_date_final_ehcp = doc.FormFields("Text9").Result 
      !num_exclusion = doc.FormFields("Text10").Result 
      !days_exclusion = doc.FormFields("Text11").Result 
      !sch_name = doc.FormFields("Text12").Result 
      !sch_no = doc.FormFields("Text14").Result 
      !contact_name = doc.FormFields("Text13").Result 
      !contact_role = doc.FormFields("Text40").Result 
      !contact_email = doc.FormFields("Text31").Result 
      .Update 
      .Close 
      MsgBox "File Processing Complete" 
     End With 
    End If 
End With 
Set objDialog = Nothing 
Me.fileList.RowSource = "" 
ExitSub: 
    Set rec = Nothing 
    Set db = Nothing 
    '...and set it to nothing 
    Exit Sub 
ErrorHandler: 
    If Err.Number <> 0 Then 
     Msg = "Error # " & Str(Err.Number) & " was generated by " & Err.Source & Chr(13) & "Error Line: " & Erl() & Chr(13) & Err.Description 
     MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext 
    End If 
    Resume ExitSub 
End Sub 

すべてが、分野の一つは、(悪い)ので、私は私がしました。しかし、フィールドの内容をつかむためにこれを使用することができブックマークされています無名のフォームフィールドに遭遇:私はインポートする必要があると私は名前のブックマークいなくても内容を取得する方法が分からない

Word Unnamed Form Field

誰かが管理しているのでフォームを変更することはできず、広く配布されていますが、名前を付けずにこのフィールドの内容を取り出す方法があれば疑問に思っていましたか?

ありがとうございます!

答えて

2

他のオブジェクトのコレクションと同様に、名前(他のフィールドの場合と同じように)または数値インデックスのいずれかでオブジェクトのアドレスを指定できます。

For i = 1 To doc.FormFields.Count 
    Debug.Print i, doc.FormFields(i).Result 
Next i 

フィールドのインデックスがわかるはずです。

次にコードに!the_answer = doc.FormFields(42).Resultを使用してください。直接ウィンドウ(Ctrlキー+ gは)彼らのインデックス、名前=ブックマークを持つすべてのフォームフィールドを示しています

Public Sub TestWord() 

    Dim oWord As Word.Application 
    Dim oDoc As Word.Document 
    Dim i As Long 

    Set oWord = CreateObject("Word.Application") 
    Set oDoc = oWord.Documents.Open("C:\Users\foobar\Documents\Dok1.docx") 
    oWord.Visible = True 

    For i = 1 To oDoc.FormFields.Count 
     Debug.Print i, oDoc.FormFields(i).Name, oDoc.FormFields(i).Result 
    Next i 

    oDoc.Close 
    oWord.Quit 

End Sub 

、および:最小限の作業例(Accessで実行されている):

編集(!42は一例です)デフォルトテキスト。

+0

私はあなたのコードのさまざまな反復を試みてきましたが、 "エラー#5941がMicrosoft Wordによって生成されました。コレクションの要求されたメンバーが存在しません。 FormFieldの最終的な部分をさまざまな可能性(Add、Application、Count、Creator、Item、Parent、Shadedは許容されるもの)に変更しようとしましたが、Wordはちょうどフィールドについての情報は、エラーをスローするか、何も教えてくれない...私はWordを推測しているだけでフォームフィールドについて不快な質問をするのが好きではない! お試しいただきありがとうございます! –

+0

OK、私はフォームフィールドで作業しました(私はスクリーンショットが馴染みがあると知っていました)。 Document.FormFieldsコレクションは使用しませんでしたが、ブックマークを使用して直接処理しました。しかし、そのようなフィールドを含む文書を開くと、私のコードは正常に動作します。どの部分があなたにとってうまくいきませんか? @TheAllPowerful – Andre

+0

キーボードと私の椅子の間に問題がありました!以前はctrl + gダイレクトウィンドウを使用していなかったので、デバッグレポートがポップアップすることを期待していました!私の悪い!私がそれをやった瞬間、それはすべて人生に燃えていました。私はインデックスが私のためにすべてポップアップしました!ご協力いただきありがとうございます! :-) –

関連する問題