|  
                                             Wie immer viel Spielraum für Interpretationen. 
Meine Interpretation wie folgt: 
 
In ein allgemeines Modul: 
Option Explicit
Type typDatensatz
    Nachname As String
    Vorname As String
End Type
'
Sub main(ByRef rngTarget As Excel.Range)
    With ThisWorkbook.Worksheets("Mail").Cells(Rows.Count, "B").End(xlUp)
        .Offset(1, 0).Value = getDatensatz(rngTarget.Row).Nachname
        'TODO Vorname
    End With
End Sub
Function getDatensatz(ByVal lngZeile As Long) As typDatensatz
    With getDatensatz
        .Nachname = ThisWorkbook.Worksheets("Eingabe").Cells(lngZeile, "B").Value
        'TODO Vorname
    End With
End Function
 
In das Arbeitsblatt "Eingabe": 
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Columns(1)) Is Nothing Then
        Call main(Target)
    End If
End Sub
 
  
Hinweise: 
Es läuft derzeit alles in einer Mappe ab. 
Die Mappe stellt zwei Arbeitsblätter: Eingabe und Mail. 
Das Ausgliedern in zwei Mappen, sowei eine Fehlerbehandlung, überlasse Ich Dir ;) 
  
Hinwei2: 
Ob Du den With-Rahmen um den benutzerdefinierten Datentyp, oder der Zellermittlung stellst, bleibt Dir überlassen. 
Wenn Deine Datensätze in Ihrer Reihenfolge 1:1 übertragen werden können, genügt eine einfache Wertzuweisung. Auch wieder eine Frage der Interpretation. 
  
 
  
Habe fertig ... bin dann mal :winkend: raus :) 
  
     |