Office: VBA-Laienproblem

Helfe beim Thema VBA-Laienproblem in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo liebe Excelianer, ich habe heute zum allerersten Mal in die VBA-Maske von Microsoft Excel hineingeschnuppert, um mir einen Button zum... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Leviathan51, 28. August 2023.

  1. VBA-Laienproblem


    Hallo liebe Excelianer,

    ich habe heute zum allerersten Mal in die VBA-Maske von Microsoft Excel hineingeschnuppert, um mir einen Button zum automatisierten E-Mail-Versand aus Excel zu basteln. Grundsätzlich tut der Code bereits, was er soll: Beim Klick auf den Button öffnet sich ein Outlook-Element mit meinem vorformatierten Text. Auch das Ausfüllen der Platzhalter klappt dabei schon gut.

    Allerdings scheitere ich noch an der Falldefinition für den Versand.

    Ich habe ein Arbeitsplatz mit 500 Zeilen und über 100 Spalten, das in Zeile 1-2 Rahmendaten und in Zeile 3 verschiedene E-Mail-Adressen enthält. Die Spalten A und B sind ebenfalls mit Rahmendaten befüllt, C enthält Text, der für Platzhalter im Mail-Text eingesetzt wird. In Spalte D stehen abermals Rahmendaten. Alle anderen Zellen (E4:DQ500) können entweder leer oder mit "x" befüllt sein. Ich möchte nun erreichen, dass die E-Mail-Adresse in Zeile 3, sobald eine Zelle oder mehrere Zellen der gleichen Spalte "x" enthält/enthalten, als Empfänger des Outlook-Elements / mehrerer Outlook-Elemente eingesetzt wird - das mag mir als, wie gesagt, absolutem VBA-Neuling, der gestern noch nicht wusste, wie man die Entwicklertools überhaupt nutzt, aber nicht gelingen.

    Ich habe eine Beispieldatei angehängt (nicht als xlsm) und meine "Teilerfolge" beziehen sich auf diesen Code:

    ****
    Option Explicit



    Sub BtnSend()

    Send_Email

    End Sub


    Private Sub Send_Email()

    Dim sTitle As String

    sTitle = "Aufgabenerfüllung"


    Dim sTemplate As String

    sTemplate = Sheets("Textvorlage").Shapes(1).TextFrame2.TextRange.Text


    Dim app_Outlook As Outlook.Application

    Set app_Outlook = New Outlook.Application


    Dim objEmail As Outlook.MailItem


    Dim sEmail_Address As String

    Dim iRow As Integer

    For iRow = 4 To 10

    If Cells(iRow, 5) = "x" Then

    sEmail_Address = Range("G3")



    End If



    Dim Aufgaben As String

    Dim iColumn As Integer

    For iColumn = 5 To 10

    If Cells(iColumn, 7) = "x" Then

    Aufgaben = Cells(iColumn, 3)



    Dim sHTML As String

    sHTML = Replace(sTemplate, “Aufgabe z”, Aufgabe xy)



    Set objEmail = app_Outlook.CreateItem(olMailItem)

    objEmail.To = sEmail_Address

    objEmail.Subject = sTitle

    objEmail.Body = sHTML

    objEmail.Display False

    'objEmail.Send



    End If

    Next

    Next


    Set objEmail = Nothing

    Set app_Outlook = Nothing


    MsgBox "Alert Mails created", vbInformation, "Done"

    End Sub

    ***

    Es hakt mit großer Sicherheit bei den Spalten- und Reihenzuweisungen... aber ich komme leider auf keinen grünen Zweig :/
    Ich bin mir sicher, dass der ein oder andere einen eleganteren Code-Aufbau im Kopf hat, würde aber, sofern es irgendwie möglich ist, zunächst gern (nah) bei dieser Struktur bleiben.
     
    Leviathan51, 28. August 2023
    #1
  2. Lutz Fricke Erfahrener User
    Hallo Leviathan51,

    in der äußeren For-Next-Schleife (iRow) läufst Du nur Spalte 5 durch, aber nicht die übrigen Spalten.
    In der inneren Schleife läuft dann alles durcheinander, weil Du iColumns und iRow durcheinanderschmeißt.
    zusätzlich ist in der Replace-Anweisung die Variable "Aufgabe xy" verkehrt.

    Probier doch mal so:
    Code:
    Private Sub Send_Email()
    
    Dim sTitle As String
    sTitle = "Aufgabenerfüllung"
    
    Dim sTemplate As String
    sTemplate = Sheets("Textvorlage").Shapes(1).TextFrame2.TextRange.Text
    
    Dim app_Outlook As Outlook.Application
    Set app_Outlook = New Outlook.Application
    
    Dim objEmail As Outlook.MailItem
    Dim sEmail_Address As String
    
    Dim iRow As Integer
    Dim Aufgaben As String
    Dim iColumn As Integer
    
    For iColumn = 5 To 10
        For iRow = 4 To 10
            If Cells(iRow, iColumn) = "x" Then
                    sEmail_Address = Cells(3, iColumn)
                    Aufgaben = Cells(iRow, 3)
            End If
        Next iRow
    Next iColumn
    
    Dim sHTML As String
    sHTML = Replace(sTemplate, "Aufgabe z", Aufgabe)
    
    Set objEmail = app_Outlook.CreateItem(olMailItem)
    objEmail.To = sEmail_Address
    objEmail.Subject = sTitle
    objEmail.Body = sHTML
    objEmail.Display False
    'objEmail.Send
    
    Set objEmail = Nothing
    Set app_Outlook = Nothing
    
    MsgBox "Alert Mails created", vbInformation, "Done"
    
    End Sub
    Nachdem mir die richtigen Vorlagen fehlen, kann ich es leider nicht testen.

    Natürlich kommen dann noch Feinheiten hinzu:
    • Mailversand nur bei gefundenem "x" (jetzt wird immer eine Mail erstellt).
    • Eine Mail pro Aufgabe oder eine Mail für alle Aufgaben pro Spalte?
    • Oder eine Mail pro Aufgabe an alle Mailadressen dieser Aufgabe?
    Aber zum weiteren Tüfteln sollte es reichen.

    Gruß,
    Lutz
     
    Lutz Fricke, 28. August 2023
    #2
  3. Hallo Lutz,

    vielen lieben Dank für Zeit und Rat. Die meisten der Probleme hat dein Vorschlag sehr gut in den Griff bekommen und die übrigen sind vermutlich in den von dir erwähnten Feinheiten zu suchen. Während zuvor viel zu viele und zu großen Teilen identische E-Mails erstellt wurden, was vermutlich daran lag, dass, wie du schreibst, alles kreuz und quer durcheinander schleifte, wird aktuell unabhängig von der Anzahl der testweisen x-Einträge lediglich eine E-Mail erstellt.

    Es sieht so aus, als würde der Code dabei nach dem x mit dem höchsten Spaltenwert suchen. Das Ziel ist, für jedes x eine eigene E-Mail zu erstellen: wenn in F5 und F7 ein x steht sollte der Adressat in F3 also zwei E-Mails mit den jeweils angepassten Informationen aus den Textplatzhaltern (Aufgaben) erhalten (die funktionieren jetzt super :)). Ich versuche mal mein Glück, speichere deinen Code aber vorher guuut ab - danke nochmal!
     
    Leviathan51, 29. August 2023
    #3
  4. Lutz Fricke Erfahrener User

    VBA-Laienproblem

    Dann probier doch mal so:
    Code:
    Private Sub Send_Email()
    
    Dim sTitle As String
    Dim sTemplate As String
    Dim app_Outlook As Outlook.Application
    
    Dim objEmail As Outlook.MailItem
    Dim sEmail_Address As String
    
    Dim iRow As Integer
    Dim Aufgaben As String
    Dim iColumn As Integer
    
    Dim sHTML As String
    
    sTitle = "Aufgabenerfüllung"
    sTemplate = Sheets("Textvorlage").Shapes(1).TextFrame2.TextRange.Text
    
    Set app_Outlook = New Outlook.Application
    
    For iColumn = 5 To 10
        For iRow = 4 To 10
            If Cells(iRow, iColumn) = "x" Then
                sEmail_Address = Cells(3, iColumn)
                Aufgaben = Cells(iRow, 3)
    
                sHTML = Replace(sTemplate, "Aufgabe z", Aufgabe)
            
                Set objEmail = app_Outlook.CreateItem(olMailItem)
                objEmail.To = sEmail_Address
                objEmail.Subject = sTitle
                objEmail.Body = sHTML
                objEmail.Display False
                'objEmail.Send
                
                Set objEmail = Nothing
                
                MsgBox "Alert Mails created", vbInformation, "Done"
            End If
        Next iRow
    Next iColumn
    
    Set app_Outlook = Nothing
    
    End Sub
    Ich habe die ganzen Dim's an den Anfang gesetzt (macht man so der Übersichtlichkeit wegen) und die Erstellung der Mails in die innere Schleife. Bei jedem "x" wird jetzt eine Mail mit der Aufgabe an den Adressaten erstellt.

    Gruß,
    Lutz
     
    Lutz Fricke, 29. August 2023
    #4
  5. Hallo nochmal,

    Lutz, du bist super! Funktioniert astrein.

    Noch einen schönen Tag!
     
    Leviathan51, 29. August 2023
    #5
