Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Import eines Word Formular in ein Acess Formular

Begonnen von Baal1337, Januar 06, 2015, 01:38:18

⏪ vorheriges - nächstes ⏩

Baal1337

Hi Leute!

Ich arbeite mit Office/Acess/Word 2010.
Ich bin gerade dabei zu versuchen ein Word Formular mit definierten Feldern auf Knopfdruck in eine Acess Datenbank einzufügen.
Leider habe ich von VBA bisher nicht viel Ahnung gehabt und habe mir mit relativ viel Mühe irgendwann folgenden Code aus allerlei Quellen zusammengeklaut der auch funktioniert:


Sub GetWordData()
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

On Error GoTo ErrorHandling

strDocName = InputBox("Enter the absolute path of the Word contract " & _
    "you want to import:", "Import Contract")

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

cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=E:\Datenbank\" & _
    "Datenbank.accdb;"

rst.Open "Tabelle", cnn, _
    adOpenKeyset, adLockOptimistic

With rst
    .AddNew
    !Title = doc.FormFields("WordTitle").Result
    .Update
    .Close
End With
doc.Close
If blnQuitWord Then appWord.Quit
cnn.Close
MsgBox "Contract Imported!"

Cleanup:
Set rst = Nothing
Set cnn = Nothing
Set doc = Nothing
Set appWord = Nothing
Exit Sub
ErrorHandling:
Select Case Err
Case -2147022986, 429
    Set appWord = CreateObject("Word.Application")
    blnQuitWord = True
    Resume Next
Case 5121, 5174
    MsgBox "You must select a valid Word document. " _
        & "No data imported.", vbOKOnly, _
        "Document Not Found"
Case 5941
    MsgBox "The document you selected does not " _
        & "contain the required form fields. " _
        & "No data imported.", vbOKOnly, _
        "Fields Not Found"
Case Else
    MsgBox Err & ": " & Err.Description
End Select
GoTo Cleanup
End Sub


Das "Problem" das ich habe ist dass dieser Code die Daten direkt in die Tabelle übernimmt. Das passt mir nicht ganz, denn ich möchte gerne dass er damit stattdessen die Felder des Eingabeformular füllt damit man quasi nochmal kontrollieren kann ob die Eingaben so stimmen. Dafür habe ich ganz naiv das "Tabelle" (Name meiner Tabelle) in
rst.Open "Tabelle", cnn, _
    adOpenKeyset, adLockOptimistic

mit dem Namen meines Formulars ersetzt.
Wenn ich dies mache kommt jetzt natürlich ein Fehler:
"-2147217900: Unzulässige SQL-Anweisung: 'Delete','Insert','Select','Procedure' oder 'Update' erwartet"

Kommentiere ich den betreffenden Absatz einfach komplett aus kommt:
"3704: Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen."

Abgesehen davon dass ich auch nach eingeben der Fehlermeldungen bei Google nicht wirklich schlauer geworden bin v.a. da ich überhaupt kein SQL benutze wüsste ich gerne ob es irgendwie geht dass mir dieser Code die Werte eben in die entsprechenden Formluarfelder rein schreibt und nicht direkt in die Tabelle.
(Mir ist natürlich klar dass ich !Title dann auf den entsprechenden Namen des Acess-Eingabefeldes endern muss also irgendwas wie ![Title].value oder dergleichen, aber bis dahin kommt der Code ja gar nicht wenn ich statt "Tabelle" eben "Formluar" einsetzte.)

Kann mir jemand helfen? Ich habe ein wenig die Befürchtung dass das was ich will so mit meinem Code gar nicht funktioniert und ich mich stattdessen irgendwie einen Umweg gehen muss in dem ich den Wert der Word Textmarke in eine Variable speichere und die Variable dann in das Acess-Formlarfeld auslese oder so aber ich dachte vielleicht sind meine VBA "Kentnisse" einfach zu schlecht um zu verstehen dass ich irgendwo nur was anders definieren muss oder so.

Vielen Dank an alle die sich damit beschäftigen im vorraus!

Gruß,
Baal

DF6GL

Hallo,

(Ohne Rücksicht auf potentielle Code-Optimierung)


Wirf allen Code bezgl. "cnn" und "rst"  heraus,

Füge ein Argument zur Übergabe eines Form-Objektes ein.
Anstelle "Addnew" wird der Word-Formular-Wert einem Textfeld zugewiesen.


Sub GetWordData(Ich as Form)
.
.
.
Ich!Title = = doc.FormFields("WordTitle").Result
.
.
End Sub




Aufruf dann in der Prozedur für das Klickereignis einer Schaltfläche ("btnWordData") im Access-Formular, in dem sich die an die Tabelle gebundenen Textfelder  befinden:

Sub btnWordData_Click()
call GetWordData(Me)
End Sub
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Baal1337

Vielen Dank erstmal!

Code funktioniert und ist jetzt folgendermaßen:
Sub Import_Click()
Call GetWordData(Me)
End Sub

und
Public Sub GetWordData(Ich As Form)
Dim appWord As Word.Application
Dim doc As Word.Document
Dim strDocName As String
Dim blnQuitWord As Boolean

On Error GoTo ErrorHandling

strDocName = InputBox("Enter the absolute path of the Word contract " & _
    "you want to import:", "Import Contract")

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

Ich!Title_entrybox = doc.FormFields("WordTitle").Result
'
doc.Close
If blnQuitWord Then appWord.Quit
MsgBox "Contract Imported!"

Cleanup:
Set doc = Nothing
Set appWord = Nothing
Exit Sub
ErrorHandling:
Select Case Err
Case -2147022986, 429
    Set appWord = CreateObject("Word.Application")
    blnQuitWord = True
    Resume Next
Case 5121, 5174
    MsgBox "You must select a valid Word document. " _
        & "No data imported.", vbOKOnly, _
        "Document Not Found"
Case 5941
    MsgBox "The document you selected does not " _
        & "contain the required form fields. " _
        & "No data imported.", vbOKOnly, _
        "Fields Not Found"
Case Else
    MsgBox Err & ": " & Err.Description
End Select
GoTo Cleanup
End Sub


Könnt ich dich noch kurz was zum Verständniss fragen?
Warum wird im Button Click Ereigniss GetWordData(me) aufgerufen udn nicht GetWordData(Ich) ?
Und warum muss es nicht "Ich as Form_Formluar" heißen beim aufrufen der Prozedur? Woher weiß er denn überhaupt jetzt welches Formlar gemeint ist? Einfach dadurch dass ich es über den Button aufrufe?

Vielen Dank ich hab mir daran bestimmt schon seit einigen Tagen die Zähne ausgebissen.
Als nächstes kommt dann versuchen alle Felder inklusive Checkboxen und Dropdown Felder einzufügen. Mal sehen wie das dann funktioniert...

Gruß,
Baal

DF6GL

HAllo,



Warum wird im Button Click Ereigniss GetWordData(me) aufgerufen udn nicht GetWordData(Ich) ?


"ich" ist das Prozedur-Argument und als Datentyp "Form" deklariert.
"Me" ist der dazu gehörende Übergabeparameter an die Routine bei deren Aufruf .

"Me" ist ein Schlüsselwort und definiert als das Form-Objekt, in dem der Code gerade abläuft.

"Ich as Form_Formular" ist kein gültiger Datentyp.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access