2017-09-06 1 views
0

Ich habe wirklich etwas Hilfe! Hier ist ein Link zu einem Google Drive-Zip der Access-Datenbank, mit der ich kämpfe. https://drive.google.com/file/d/0BwjnhQS2X7_Qamt4clFLc1Ztb2c/view?usp=sharingMs-Access Form Datenexport nach Word

Also, was ich habe, ist eine Access-Datenbank, bestehend aus ein paar Tabellen und ein Formular und einige Unterformen. Die Datenbankinformationen werden über ein von mir erstelltes Formular in die Tabellen eingegeben. Im Beispiel heißt das Formular "Datenbank". Dieses Formular exportiert in ein Word-Dokument, Felder in der Datenbank gehen zu den Lesezeichen im Word-Dokument. Das funktioniert bisher sehr gut.

In der Anlage gibt es eine "Vorlage" Ordner mit dem ursprünglichen Word-Dokument, wenn der Code ausgeführt wird, speichert das ausgefüllte Formular in den Ordner "generierte" - funktioniert wie ein Charme. Es ist eine sehr lange Form für Anwendungen für Likörlizenzen.

So füllen Sie das Formular in Zugriff, speichert es in den Tabellen und exportiert die Daten in das Word-Vorlage-Dokument.

Das Problem, das ich habe, ist, dass es ein Unterformular auf Registerkarte 8 des Formulars gibt, wo "Director-Details" gespeichert sind. Es kann eine beliebige Anzahl von Direktoren pro Antrag geben. Es ist mir gelungen, auf die Daten in der Tabelle des Unterformulars zuzugreifen, aber ich habe keine Ahnung, wie die Daten in dieser Tabelle durchlaufen werden, um alle Informationen zu erhalten, die nur für diese Anwendung und nicht für andere Anwendungen relevant sind. Es gibt eine Beziehung zwischen der Director-Detailtabelle und der Anwendungsdetaillentabelle (dies ist die Haupttabelle), und ich verwende ein von mir erstelltes Anwendungsidentifikationsfeld und "ACNumber", das für jede Anwendung einzigartig ist. Auf dem Formular befindet sich eine Combobox, die die Anwendung auswählt, und das Formular und die Unterformulare zeigen die richtigen Daten an, wenn Sie sie auswählen.

Der andere Teil des Problems ist, wie kann ich dies zu Wort ausgeben? Ein Lesezeichen funktioniert nicht, weil alle Felder wiederholt werden. Gibt es eine Möglichkeit, dass alle Dateneinträge zu einem einzigen Lesezeichen in einem Textfeld mit den Etiketten ausgegeben werden können?

Dies ist, wie es auf dem Word-Dokument Form aussieht:

(Erste Person)
Vollständiger Name: generieren von 5.4 (a) aus der Datenbank Physikalische Adresse: generieren von 5.4 (b) aus der Datenbank Postleitzahl: generieren aus Artikel 5.4 (c) aus der Datenbank Postanschrift: generieren aus Artikel 5.4 (d) aus der Datenbank Postleitzahl: generieren aus Artikel 5.4 (e) aus der Datenbank Identitätsnummer: generieren aus Artikel 5.4 (f) aus der Datenbank

(Mehr pe rsons zu ergänzen, wenn nötig)

Ok, ich hoffe, das beschreibt mein Problem genau. Ich habe versucht alle Arten, um das funktioniert zu bekommen, aber es ist über mich hinaus, bitte helfen Sie Jungs !!! Unten ist der Code, den ich benutze: (die Schleife für das Unterformular funktioniert nicht, aber ein Eintrag aus dieser Tabelle wird in die aktuell vorhandenen Lesezeichen exportiert) Ich habe versucht, alle Arten, um das funktioniert zu bekommen, aber es ist mir nicht möglich, bitte hilf den Jungs !!!


