Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Serienbrief über VBA mit Userform

Forumthread: Serienbrief über VBA mit Userform

Serienbrief über VBA mit Userform
11.09.2015 19:26:07
AJ
VBA Autodruck
Hallo, ich bastel gerade an einem kleinen Projekt von mir und komme einfach nicht weiter. Es ist eine Art vereinfachter Serienbrief in Excel.
Folgendes Ziel habe ich.
Ich habe eine Userform Oberfläche mit einem Textfeld in dem ich eine Vertragsnummer eingeben kann und ein Button "Vollmacht eintragen" der das ganze startet. Folgendes sollte passieren wenn ich eine Vertragsnummer in das Textfeld eingebe und auf den Button drücke.
1. Die Vertragsnummer wird in die Tabelle "Daten" in Zeile "A1" geschrieben.
2. Über eine Art Sverweise VBA werden die restlichen Spalten die rechts neben der Vertragsnummer stehen ausgefüllt. "Anrede, Vorname, Name, Strasse, PLZ, Ort". Der Sverweis schaut dabei in der Tabelle "Datenpool" nach der Vertragsnummer und den restlichen Daten und füllt diese aus.
3. Die Briefvorlage habe ich als Excel in die Dieser Arbeitsmappe als Tabellenblatt "Vollmacht" eingefügt, so das ich jede Zeile und Spalte in dieser Briefvorlage ansprechen kann.
4. Über einen weiteren Button "Jetzt drucken" werden automatisch alle Briefe mit den Daten aus dem Tabellenblatt "Daten" befüllt und die Briefe werden auf einen definierten Drucker gedruckt.
Bedingungen:
Sollte in Punkt 1 beschrieben A1 bereits beschrieben sein, wird die Vertragsnummer in A2 geschrieben.
Ich habe mir mit viel Hilfe und dem www einige Codes zusammengebastelt.
Code für Schleife, schaut nach was in der letzten Zeile geschrieben wurde und erweitert es
Option Explicit

Function LastRowInOneColumn(Column As String) As Double
'Find the last used row in a Column: column A in this example
Dim LastRow As Long
With ActiveSheet
LastRow = .Cells(.Rows.Count, Column).End(xlUp).row
End With
LastRowInOneColumn = LastRow
End Function

Function LastColumnInOneRow(row As Double) As Double
'Find the last used column in a Row: row 1 in this example
Dim LastCol As Integer
With ActiveSheet
LastCol = .Cells(row, .Columns.Count).End(xlToLeft).Column
End With
LastColumnInOneRow = LastCol
End Function

Code um über die Vertragsnummer im Tabellenblatt "Daten" die restlichen Felder auszufüllen
Option Explicit

Sub test()
Dim z As Long, lz As Long, s As Integer
lz = Range("A65536").End(xlUp).row
If Range("A65536")  "" Then lz = 65536
On Error Resume Next
For z = 2 To lz 'Zeilen
For s = 2 To 20 'Spalten, kann erweitert werden
Select Case (s)
Case 7, 16, 18, 19, 20: 'Felder die in dem Datenpool rausgezogen werden sollen
Cells(z, LastColumnInOneRow(CDbl(z)) + 1).Value = WorksheetFunction.VLookup(Cells(z, 1). _
_
_
_
_
_
Value, Range("SSR"), s, False)
If Err.Number > 0 Then
Err.Clear
Cells(z, s) = "#NV!"
End If
'    Case 7: Cells(z, 4).Value = WorksheetFunction.VLookup(Cells(z, 1).Value, Range("SSR"), s,   _
_
_
_
_
_
False)
Case Else
End Select
Next s
Next z
End Sub

Code um den Brief "Vollmachten" mit den Daten aus "Daten" auszufüllen

Sub brief()
Dim iRow As Integer
Dim i As Integer
Dim strPath As String
strPath = "\\PFAD"
ThisWorkbook.Sheets("Vollmachten").Activate
iRow = LastRowInOneColumn("A")
ThisWorkbook.Sheets("Briefvorlage").Activate
For i = 2 To iRow
ThisWorkbook.Sheets("Daten").Range("B9") = ThisWorkbook.Sheets("Vollmachten").Range("B"  _
_
_
_
_
_
& i) 'Anrede
ThisWorkbook.Sheets("Daten").Range("B10") = ThisWorkbook.Sheets("Vollmachten").Range("e" _
_
_
_
_
_
& i) & " " & ThisWorkbook.Sheets("Vollmachten").Range("d" & i) 'Name
ThisWorkbook.Sheets("Daten").Range("B11") = ThisWorkbook.Sheets("Vollmachten").Range("F" _
_
_
_
_
_
& i) 'Strasse
ThisWorkbook.Sheets("Daten").Range("B12") = ThisWorkbook.Sheets("Vollmachten").Range("G" _
_
_
_
_
_
& i) & " " & ThisWorkbook.Sheets("Vollmachten").Range("H" & i) 'Ort
ThisWorkbook.Sheets("Daten").Range("B28") = "wir nehmen Bezug auf Ihr Schreiben bzw.  _
auf unser Telefonat vom " & ThisWorkbook.Sheets("Vollmachten").Range("I" & i) & " und teilen  _
Ihnen mit, dass " 'Datum
Save_pdf strPath, CStr(ThisWorkbook.Sheets("Vollmachten").Range("A" & i))
Next
End Sub

Code für das drucken bzw. speichern auf PDF, hier als PDF Speicherung

Sub Save_pdf(Name As String)
ChDir "\\PFAD"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"\\PFAD" & Name & ".pdf", Quality:= _
xlQualityMinimum, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
End Sub

Jetzt zu meiner frage, wie bringe ich alles nun zusammen? Als einzelne Codes funktionieren sie auch, ausser der Druckcode und ich weiss nicht wie ich die Userform mit Befehlen anreichre, so das alles gestartet wird.
Ich weiss das ist ziemlich viel, vielleicht bekomme ich ja so einfach ein paar Tipps oder Verbesserungsvorschläge? Oder wohlmöglich gibt es eine viel einfachere Lösung.
LG

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Serienbrief über VBA mit Userform
12.09.2015 07:00:51
AJ
Hallo Werner, du hast vollkommen recht, sehr wertschätzend war das nicht. Hatte erst jetzt gesehen das bereits antworten vorliegen. Vielen Dank dafür. Da mir das von mir hier beschriebene Problem etwas zu durcheinander ist, schliesse ich diese Punkte. Die Lösung mit dem Button klick hilft mir erstmal weiter, so das ich die Funktionen nochmal testen kann um zu schauen wo es hängt.
Vielen Dank erstmal
Lg
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Serienbrief mit VBA und Userform in Excel erstellen


Schritt-für-Schritt-Anleitung

  1. Userform erstellen:

    • Öffne den VBA-Editor (ALT + F11) und füge eine neue Userform hinzu.
    • Füge ein Textfeld für die Eingabe der Vertragsnummer und einen Button hinzu, der die Aktion "Vollmacht eintragen" ausführt.
  2. Vertragsnummer speichern:

    • Im Click-Event des Buttons kannst du den folgenden Code verwenden, um die Vertragsnummer in die Tabelle "Daten" zu schreiben:
    Private Sub btnVollmachtEingeben_Click()
       Dim ws As Worksheet
       Set ws = ThisWorkbook.Sheets("Daten")
    
       Dim lastRow As Long
       lastRow = LastRowInOneColumn("A") + 1
       ws.Cells(lastRow, 1).Value = Me.txtVertragsnummer.Value
    End Sub
  3. VBA VLOOKUP verwenden:

    • Um die restlichen Felder basierend auf der Vertragsnummer auszufüllen, kannst du den VLOOKUP-Befehl verwenden:
    Dim anrede As String
    anrede = Application.WorksheetFunction.VLookup(Me.txtVertragsnummer.Value, ThisWorkbook.Sheets("Datenpool").Range("A:E"), 2, False)
    ws.Cells(lastRow, 2).Value = anrede
  4. Daten in die Briefvorlage einfügen:

    • Fülle die excel briefvorlage mit den gesammelten Informationen:
    With ThisWorkbook.Sheets("Briefvorlage")
       .Range("B9").Value = ws.Cells(lastRow, 2).Value 'Anrede
       ' Weitere Felder entsprechend ausfüllen
    End With
  5. Drucken oder Speichern als PDF:

    • Füge einen weiteren Button hinzu, der den Druckvorgang oder das Speichern als PDF auslöst:
    Private Sub btnDrucken_Click()
       Call Save_pdf(ws.Cells(lastRow, 1).Value)
    End Sub

Häufige Fehler und Lösungen

  • Fehler: #NV! bei VLOOKUP:

    • Stelle sicher, dass die Vertragsnummer in der Tabelle "Datenpool" vorhanden ist. Ansonsten wird #NV! angezeigt. Nutze die Fehlerbehandlung:
    On Error Resume Next
    anrede = Application.WorksheetFunction.VLookup(Me.txtVertragsnummer.Value, ThisWorkbook.Sheets("Datenpool").Range("A:E"), 2, False)
    If Err.Number <> 0 Then
      ws.Cells(lastRow, 2).Value = "Nicht gefunden"
      Err.Clear
    End If
  • Fehler: Druck funktioniert nicht:

    • Überprüfe den Drucker und die Druckereinstellungen. Stelle sicher, dass der richtige Drucker in den Excel-Einstellungen ausgewählt ist.

Alternative Methoden

  • Anstelle einer Userform kannst du auch ein einfaches Eingabefeld in der Tabelle nutzen, um die Vertragsnummer einzugeben. Dies kann die Benutzerfreundlichkeit erhöhen, insbesondere wenn du bereits mit der Excel-Oberfläche vertraut bist.

  • Eine weitere Möglichkeit wäre, die Daten über ein externes Formular zu erfassen und dann in Excel zu importieren.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du die oben genannten Codes zusammenfügen kannst:

Sub Hauptprozedur()
   Call btnVollmachtEingeben_Click
   Call btnDrucken_Click
End Sub

Du kannst diese Prozedur auf einen Button in deiner Userform oder einem Arbeitsblatt zuweisen, um den gesamten Prozess zu starten.


Tipps für Profis

  • Code modularisieren: Halte deinen Code modular, indem du Funktionen und Subroutinen verwendest. Dies erleichtert die Wartung und Fehlerbehebung.

  • Fehlerprotokollierung: Implementiere eine Fehlerprotokollierung, um Probleme schnell zu identifizieren und zu beheben.

  • VBA VLOOKUP optimieren: Wenn du große Datenmengen bearbeitest, kann es sinnvoll sein, die Daten in ein Dictionary zu laden, anstatt VLOOKUP mehrfach anzuwenden, da dies die Geschwindigkeit erhöht.


FAQ: Häufige Fragen

1. Wie kann ich die Userform anpassen? Du kannst die Userform im VBA-Editor anpassen, indem du Steuerelemente wie Textfelder, Buttons und Labels hinzufügst oder änderst.

2. Funktioniert dieser Code in allen Excel-Versionen? Der Code sollte in den meisten modernen Excel-Versionen (ab 2010) funktionieren, jedoch können einige Funktionen in älteren Versionen eingeschränkt sein.

3. Kann ich die Briefvorlage als Word-Dokument speichern? Ja, du kannst den Export als PDF oder Word-Dokument anpassen, indem du die entsprechenden Methoden in VBA verwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige