Listbox mit MailMerge Datenverknüpfung

  • Word

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    Listbox mit MailMerge Datenverknüpfung

    Guten Abend,

    ich bin auf der Suche nach einer Möglichkeit, die Mergeviewdaten in einer Listbox anzeigen zu lassen und auch über die UF dann zu manipulieren.
    Kennt sich da jemand aus oder hat eine Quelle dazu?

    Freue mich über Feedback :)
    Ich oute mich als Unwissender. Was is'n n MergeView? Google liefert mir auf Anhieb nix. Meine Phantansie gibt auch nichts her.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Ach was ein Käse ich geschrieben habe, sorry... MailMerge Felder meine ich.
    Link

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sam85“ ()

    Bevor ich jetzt mich erstmal mühsam einarbeite, um ein sinnvolles MailMerge-Objekt im richtigen Kontext zu erstellen: Kannst Du irgendwas vorgefertigtes hochladen oder einen Erstellungscode posten?
    Aber wenn ich mir das so anschaue: Als Objekt hat MailMerge doch Eigenschaften. Lassen die sich nicht VBA-Option-Strict-Off-mäßig einfach in eine ListBox packen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    ich hoffe das reicht als Test aus. Die Access Datei habe ich automatisch aus Word erstellt und ich denke darauf bezieht sich dann auch das MailMerge-Object.
    Erstellungscode habe ich keinen, da ich ja erstmal nur auf der Suche nach einem Ansatz war. Ich hab mir auch extra das Buch "richtig einsteigen Word VBA 2007 bis 2013" gegönnt...aber da habe ich dazu auch nichts gefunden. :(
    Ist dann doch etwas anders als in Excel...
    Dateien
    • test.rar

      (65,72 kB, 98 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sam85“ ()

    1. Im Word-Dokument sind konkrete Arztdaten drin, aber wurscht.
    2. Nach "Für eventuelle Rückfragen" kommt kein Komma, aber auch wurscht.
    3. Zum eigentlichen Problem: MailMerge.Fields gibt laut MSDN ein Feld wieder, in dem alle Seriendruckfelder drin sind. Was willst Du nun mit denen machen? Was soll in die ListBox? Was willst Du an jener Auflistung ändern? Was willst Du mit all dem überhaupt bezwecken?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    zu 1. Findet man bei Google, ist nur Anschrift...also kein Datenschutzgeheimnis oder? (Hab es deswegen drin gelassen). EDIT: Hab es nun angepasst.
    zu 2. Danke für den Grammatik Hinweis :).
    zu 3. Ich will die MailMerge Felder in der ListBox darstellen und dann einzelne TextBoxen dazu erstellen, um weitere Einträge zu erzeugen. Gleichzeitig soll der ausgewählte Eintrag in der Listbox zum Aktuellen Serienbrief Eintrag werden. (Derzeit benutze ich einfach Pfeile um die Einträge zu wechseln. (EDIT: Bzw. war das eine Methode die ich vorher verwendet habe.)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sam85“ ()

    Ach, jetzt kapier ich endlich, worum es geht und was diese MailMerge-Fields sind!
    Da ich jetzt zumindest einen Schritt weiter bin: Willst Du die Feldernamen in die ListBox bekommen (MailMerge.Fields(0).Code) oder deren Inhalt, der ja eigentlich der Datenbank zu entnehmen ist?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Den Inhalt der Datenbank. Ohne VBA würde ich ja einfach die Liste manuell erweitern aber der User soll schnell und unkompliziert die Datenbank erweitern und den Datensatz auswählen können. Und das SelectedIndex von der ListBox wäre sozusagen das auswählen des Datensatzes, der dann auf dem Word-Dokument zu sehen ist.
    Ich hab mir das jetzt mal angeschaut und versuche mich jetzt an der Property DataSource aber so richtig grün werde ich damit nicht.
    Hat da schon jemand Erfahrungen mit gemacht?

    Link

    Visual Basic-Quellcode

    1. Set ad = ActiveDocument
    2. With lb_data
    3. .List = ad.MailMerge.DataSource
    4. End With


    EDIT:
    @VaporiZed
    Habe das mal versucht aber bringt mir nur eine Spalte mit 5 Zeilen in denen jeweils 59 steht (ich vermute die Anzahl benutzter Felder im Datensatz)

    Visual Basic-Quellcode

    1. x = ad.MailMerge.Fields.Count
    2. For i = 1 To x
    3. lb_data.AddItem ad.MailMerge.Fields(i)
    4. Next i


    Edit 2:
    Und so bekomme ich die Mergefield Bezeichnung.

    Visual Basic-Quellcode

    1. For i = 1 To x
    2. lb_data.AddItem ad.MailMerge.Fields(i).Code
    3. Next i

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    Falls es noch jemanden interessiert, meine aktuelle Lösung dazu. So werden die Daten aus der .MdB Datei in die ListBox in Word geladen.
    Nur den Header habe ich noch nicht hinbekommen, vielleicht kann mir dazu jemand was sagen. Und wie ich das hinzufügen aus der Word Datei (bzw. Userform) in die mdb. Datei umsetzen kann.

    Ich denke der Weg den ich zuerst überlegt hatte, war so nicht möglich aber belehrt mich ruhig eines besseren. :)

    Visual Basic-Quellcode

    1. Sub connex()
    2. Dim cn, rs As Object
    3. Dim str, csql As String
    4. Dim c As Control
    5. Set cn = CreateObject("ADODB.Connection")
    6. Set c = Me.lb_data
    7. str = "C:\Desktop\Quellen\DOCs.mdb"
    8. With cn
    9. .Provider = "Microsoft.ACE.OLEDB.12.0"
    10. .Properties("Data Source") = str
    11. .Open
    12. End With
    13. csql = "SELECT * FROM Office_Address_List"
    14. Set rs = CreateObject("ADODB.Recordset")
    15. rs.Open csql, cn, adOpenKeyset, adLockReadOnly
    16. While Not rs.EOF
    17. With c
    18. .ColumnCount = 5
    19. .ColumnHeads = True
    20. .AddItem
    21. .List(.ListCount - 1, 0) = rs.Fields("Firmenname")
    22. .List(.ListCount - 1, 1) = rs.Fields("Nachname")
    23. .List(.ListCount - 1, 2) = rs.Fields("Adresszeile 1")
    24. .List(.ListCount - 1, 3) = rs.Fields("Postleitzahl")
    25. .List(.ListCount - 1, 4) = rs.Fields("Ort")
    26. End With
    27. rs.MoveNext
    28. Wend
    29. rs.Close
    30. Set rs = Nothing
    31. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sam85“ ()

    Ich habe jetzt folgende Vorgehensweise ausfindig gemacht, um einen Eintrag zu bearbeiten/hinzuzufügen, kann mir aber auf etwas keinen Reim machen:
    Gefunden habe ich es hier Link
    Ich kann den Wert bei ActiveConnection = cnT also das cnT nicht zuordnen.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim Rs As New ADODB.Recordset
    3. Private Sub Form_Load()
    4. cnSet
    5. With Rs
    6. .ActiveConnection = cnT
    7. .CursorLocation = adUseClient
    8. .CursorType = adOpenKeyset
    9. .LockType = adLockBatchOptimistic
    10. .Open "tblTest"
    11. .MoveFirst
    12. End With
    13. End Sub


    Die Verbindung wird aktuell so hergestellt:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub conMDB()
    2. Dim cn As ADODB.Connection 'Object
    3. Dim rs As ADODB.Recordset 'Object
    4. Dim str, csql As String
    5. Dim c As Control
    6. Set cn = CreateObject("ADODB.Connection")
    7. Set c = Me.lb_data
    8. str = "C:\Desktop\Quellen\DOCs.mdb"
    9. With cn
    10. .CursorLocation = adUseClient
    11. .Mode = adModeReadWrite
    12. .Provider = "Microsoft.ACE.OLEDB.12.0"
    13. .ConnectionString = "Data Source=" & str
    14. .Open
    15. End With
    16. csql = "SELECT * FROM Office_Address_List"
    17. Set rs = CreateObject("ADODB.Recordset")
    18. rs.Open csql, cn, adOpenKeyset, adLockBatchOptimistic
    19. i = rs.Fields.Count
    20. While Not rs.EOF
    21. With c
    22. .ColumnCount = i
    23. .ColumnHeads = True
    24. .AddItem
    25. .List(.ListCount - 1, 0) = rs.Fields("Praxis")
    26. .List(.ListCount - 1, 1) = rs.Fields("Nachname")
    27. .List(.ListCount - 1, 2) = rs.Fields("Anschrift")
    28. .List(.ListCount - 1, 3) = rs.Fields("Postleitzahl")
    29. .List(.ListCount - 1, 4) = rs.Fields("Ort")
    30. End With
    31. rs.MoveNext
    32. Wend
    33. rs.Close
    34. Set rs = Nothing
    35. End Sub


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    Hab kurz den Artikel hinter dem Link überflogen. Das dürfte ein Schreibfehler sein. ist bestimmt cn, also die Verbindung. Er hat an späterer Stelle auch nur cn verwendet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Und was ist dann mit cn gemeint (also klar die Connection) aber was genau ist gemeint? Der Pfad zur Datei oder einfach nur die Verbindung zur ADODB.Connection?

    Also wäre das einfach so?

    Visual Basic-Quellcode

    1. Dim cn as ADODB.Connection
    2. rs.ActiveConnection = cn


    EDIT:

    Ich lass es jetzt so laufen aber bei rs!Index = i Kommt der Laufzeitfehler 3265 "Ein Objekt, das dem angeforderten Namen oder dem Ordinalverweis entspricht, kann nicht gefunden werden." Was muss ich anders machen?

    Visual Basic-Quellcode

    1. Private Sub btn_add_Click()
    2. Dim cn As ADODB.Connection
    3. Dim rs As New ADODB.Recordset
    4. Dim str, csql As String
    5. Set cn = CreateObject("ADODB.Connection")
    6. str = "C:\Desktop\Quellen\DOCs.mdb"
    7. csql = "SELECT * FROM Office_Address_List"
    8. With cn
    9. .CursorLocation = adUseClient
    10. .Mode = adModeReadWrite
    11. .Provider = "Microsoft.ACE.OLEDB.12.0"
    12. .ConnectionString = "Data Source=" & str
    13. .Open
    14. End With
    15. With rs
    16. .ActiveConnection = cn
    17. .CursorLocation = adUseClient
    18. .CursorType = adOpenKeyset
    19. .LockType = adLockBatchOptimistic
    20. .Open csql
    21. .MoveFirst
    22. End With
    23. For i = 0 To rs.RecordCount - 1
    24. rs!Index = i
    25. rs.MoveNext
    26. Next i

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sam85“ ()

    Aktiv wäre sie mit dem zuletzt geposteten Code zwar nicht, aber Du hast ja schon das Objekt bei "Die Verbindung wird aktuell so hergestellt:" Zeile#12-#18 initialisiert, also die Verbindung aufgebaut. Sollte damit eigentlich klappen. Aber: Das ist Spekulatius. Habe gerade keine Möglichkeiten, meine dreisten Behauptungen zu untermauern.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    cnT ist eine bereits geöffnete Verbindung.
    Es gibt auf der Seite auch ein Beispiel Erstellen ohne Connection.

    Nachdem du den Beitrag editiert hast, ist der Hinweis hinfällig.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Das aus Zeile 12-18 läuft unter dem UserForm_Initialize...und wenn die Verbindungsdeklaration von dort bereits genügt, kann ich sie im Button_add weglassen.
    Wenn ich das tue kommt der Laufzeitfehler 3709 "Die Verbindung kann nicht verwendet werden, um diesen Vorgang auszuführen. Sie ist entweder geschlossen oder in diesem Zusammenhang ungültig."
    Nun ich bin geduldig falls du oder jemand anderes weiß, was ich anders machen muss. :)

    EDIT: Muss ich das Objekt noch irgendwie "öffnen"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sam85“ ()

    @petaod
    Ok wenn ich dann mit der Verbindung soweit bin, wie kann ich in der MdB aus Word heraus Datensätze hinzufügen?

    Der Code stand da auf der Seite in Verbindung mit der Änderung von Einträgen. Aber irgendwie fehlt mir noch das Verständnis dafür. X/

    Visual Basic-Quellcode

    1. Private Sub btn_add_Click()
    2. For i = 0 To rs.RecordCount - 1
    3. rs!Index = i
    4. rs.MoveNext
    5. Next i


    Initalisierung in der UF erfolgt jetzt so:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub conMDB()
    2. Dim cn As New ADODB.Connection 'Object
    3. Dim rs As ADODB.Recordset 'Object
    4. Dim str, csql As String
    5. Dim c As Control
    6. Set cn = CreateObject("ADODB.Connection")
    7. Set c = Me.lb_data
    8. str = "C:\Desktop\Quellen\DOCs.mdb"
    9. With cn
    10. .CursorLocation = adUseClient
    11. .Mode = adModeReadWrite
    12. .Provider = "Microsoft.ACE.OLEDB.12.0"
    13. .ConnectionString = "Data Source=" & str
    14. .Open
    15. End With
    16. csql = "SELECT * FROM Office_Address_List"
    17. Set rs = CreateObject("ADODB.Recordset")
    18. rs.Open csql, cn, adOpenKeyset, adLockBatchOptimistic
    19. i = rs.Fields.Count
    20. While Not rs.EOF
    21. With c
    22. .ColumnCount = i
    23. .ColumnHeads = True
    24. .AddItem
    25. .List(.ListCount - 1, 0) = rs.Fields("Praxis")
    26. .List(.ListCount - 1, 1) = rs.Fields("Nachname")
    27. .List(.ListCount - 1, 2) = rs.Fields("Anschrift")
    28. .List(.ListCount - 1, 3) = rs.Fields("Postleitzahl")
    29. .List(.ListCount - 1, 4) = rs.Fields("Ort")
    30. End With
    31. rs.MoveNext
    32. Wend
    33. rs.Close
    34. Set rs = Nothing
    35. With rs
    36. .ActiveConnection = cn
    37. .CursorLocation = adUseClient
    38. .CursorType = adOpenKeyset
    39. .LockType = adLockBatchOptimistic
    40. .Open csql, cn, adOpenKeyset, adLockBatchOptimistic
    41. .MoveFirst
    42. End With
    43. End Sub



    EDIT:
    Add erfolgt jetzt so:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub btn_add_Click()
    2. With rs
    3. .AddNew
    4. !Praxis = Me.tb_1.Text
    5. !Nachname = Me.tb_2.Text
    6. !Anschrift = Me.tb_3.Text
    7. !Postleitzahl = Me.tb_4.Text
    8. !Ort = Me.tb_5.Text
    9. .UpdateBatch adAffectAllChapters
    10. End With
    11. Me.lb_data.Clear
    12. Call conMDB
    13. End Sub



    Save erfolgt so:
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub btn_save_Click()
    2. With rs
    3. !Praxis = Me.tb_1.Text
    4. !Nachname = Me.tb_2.Text
    5. !Anschrift = Me.tb_3.Text
    6. !Postleitzahl = Me.tb_4.Text
    7. !Ort = Me.tb_5.Text
    8. .UpdateBatch adAffectAllChapters
    9. .Close
    10. End With
    11. Set rs = Nothing
    12. Me.lb_data.Clear
    13. Call conMDB
    14. End Sub



    Delete so aber nachdem ich ein paar Einträge löschen kommt die Fehlermeldung, dass zu viele Zeilen vom Update betroffen sind. Muss ich da etwas zwischen schalten?
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub btn_del_Click()
    2. Dim x As Long
    3. x = Me.lb_data.ListIndex
    4. With rs
    5. .GetRows (x)
    6. .Delete
    7. .UpdateBatch adAffectAllChapters
    8. End With
    9. Me.lb_data.Clear
    10. Call conMDB
    11. End Sub


    Bilder
    • Fehler.PNG

      6 kB, 451×256, 78 mal angesehen

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „Sam85“ ()