`Private Sub ExportToWord_Click() 

'Print customer slip for current customer. 
    Dim appWord As Word.Application 
    Dim doc As Word.Document 
    Dim drst As Recordset 
    Set drst = CurrentDb.OpenRecordset(Name:="62 Other Interests", Type:=RecordsetTypeEnum.dbOpenDynaset) 
    'Avoid error 429, when Word isnt open. 
    On Error Resume Next 
    Err.Clear 
    'Set appWord object variable to running instance of Word. 
    Set appWord = GetObject(, "Word.Application") 

    If Err.Number <> 0 Then 
    'If Word isnt open, create a new instance of Word. 
    Set appWord = New Word.Application 
    End If 
    Set doc = appWord.Documents.Open("C:\forms\templates\Form 3 - Sec 36(1).docx", , True) 
    With doc 
    .Bookmarks("wAppTradingNames").Range.Text = Nz(Me!AppTradingName, "") 
    .Bookmarks("wAppTradingName").Range.Text = Nz(Me!AppTradingName, "") 
    .Bookmarks("wCompanyName").Range.Text = Nz(Me!CompanyName, "") 
    .Bookmarks("wCompanyNumber").Range.Text = Nz(Me!CompanyNumber, "") 
    .Bookmarks("wRAddress1").Range.Text = Nz(Me!RAddress1, "") 
    .Bookmarks("wPostalCode").Range.Text = Nz(Me!PostalCode, "") 
    .Bookmarks("wRPostalAddress1").Range.Text = Nz(Me!RPostalAddress1, "") 
    .Bookmarks("wRPostalCode").Range.Text = Nz(Me!RPostalCode, "") 
    .Bookmarks("wDomicilium1").Range.Text = Nz(Me!Domicilium1, "") 
    .Bookmarks("wDomiciliumCode").Range.Text = Nz(Me!DomiciliumCode, "") 
    .Bookmarks("wDomAfter1").Range.Text = Nz(Me!DomAfter1, "") 
    .Bookmarks("wDomAfterCode").Range.Text = Nz(Me!DomAfterCode, "") 
    .Bookmarks("wTelOffice").Range.Text = Nz(Me!TelOffice, "") 
    .Bookmarks("wTelCell").Range.Text = Nz(Me!TelCell, "") 
    .Bookmarks("wTelHome").Range.Text = Nz(Me!TelHome, "") 
    .Bookmarks("wFaxNumber").Range.Text = Nz(Me!FaxNumber, "") 
    .Bookmarks("wEmail").Range.Text = Nz(Me!Email, "") 
    .Bookmarks("wFIP").Range.Text = Nz(Me!FIP, "") 
    .Bookmarks("wAppLicCat").Range.Text = Nz(Me!AppLicCat, "") 
    .Bookmarks("wLiqourType").Range.Text = Nz(Me!LiqourType, "") 
    .Bookmarks("wAppTradingName").Range.Text = Nz(Me!AppTradingName, "") 
    .Bookmarks("wAppTradingName").Range.Text = Nz(Me!AppTradingName, "") 
    .Bookmarks("wLPAddress").Range.Text = Nz(Me!LPAddress, "") 
    .Bookmarks("wErfNumber").Range.Text = Nz(Me!ErfNumber, "") 
    .Bookmarks("wLPPostalCode").Range.Text = Nz(Me!LPPostalCode, "") 
    .Bookmarks("wLPOwnership").Range.Text = Nz(Me!LPOwnership, "") 
    .Bookmarks("wLPOwnersName").Range.Text = Nz(Me!LpOwnersName, "") 
    .Bookmarks("wLpOwnerAddress").Range.Text = Nz(Me!LpOwnerAddress, "") 
    .Bookmarks("wLpRightOccupation").Range.Text = Nz(Me!LpRightOccupation, "") 
    .Bookmarks("wLPOccDuration").Range.Text = Nz(Me!LPOccDuration, "") 
    .Bookmarks("wLpPremNotErected").Range.Text = Nz(Me!LpPremNotErected, "") 
    .Bookmarks("wLpPremAlterReq").Range.Text = Nz(Me!LpPremAlterReq, "") 
    .Bookmarks("wLpPremAllGood").Range.Text = Nz(Me!LpPremAllGood, "") 
    .Bookmarks("wLpBuildCommence").Range.Text = Nz(Me!LpBuildCommence, "") 
    .Bookmarks("wLpBuildDuration").Range.Text = Nz(Me!LpBuildDuration, "") 
    .Bookmarks("wLpTradingHours").Range.Text = Nz(Me!LpTradingHours, "") 
    .Bookmarks("wLpRenewal").Range.Text = Nz(Me!LpRenewal, "") 
    .Bookmarks("wLpJobsa").Range.Text = Nz(Me!LpJobsa, "") 
    .Bookmarks("wLpJobsB").Range.Text = Nz(Me!LpJobsB, "") 
    .Bookmarks("wLpJobsC").Range.Text = Nz(Me!LpJobsC, "") 
    .Bookmarks("wNNPRegName").Range.Text = Nz(Me!NNPRegName, "") 
    .Bookmarks("wNNPRegNumber").Range.Text = Nz(Me!NNPRegNumber, "") 
    .Bookmarks("wNNPRegDate").Range.Text = Nz(Me!NNPRegDate, "") 
    .Bookmarks("wOtherInterests").Range.Text = Nz(drst!OtherInterests, "") 
    .Visible = True 
    .Activate 
    End With 

    Dim rst As Recordset: Set rst = CurrentDb.OpenRecordset(Name:="5 Director Details", Type:=RecordsetTypeEnum.dbOpenDynaset) 
    'Do While Not rst.EOF 
    With doc 
     .Bookmarks("wPersonLabel").Range.Text = Nz(rst!PersonLabel, "") 
     .Bookmarks("wFullName").Range.Text = Nz(rst!FullName, "") 
     .Bookmarks("wPhAddress").Range.Text = Nz(rst!PhAddress, "") 
     .Bookmarks("wPhCode").Range.Text = Nz(rst!PhCode, "") 
     .Bookmarks("wPAddress").Range.Text = Nz(rst!PAddress, "") 
     .Bookmarks("wPCode").Range.Text = Nz(rst!PCode, "") 
     .Bookmarks("wIdNumber").Range.Text = Nz(rst!IdNumber, "") 
     .Visible = True 
     .Activate 
     rst.MoveNext 
    End With 
    'Loop 

    doc.SaveAs2 "C:\forms\generated\" & Me!ACNumber & "_Form 3 - Sec 36(1).docx" 
    Set doc = Nothing 
    Set appWord = Nothing 
    Exit Sub 

errHandler: 
    MsgBox Err.Number & ": " & Err.Description 

End Sub 


` 
+1

