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 an Office 2016 anpassen

    in Microsoft Excel Hilfe
    VBA an Office 2016 anpassen: Hallo, leider kann ich das von mir erstellte Script auf Arbeit nicht anwenden, da wir dort noch mit 2016 arbeiten. Die fett markierte Zeile wird von Office 2016 nicht erkannt, jmd. eine Idee wie...
  3. VBA eine Mail Empfänger aus Zellen ziehen

    in Microsoft Excel Hilfe
    VBA eine Mail Empfänger aus Zellen ziehen: Hallo, aktuell habe ich alle Mail-Empfänger in einer Zelle (K11) mit Semikolon getrennt stehen. Aktuell schaut es so aus: .To = Range("K11").Value Ziel ist es aber die Empfänger...
  4. Datentabelle per VBA Makro durch Kopieren und Einfügen einer Kopfzeile aufteilen

    in Microsoft Excel Hilfe
    Datentabelle per VBA Makro durch Kopieren und Einfügen einer Kopfzeile aufteilen: Hallo Zusammen, mein erster Beitrag hier, also schon mal Sorry im Voraus, wenn unvollständig beschrieben *:)* Ich habe das Forum schon nach einem brauchbaren Lösungsansatz durchsucht, bin aber...
  5. UserForm zum bearbeiten von Tabellen und speichern

    in Microsoft Excel Hilfe
    UserForm zum bearbeiten von Tabellen und speichern: Guten Tag Ich habe leider ein Problem, das mich zur Verzweiflung bringt. Vielleicht findet hier jemand einen Lösung für mein Problem. Ich bekommen leider einen Laufzeitfehler '1004'. Zur...
  6. Makro/VBA Text in Zahl umwandeln

    in Microsoft Excel Hilfe
    Makro/VBA Text in Zahl umwandeln: Hallo liebes Forum, ich habe eine Frage und bin bisher leider nicht so wirklich fündig geworden :oops: Aber ich bin mir sicher, dass ich hier Hilfe bekomme *;)* In meiner Arbeitsdatei sind...
  7. VBA / Leerzeile mit Checkbox löschen

    in Microsoft Excel Hilfe
    VBA / Leerzeile mit Checkbox löschen: Hallo Möchte gerne in einer Excel-Datei Leerzeilen, welche eine aktiviert Checkbox enthalten per VBA löschen. (Checkbox in der zu löschenden Zeile, sowie allfällig andere, deaktivierte Checkboxen...
  8. VBA Grafik in E-Mail einfügen

    in Microsoft Excel Hilfe
    VBA Grafik in E-Mail einfügen: Hallo zusammen, ich habe mir in verschiedenen Foren einen VBA-Code zusammengesucht, angepasst und entsprechend nutze ich diesen jetzt auch. Hierzu hätte ich jetzt zwei Fragen: 1. Grafik wird...
  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