Serienbrief Datenspalten per ComboBox auswählen?

  • Word

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Serienbrief Datenspalten per ComboBox auswählen?

    Hallo Zusammen,

    ich habe eine Excelliste, welche ich in Word als Serienbrief einlese.

    Da ich die Spalten einzeln nach und nach drucken möchte, hier meine Frage.Ist es möglich per ComboBox auf einer UF die Spalten einzeln auszuwählen?
    Der Ablauf wäre wie folgt.
    Auswahl per Combobox der Spalte 1 - komplett drucken
    Auswahl per Combobox der Spalte 2 - komplett drucken

    etc...


    MfG Madde
    Ich bin zu einer Lösung gekommen.
    Für diejenigen, die es interessiert.

    Die 5. Zeile bringt das gewünschte Ergebnis. Mit Angabe des Namens sowie dem vorherigen Löschen des Seriendruckfelds wird sich nur auf die Spalte "Gesamt" bezogen.
    So kann ich mittels Combobox-Auswahl die Spalten einzeln wählen und drucken.

    Quellcode

    1. Sub Gesamt_starten()
    2. Dim strPfad As String
    3. Selection.Delete Unit:=wdCharacter, Count:=1
    4. ActiveDocument.MailMerge.Fields.Add Range:=Selection.Range, Name:="Gesamt"
    5. If ActiveDocument.MailMerge.State < 2 Then
    6. If Not ActiveDocument.MailMerge.MainDocumentType = wdFormLetters Then
    7. ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    8. End If
    9. strPfad = ActiveDocument.Path & Application.PathSeparator & Left(ActiveDocument.Name, Len(ActiveDocument.Name) - 4) & "xls"
    10. ActiveDocument.MailMerge.OpenDataSource Name:=strPfad, ConfirmConversions _
    11. :=False, ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
    12. PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
    13. WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
    14. Connection:="", SQLStatement:="SELECT * FROM `Datenimport$`", SQLStatement1:=""
    15. End If
    16. ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
    17. End Sub


    MfG Madde

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

    Doch nochmal ein Post zu dem Thema.

    Da ich die Spalten nach und nach abarbeite, habe ich das Problem, dass ich Leerfelder habe und diese mit auftauchen. Wie kann ich das vermeiden.
    Beispiel, in Spalte 1 sind 3 Einträge und in Spalte 2 sind es 10 Einträge.
    Nun kann ich beim Einlesen von Spalte 1 bis zum 10. Datensatz durchklicken, obwohl nach dem 3. Satz nichts mehr kommt.

    Wie kann ich das vermeiden? Eventuell mit Filtern?

    MfG Madde
    SQLStatement:="SELECT * FROM `Datenimport$` where `Spalte1`", SQLStatement1:=""

    ...bringt leider nicht den gewünschten Erfolg.
    Es werden neben den 3 gefüllten, leider auch die restlichen 7 "leeren" Daten verarbeitet, da in Spalte 2 eben diese 10 Datensätze sind.

    Madde schrieb:

    where `Spalte1`
    ist auch kein brauchbares SQL-Statement
    Ich dachte eher an so was:

    Visual Basic-Quellcode

    1. ​For i = 1 To 10
    2. SqlStatement = "SELECT * FROM `Datenimport$` WHERE Spalte" & i & "<>"""""
    3. ' hier deinen Mailmerge für die jeweilige Spalte durchführen und dem das SQLStatement übergeben.
    4. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Madde schrieb:

    wo und wie ich das einbauen kann
    Für das wie wirst du hoffentlich keine Hilfe brauchen.
    Wo? Anstatt deines bisherigen MailMerge-Aufrufs (ActiveDocument.MailMerge.OpenDataSource ...).

    Visual Basic-Quellcode

    1. ​For i = 1 To 10
    2. MySqlStatement = "SELECT * FROM `Datenimport$` WHERE Spalte" & i & "<>"""""
    3. ActiveDocument.MailMerge.OpenDataSource Name:=strPfad, SqlStatement:=MySqlStatement '...
    4. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Mein Code sieht nun folgendermaßen aus, wobei ich davon ausgehe, Fehler gemacht zu haben, da es keinerlei Veränderungen in der Ausgabe gibt.


    Quellcode

    1. ​Sub Oberordner_starten()
    2. Dim strPfad As String
    3. Selection.Delete Unit:=wdCharacter, Count:=1
    4. ActiveDocument.MailMerge.Fields.Add Range:=Selection.Range, Name:="Oberordner"
    5. If ActiveDocument.MailMerge.State < 2 Then
    6. If Not ActiveDocument.MailMerge.MainDocumentType = wdFormLetters Then
    7. ActiveDocument.MailMerge.MainDocumentType = wdFormLetters
    8. End If
    9. For i = 1 To 10
    10. strPfad = ActiveDocument.Path & Application.PathSeparator & Left(ActiveDocument.Name, Len(ActiveDocument.Name) - 4) & "xls"
    11. MySqlStatement = "SELECT * FROM `Datenimport$` WHERE Oberordner" & i & "<>"""""
    12. ActiveDocument.MailMerge.OpenDataSource Name:=strPfad, ConfirmConversions _
    13. :=False, ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
    14. PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
    15. WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
    16. Connection:="", SqlStatement:=MySqlStatement, SQLStatement1:=""""
    17. Next
    18. End If
    19. ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
    20. End Sub
    Was geht denn nicht?
    Um den Serienbrief zu erstellen musst du natürlich noch MailMerge.Execute ausführen.

    Visual Basic-Quellcode

    1. Sub Oberordner_starten()
    2. Dim strPfad As String, Merge As MailMerge
    3. Selection.Delete Unit:=wdCharacter, Count:=1 'wofür immer das gut sein mag
    4. Set Merge = ActiveDocument.MailMerge
    5. Merge.Fields.Add Range:=Selection.Range, Name:="Oberordner"
    6. Merge.ViewMailMergeFieldCodes = wdToggle
    7. strPfad = ActiveDocument.Path & Application.PathSeparator & Left(ActiveDocument.Name, Len(ActiveDocument.Name) - 4) & "xls"
    8. For i = 1 To 10
    9. MySqlStatement = "SELECT * FROM `Datenimport$` WHERE Oberordner" & i & "<>"""""
    10. Merge.OpenDataSource Name:=strPfad, ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, Format:=wdOpenFormatAuto, SqlStatement:=MySqlStatement
    11. If Merge.State = wdMainAndDataSource Then Merge.Execute
    12. Next
    13. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Vervollständige den Aufruf von ​Merge.OpenDataSource mit allen notwendigen Parametern.
    Ich habe das gekürzt, um die Übersichtlichkeit im Code zu bekommen.
    Du musst halt testen, was du alles benötigst.

    Ein klein wenig solltest du schon in Eigeninitiative machen.
    Ich habe hier deine Umgebung nicht zum Testen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:


    Ein klein wenig solltest du schon in Eigeninitiative machen.


    Puh, glaube mir, ich beschäftige mich die ganze Zeit damit, nur komme ich nicht zum Ziel, da mir letztlich einfach die Kenntnisse fehlen.
    Ich habe alle Parameter genommen, welche vor den Änderungen im Code verwendet wurden, als die Quelle noch fehlerfrei eingelesen wurde.

    Quellcode

    1. Merge.OpenDataSource Name:=strPfad, ConfirmConversions _
    2. :=False, ReadOnly:=False, LinkToSource:=True, AddToRecentFiles:=False, _
    3. PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
    4. WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, connection:="", SqlStatement:=MySqlStatement

    petaod schrieb:

    Wie ist der Inhalt von MySqlStatement beim ersten und beim zweiten Durchlauf?

    MySqlStatement = "SELECT * FROM `Datenimport$` WHERE Oberordner" & i & "<>"""""

    Welchen Wert hat i, wenn der Dialog aufploppt?

    Es ploppt kein Dialog auf, einzig das Fenster, in welchem ich eine Tabelle auswählen soll, was allerdings leer ist.

    Gibt es denn alternativ die Möglichkeit, die Filter, welche in "Empfängerliste bearbeiten" gesetzt werden können, mit VBA zu generieren, wenn die Spalte angesprochen wird?
    Sprich, beim ansprechen der jeweiligen Spalten zuerst alle Filter löschen und dann auf "Is not Null" setzen.

    MfG Madde
    Wie kommst du eigentlich auf OberOrdner?
    In Post #8 schrieb ich du sollst die Spalte nehmen.
    Deine Spalten heißen doch Spalte1 bis Spalte10.
    Oder wie heißen die?

    Visual Basic-Quellcode

    1. ​MySqlStatement = "SELECT * FROM `Datenimport$` WHERE Spalte" & i & " <> """" "
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Wie kommst du eigentlich auf OberOrdner?
    In Post #8 schrieb ich du sollst die Spalte nehmen.
    Deine Spalten heißen doch Spalte1 bis Spalte10.
    Oder wie heißen die?


    Nein die Spalten heißen nicht Spalte1 bis Spalte10.
    Ich habe mich nicht richtig ausgedrückt. Ich schildere mal im einzelnen worauf ich hinaus will.

    In Excel wird eine Ordnerstruktur eingelesen, diese wird spaltenweise dargestellt. Beginnend bei Spalte 4 ( Oberordner ) Spalte 5 ( 1_Unterordner ) Spalte 6 ( 2_Unterordner)...bis Spalte 12 ( 8_Unterordner ).
    In Spalte 1 ( Gesamt ) werden dann alle Ordner inklusive der Unterordner in Reihenfolge aufgelistet. Hintergrund des Ganzen ist der Ausdruck von Trennblättern einer Ordnerstruktur.
    Insgesamt läuft das auch alles prima, solange es sich um die Gesamtstruktur handelt. Will man nun aber einzeln bspw. den 2_Unterordner drucken, wird in Word die Gesamtzahl angezeigt, sodass
    eben auch die leeren Datensätze mit auftauchen und diese mitgedruckt werden würden.
    Für jede Ebene habe ich ein Modul, da die Seriendruckfelder alle an der gleichen Stelle liegen. Daher auch diese Codezeilen...

    Quellcode

    1. Selection.Delete Unit:=wdCharacter, Count:=1
    2. ActiveDocument.MailMerge.Fields.Add Range:=Selection.Range, Name:="Gesamt"

    Es wird das aktuelle Seriendruckfeld gelöscht und das Neue eingesetzt.
    Der Wechsel zwischen den Spalten klappt so auch gut aber eben immer mit der vollen Datensatzanzahl.

    Ich hoffe, ich konnte mein Anliegen etwas besser beleuchten.