darüber zahlreiche Wege zu gehen sind, wäre die naheliegendste zu mir ein Lesezeichen zu setzen und einen Tisch auf diesem Lesezeichen hinzufügen . Überprüfen Sie [diese MSDN-Seite] (https://msdn.microsoft.com/en-us/library/w1702h4a.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1), um eine Tabelle zu erstellen. und [diese] (https://msdn.microsoft.com/en-us/library/tkf9d64e.aspx), um Werte zu den Zellen der Tabelle hinzuzufügen. Sie können die Tabelle auch in Ihre Vorlage einschließen und der Tabelle in der Schleife eine Zeile hinzufügen. Wenn Sie Probleme damit haben, stellen Sie eine neue spezifische Frage dazu. Deine Frage ist sehr weit gefasst. –

+1

Auch ich würde Word Mail Merge-Funktionalität anstelle von eins nach dem anderen Werte von Re-Cord-Set zu Lesezeichen Text verwenden. –

+0

Danke Eric! Das beantwortet die "Formatierung der Ausgabedaten in der Wortform" schön, ich werde eine Tabelle verwenden. Jetzt muss ich meinen Kopf darum drehen, wie man die Daten in der Teilformtabelle durchläuft, um die Daten auszuwählen und auszugeben, die sich auf die spezifische Anwendung beziehen. Die Tabelle dieses Unterformulars enthält Daten zu vielen einzelnen Formularen/Lizenzanwendungen. Ich muss nur die Einträge abrufen, die nur für die jeweilige Anwendung relevant sind. Ich habe keine Ahnung, wie ich das programmieren soll. – Realhost

Antwort

0

Dies wird Sie in die richtige Richtung. Sie müssen jedoch ein paar Änderungen vornehmen, um Ihre Anforderungen zu erfüllen, z. Fügen Sie alle Ihre Lesezeichen ein, aktualisieren Sie die SQL-Zeichenfolgen und die Datensatzfelder.

Sie müssen auch wenn ein paar Änderungen an Ihrem Word-Dokument machen:

1) eine Tabelle Fügen Sie die Managerdaten (Loop) zu halten. Blenden Sie die Rahmen bei Bedarf aus.
2) Speichern Sie das Dokument als Word-Vorlage (.dotx)

Public Sub ExportToWord() 
    On Error GoTo ErrorTrap 

    Const TemplatePath As String = "C:\forms\templates\Form 3 - Sec 36(1).dotx" 

    'Data 
    Dim rs As DAO.Recordset 
    Set rs = CurrentDb().OpenRecordset("SELECT * FROM TableName WHERE [Criteria]", dbOpenSnapshot) 

    'SaveAs 
    Dim name_ As String 
     name_ = "C:\forms\generated\" & rs![FieldName] & "_Form 3 - Sec 36(1).docx" 

    'Word 
    Dim oWord As Word.Application 
    Set oWord = New Word.Application 
     oWord.Visible = False 

    Dim oDoc As Word.Document 
    Set oDoc = oWord.Documents.Add(TemplatePath) 
    With oDoc 
     .Bookmarks("Bookmark_1").Range.Text = rs![FieldName_1] 
     .Bookmarks("Bookmark_2").Range.Text = rs![FieldName_2] 
     .Bookmarks("Bookmark_3").Range.Text = rs![FieldName_3] 
     '... 
    End With 

     rs.Close 
    Set rs = Nothing 

    'Loop data 
    Set rs = CurrentDb().OpenRecordset("SELECT * FROM TableName WHERE [Criteria]", dbOpenSnapshot) 
    With rs 
     If Not .EOF Then 
      .MoveLast 
      .MoveFirst 
     End If 
    End With 

    Dim idx As Integer 
    For idx = 1 To rs.RecordCount 
     With oDoc.Tables(1) 
      .Cell(idx, 1).Range.Text = rs![FieldName_1] '1st Column 
      .Cell(idx, 2).Range.Text = rs![FieldName_2] '2nd Column 
      .Cell(idx, 3).Range.Text = rs![FieldName_1] '3rd Column 
      '... 
      'add extra rows if required 
      If rs.AbsolutePosition <> rs.RecordCount - 1 Then .Columns(1).Cells.Add 
     End With 
     rs.MoveNext 
    Next idx 

    'Save 
    With oDoc 
     .SaveAs FileName:=name_, FileFormat:=Word.WdSaveFormat.wdFormatXMLDocument 
     .Close SaveChanges:=wdDoNotSaveChanges 
    End With 

Leave: 
    On Error Resume Next 
     rs.Close 
    Set rs = Nothing 
     oWord.Quit 
    Set oWord = Nothing 
    On Error GoTo 0 
    Exit Sub 

ErrorTrap: 
    MsgBox Err.Description, vbCritical, "ExportToWord()" 
    Resume Leave 
End Sub 
+0

Danke Kostas! Ich habe das probiert und habe es meistens funktioniert. Immer noch Probleme mit der Tabelle, aber ich werde eine andere Frage zu diesem speziellen Problem stellen, wenn ich es nicht in Gang bringen kann. Schätzen Sie es – Realhost

+0

Erstellen Sie einfach eine einfache Tabelle mit 7 Spalten und 1 Zeile. Fügen Sie dem Skript die zusätzlichen Spalten hinzu und testen Sie es. –

+0

Ich habe alle Arten versucht, aber immer die Fehlermeldung erhalten - das angeforderte Mitglied der Sammlung existiert nicht – Realhost