Thema:

VBA-Laienproblem

Die Seite wird geladen...
  1. VBA-Laienproblem - Similar Threads - VBA Laienproblem

  2. VBA-Code überspringt einzelne Zeilen

    in Microsoft Word Hilfe
    VBA-Code überspringt einzelne Zeilen: Liebe Forumsgemeinde, ich habe einen vba-code in word. Ganz grob, es wird eine Word-Tabelle 1x1 erzeugt, dort wird ein Bild eingefügt, anschließend wird die Tabellegröße auf die Bildgröße...
  3. VBA - Ausblenden aller Tabellenblätter außer X

    in Microsoft Excel Hilfe
    VBA - Ausblenden aller Tabellenblätter außer X: Guten Morgen, ich bin ziemlicher VBA Neuling und habe aktuell Probleme mit einer Datei, die ich entwickelt habe. Zu der Datei: Es handelt sich um Daten, auf die lediglich ein bestimmter...
  4. Kamera in Excel einbinden und per vba Fotos erstellen

    in Microsoft Excel Hilfe
    Kamera in Excel einbinden und per vba Fotos erstellen: Kamera in Excel einbinden Hallo, ich suche einen Code für eine UserForm, mit der ich die integrierte Kamera des WinPC in der UserForm anzeigen lassen kann und davon ein Bild sichern kann.
  5. Liste aller Comboboxen im Sheet

    in Microsoft Excel Hilfe
    Liste aller Comboboxen im Sheet: Hallo allerseits, Ich möchte alle Comboboxen eines Worksheets mit VBA auslesen und finde nicht den Namen der Liste in den Sheet-Eigenschaften, in der die Comboboxen gespeichert sind. Wer weiß, wo...
  6. Pivot Tabelle: Quelle per VBA verändern

    in Microsoft Excel Hilfe
    Pivot Tabelle: Quelle per VBA verändern: Hi all, gibt es eine Möglichkeit, wie ich die Quelle einer Pivot Tabelle mit einem Klick aktualisieren kann? 1) Beispiel Quelle: [Datum_Dateiname.xlsx]Tabelle1!$A:$AA 2) Beispiel wie es je nach...
  7. Auswertung aus mehreren Registern erstellen (nur die Gelbmarkierten oder mit Datum von akt. Woche)

    in Microsoft Excel Hilfe
    Auswertung aus mehreren Registern erstellen (nur die Gelbmarkierten oder mit Datum von akt. Woche): Hallo zusammen, ich arbeite mit einer Excel-Arbeitsmappe, die mehrere Tabellenblätter enthält. Jedes Blatt dokumentiert bestimmte Vorgänge, und die Struktur der Daten ist in allen Blättern...
  8. VBA in einer Zeile zu lang

    in Microsoft Excel Hilfe
    VBA in einer Zeile zu lang: Moin, mein VBA Code ist für eine Zeile zu lang. Kann mir einer helfen wie ich den auf 2 Zeilen aufteilen Kann? arrSchuhDaten = Array(Range("A6"), Range("F6"), Range("J6"), Range("A7"),...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden