Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1324to1328
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

berechneter Wert per eM@il verschicken

berechneter Wert per eM@il verschicken
18.08.2013 19:41:00
Atuatuca
Moin moin die Damen und Herren,
ich bin noch ein blutiger anfänger und habe mir da mal ein makro zusammen gezimmert (aus verschiedenen codes aus dem www). Funktioniert alles auch soweit.
1. Problemchen
nur dass ich eigentlich in der spalte I ein berechnetes Datum und in Spalte H ein Wert aus einer anderen Tabelle übernommen wird, kann ich so aber nicht einbauen (z.Zt händisch eingegeben). Kann man das Ergebnis (das was ich in der Tabelle sehe) irgendwie in einer Email reinbekommen.
2. Problemchen
ich würde gerne nur eine Email erhalten, falls mehrere Datensätze zutreffen auf die angegeben Bedingungen. Leider bekomme ich das nicht hin, z. Zt erhalte ich eine Email pro Datensatz.
Vielleicht hat einer von euch eine Idee(n).
Hier der Code:

Sub Mail_Body_Bomar_Moon()
Dim iMsg As Object
Dim iConf As Object
Dim cell As Range
Dim Flds As Variant
Dim strbody As String
Dim i As Integer
Dim AnzahlZeilen As Integer
AnzahlZeilen = Range("A65536").End(xlUp).Row
For i = 2 To AnzahlZeilen
strbody = "Good day dear ladies and gentlemen," & vbNewLine & vbNewLine & _
"Please note that we did not receive from Mv " + cells(i, 1) + " below LubOil- _
sample(s)" & vbNewLine & _
"or it has not been registed yet. The office will double check with" & vbNewLine  _
_
_
_
_
_
_
& _
"the laboratory. Please double check from your end if the below" & vbNewLine & _
"LubOil-sample has been taken and send to the laboratory." & vbNewLine &  _
vbNewLine & _
"Ship: Mv " + cells(i, 1) & vbNewLine & _
"Equipment: " + cells(i, 5) & vbNewLine & _
"Component: " + cells(i, 6) & vbNewLine & _
"Due date: " & Format(cells(i, 9), "DD.MM.YY") & vbNewLine & vbNewLine & _
"Last sample from: " & Format(cells(i, 7), "DD.MM.YY") & vbNewLine & _
"Sample ID: " + cells(i, 2) & vbNewLine & _
"Interval: " & Format(cells(i, 8), "##,##0.0") + " Months" & vbNewLine &  _
vbNewLine & _
"If Sample has been taken and handed over to agent, please revert with" &  _
vbNewLine & _
"the corresponding landingreport, if not done so far. We will also get" &  _
vbNewLine & _
"in contact with the agent in the port of landing of the LubOil-sample(s)" &  _
vbNewLine & vbNewLine & vbNewLine & _
"Mit freundlichen Gruessen / with best regards" & vbNewLine & vbNewLine & _
"Das Kontrolteam von Excel"
Next i
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
Set iConf = CreateObject("CDO.Configuration")
iConf.Load -1    ' CDO Source Defaults
Set Flds = iConf.Fields
With Flds
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "me@myprovider.de"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "habe_keins"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.myprovider.de"
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Update
For Each cell In Sheets("BOMAR MOON - LO").Columns("I").cells.SpecialCells( _
xlCellTypeConstants)
If cell.Value "
.Subject = "Mv Bomar Moon - LubOil-Sample(s) missing"
.TextBody = strbody
.Send
End With
Set iMsg = Nothing
End If
Next cell
For Each cell In Sheets("BOMAR MOON - LO").Columns("I").cells.SpecialCells( _
xlCellTypeConstants)
If cell.Value 

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: berechneter Wert per eM@il verschicken
19.08.2013 08:46:20
fcs
Hallo Atuatuca,
ich verstehe noch nicht zu 100% was dein Makro am Ende machen soll.
Aktuell passiert folgendes:
1. aus den Zellinhalten in der letzten Zeile des aktiven Tabellenblatts wird der Body-Text der Mail zusammengestellt.
2. für die Mail wird eine Konfiguration für den Mailversand für das Programm CDO gesetzt
3. Im Blatt "BOMAR MOON - LO" wird in allen Zeilen, die in Spalte I einen Wert eingetragen haben, geprüft, ob das Datum in Spalte I &lt dem aktuellen Datum ist UND in Spalte J der Wert = "no" ist.
Für jede Zeile, die die Bedingung erfüllt wird eine E-Mail generiert.
4. Für die Zeilen, die die Bedingungen in 3. erfüllen wird in Spalte J der Wert auf "yes" gesetzt.
1. Problemchen
Wenn man den Inhalt einer Zelle so übernehmen möchte, wie er im Tabellenblatt dargetellt wird (formatiert ist), dann kann man die Text-Eigenschaft der Zelle auslesen.
Beispiel:
strWert_H = Cells(Zeile,8).Text
strDatum_I = Cells(Zeile,9).Text

Den Inhalt der Variablen kannst du dann im Body oder Subject der E-Mail einbauen.
Ähnlich wie es jetzt schon für den Body-Text gemacht wird.
2. Problemchen
Wenn du im 3. Schritt nur eine Mail verschicken willst, dann kannst du die For-Next-Schleife mit folgender Anpassung nach der Erstellung der 1. Mail verlassen.
                Set iMsg = Nothing
Exit For
End If
Next cell

Allerdings ist mir unklar, ob du dann im 4. Schritt trotzdem alle entsprechenden "no"-Einträge mit "yes" überschreiben willst?
Gruß
Franz

Anzeige
AW: berechneter Wert per eM@il verschicken
19.08.2013 21:38:57
Atuatuca
Guten Tag Franz,
ertmal vielen Dank für deine Antwort.
aber wo muss der code
strWert_H = Cells(Zeile,8).Text
strDatum_I = Cells(Zeile,9).Text

eingebaut werden.
müssten strWert_H und strDatum_I auch nicht als variablen deklariert werden, z.Bspl
Dim strWert_H As Integer 
Dim strDatum_I As Integer
?
Ein "groesseres" code "schnipsel" wäre mir schon sehr hilfreich.
Des weiteren habe ich gerade festgestellt, dass mit mein obrigen code 2 emails verschickt werden, deren inhalt aber identisch ist ? .-(
1. Das Makro soll folgendes Machen
- In der Tabelle prüfen ob es Datensätze (=Zeilen) bei denen in der Spalte I ein Datum steht, welches gleiche heute oder früher ist und in Spalte J ein "no" steht.
- Wenn o.g. Bedingungen erfüllt sind, soll er EINE email schicken mit allen Datensätzen in das Format (Umbrueche, Doppelpunkt, Leerzeichen etc..., siehe unten), welches im strBody definiert wird.
- dann soll er in Spalte J dass "no" in ein "yes" ändern, damit klar ist, dass bereits ein reminder geschickt worden ist und vom makro auch so erkannt wird.
Email Bspl.:
Good day dear ladies and gentlemen,
Please note that we did not receive from Mv Bomar Moon below LubOil- sample(s) or it has not been registed yet. The office will double check with the laboratory. Please double check from your end if the below LubOil-sample has been taken and send to the laboratory.
1. Sample (diese Zeile ist noch nicht eingebaut)
Ship: Mv Bomar Moon (wert aus spalte A)
Equipment: Stern Tube (wert aus spalte E)
Component: Bearings and Seals (wert aus spalte F)
Due date: 18.08.13 (errechneter wert, welcher in spalte I berechnet wird)
Last sample from: 19.02.13 (wert aus spalte G)
Sample ID: 123456789 (wert aus spalte B)
Interval: 6,0 Months (wert aus anderes tabellenblatt, wird in spalte H übertragen)
2. Sample (diese Zeile ist noch nicht eingebaut)
Ship: Mv Bomar Moon (wert aus spalte A)
Equipment: Main Engine Reduction Gear (wert aus spalte E)
Component: Hydraulic System (wert aus spalte F)
Due date: 19.08.13 (errechneter wert, welcher in spalte I berechnet wird)
Last sample from: 19.05.13 (wert aus spalte G)
Sample ID: 123456789 (wert aus spalte B)
Interval: 3,0 Months (wert aus anderes tabellenblatt, wird in spalte H übertragen)
If Sample has been taken and handed over to agent, please revert with the corresponding landingreport, if not done so far. We will also get in contact with the agent in the port of landing of the LubOil-sample(s)
Mit freundlichen Gruessen / with best regards
Das Kontrolteam von Excel

Anzeige
AW: berechneter Wert per eM@il verschicken
19.08.2013 23:25:12
fcs
Hallo Atuatuca,
in deinem Code hast du doch schon Zeilen drin, Due Date und Interval in den Bodytext schreiben.
    "Due date: " & Format(cells(i, 9), "DD.MM.YY") & vbNewLine & vbNewLine & _
"Last sample from: " & Format(cells(i, 7), "DD.MM.YY") & vbNewLine & _
"Sample ID: " + cells(i, 2) & vbNewLine & _
"Interval: " & Format(cells(i, 8), "##,##0.0") + " Months" & vbNewLine &  _

Liefern diese nicht das gewünschte Ergebnis? Zum Beispiel weil da Text und kein Datum/Zahl berechnet wird?
Probiere mal:
    "Due date: " & cells(i, 9).Text & vbNewLine & vbNewLine & _
"Last sample from: " & Format(cells(i, 7), "DD.MM.YY") & vbNewLine & _
"Sample ID: " & cells(i, 2) & vbNewLine & _
"Interval: " & cells(i, 8).Text & " Months" & vbNewLine & _

Dann brauchst du die Werte aus den Spalten H und I auch nicht in Variablen zwischenspeichern.
Zum Problem mehrfacher Versand: siehe mein Lösungs-Vorschlag in der vorherigen Antwort.
Du muss die For-Next-Schleife mit
Exit For
verlassen, nachdem die 1. Mail verschickt wurde.
Wenn du mehrere Samples im Body-Text erfassen willst, dann muss du auch die 1. For-Next-Schleife umbauen damit die Textteile korrekt zusammengefügt werden.
Nach meiner Einschätzung (mangels Testdaten) müsste dein Makro etwa wie folgt aussehen.
Gruß
Franz
 Sub Mail_Body_Bomar_Moon()
Dim iMsg As Object
Dim iConf As Object
Dim cell As Range
Dim Flds As Variant
Dim strbody As String
Dim i As Integer
Dim AnzahlZeilen As Integer
AnzahlZeilen = Range("A65536").End(xlUp).Row
strbody = "Good day dear ladies and gentlemen," & vbNewLine & vbNewLine & _
"Please note that we did not receive from Mv " & Cells(i, 1) _
& " below LubOil-sample(s)" & vbNewLine & _
"or it has not been registed yet. The office will double check with" _
& vbNewLine & _
"the laboratory. Please double check from your end if the below" & vbNewLine & _
"LubOil-sample has been taken and send to the laboratory." _
& vbNewLine & vbNewLine
For i = 2 To AnzahlZeilen
strbody = strbody & _
Format((i - 1), "0") & ". Sample" & vbNewLine & _
"Ship: Mv " & Cells(i, 1) & vbNewLine & _
"Equipment: " & Cells(i, 5) & vbNewLine & _
"Component: " & Cells(i, 6) & vbNewLine & _
"Due date: " & Cells(i, 9).Text & vbNewLine & vbNewLine & _
"Last sample from: " & Format(Cells(i, 7), "DD.MM.YY") & vbNewLine & _
"Sample ID: " & Cells(i, 2) & vbNewLine & _
"Interval: " & Cells(i, 8).Text & " Months" & vbNewLine & vbNewLine
Next i
strboy = strbody & vbNewLine & _
"If Sample has been taken and handed over to agent, please revert with" & _
vbNewLine & _
"the corresponding landingreport, if not done so far. We will also get" & _
vbNewLine & _
"in contact with the agent in the port of landing of the LubOil-sample(s)" & _
vbNewLine & vbNewLine & vbNewLine & _
"Mit freundlichen Gruessen / with best regards" & vbNewLine & vbNewLine & _
"Das Kontrolteam von Excel"
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
Set iConf = CreateObject("CDO.Configuration")
iConf.Load -1    ' CDO Source Defaults
Set Flds = iConf.Fields
With Flds
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "me@myprovider.de"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "habe_keins"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.myprovider.de"
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
.Update
End With
For Each cell In Sheets("BOMAR MOON - LO").Columns("I").Cells.SpecialCells( _
xlCellTypeConstants)
If cell.Value 

Anzeige
AW: berechneter Wert per eM@il verschicken
20.08.2013 22:02:41
Atuatuca
Hallo Franz,
vielen dank für die hinweise und den code.
Habe rumprobiert und habe ein teilergebnis, mittels deiner unterstützung bekommen.
1. Es wird nur noch eine email erzeugt bei ausführen des Makro's
2. Alle zutreffende Datensätze werden in eine Email gepackt, nach der im Code definierten formatierung.
Es gibt aber noch 2 "kleine" problemchen
1. Wenn ich das makro ein 2. mal starte, wird eine email generiert, obwohl spalte J den wert "yes" hat.
Der variable teil des strbody wird beim 2. ausführen nicht eingefügt.
2. in spalte I muss ein datum stehen und darf kein datum berechnet werden. Das mit dem

Cells(i,      9).text
funktioniert hier nicht, jedoch in strBody. Verstehe ich leider nicht.
Hier der Code:
Sub Mail_Body_Bomar_Moon_2()
Dim iMsg As Object
Dim iConf As Object
Dim cell As Range
Dim Flds As Variant
Dim strbody As String
Dim i As Integer
Dim AnzahlZeilen As Integer
Dim Duedate As Integer
AnzahlZeilen = Range("A65536").End(xlUp).Row
strbody = "Good day dear ladies and gentlemen," & vbNewLine & vbNewLine & _
"Please note that we did not receive from Mv " + Range("A2") + " below LubOil-sample(s)" _
& vbNewLine & _
"or it has not been registed yet. The office will double check with the laboratory" &  _
vbNewLine & vbNewLine & _
"Please double check from your end if the below" & vbNewLine & _
"LubOil-sample has been taken and send to the laboratory."
For i = 2 To AnzahlZeilen
If Cells(i, 9).Value "
.Subject = "Mv  " + Range("A2") + " - LubOil-Sample(s) missing"
.TextBody = strbody
.Send
End With
Set iMsg = Nothing
For Each cell In Sheets("BOMAR MOON - LO").Columns("I").Cells.SpecialCells( _
xlCellTypeConstants)
If cell.Value 
Die Datei: https://www.herber.de/bbs/user/86956.xls
Makro befindet sich in "Diese Arbeitsmappe"

Anzeige
AW: berechneter Wert per eM@il verschicken
21.08.2013 21:23:36
Atuatuca
Hallo Franz,
glaube ich habe das problem gelöst. Gucke dir bitte mal den code
unten an. Vielleicht nicht elegant und besser geht es immer, aber
alle meine wünsche werden erfüllt. Ich kann keine Fehler in der
Benutzung entdecken.
Ich werde das makro noch weiter ausbauen.
vielen dank nochmal für deine unterstützung.
Hier der Code:
Sub Mail_Body_Bomar_Moon_2()
Dim iMsg As Object
Dim iConf As Object
Dim cell As Range
Dim Flds As Variant
Dim strbody As String
Dim i As Integer
Dim AnzahlZeilen As Integer
Dim Duedate As Integer
AnzahlZeilen = Range("A65536").End(xlUp).Row
For i = 2 To AnzahlZeilen
If Cells(i, 9).Value  vbNullString Then
Set iMsg = CreateObject("CDO.Message")
With iMsg
Set .Configuration = iConf
.To = "Deine@Email.net"
.CC = ""
.BCC = ""
.From = """Lubeca Marine - Ruud"" "
.Subject = "Mv  " + Range("A2") + " - LubOil-Sample(s) missing"
.TextBody = strbody
.Send
End With
Set iMsg = Nothing
End If
For i = 2 To AnzahlZeilen
If Cells(i, 9).Value 
Hier kann die tabelle inkl. makro heruntergeladen werden:
https://www.herber.de/bbs/user/86970.xls
gruss
Atuatuca

Anzeige
AW: Tabellenwerte per E-Mail verschicken
22.08.2013 06:58:02
fcs
Hallo Atuatuca,
beim Nachspann des Bodytextes musst du vor dem
End If
noch eine Zeile mit
Exit For
einfügen. Der Text erscheint sonst mehrfach, wenn mehr als eine Probe als fehlend gefunden wird.
Ich würde das Makro wie in folgender Textdatei erstellen (Die E-Mail-Adressen hab ich mal neutralisiert). Einige Sachen sind natürlich persönliche Vorlieben des jeweiligen Programmierers.
https://www.herber.de/bbs/user/86973.txt
Optimierungen:
1. Bei der Erstellung des 1. Teils des Body-Textes kann die For-Next-Schleife verlassen werden, nachdem die Prüfbedingen das 1. Mal erfüllt werden.
2. Nach dem Erstellen des 1. Teils des Body-Textes kann schon geprüft werden, ob die Variable strBody leer bleibt und ggf. das Makro beendet werden.
3. Für den Nachspann des Bodytextes ist keine For-Next-Schleife erforderlich, wenn 2. gemacht wird.
Empfehlungen:
1. Option Explicit am Beginn eines Moduls verwenden
vermeidet ggf. Fehler - erleichtert Fehlersuche
2. Beim Verketten von Texten immer mit "&" arbeiten nicht mit "+"
"+" kann beim Verketten von Zahlenwerten zu unerwünschten Ergebnissen oder Fehlern führen.
3. Fehlerbehandlung einbauen
So wird bei einem Fehler bei der Makroausführung ein geordneter Ausstieg aus dem Makro erreicht.
4. Löschen von nicht verwendeten Variablen in der Variablendeklaration.
5. Kommentare einfügen zur Funktion des Makros und einzelner Makroabschnitte
6. Variablen, die für Tabellenzeilen verwendet werden, immer als Long deklarieren, nicht als Integer.
Die max. mögliche Zeilenzahl von Tabellen ist größer als die großte mögliche Integer-Zahl (32.767)
Vorlieben des Programmierers:
1. Verwendung einer Objektvariablen für das Tabellenblatt - auch wenn Code nur im aktivem Tabellenblatt ausgeführt wird.
Erleichtert die Programmierung und vermeidet Mißverständnisse. Code/Codeteile können leicht in andere Makros übernommen werden.
2. Minimierung der Zeilenfortsetzungen ( _) in einer Anweisung
Hier gibt es auch eine Grenze in Excel (ca. 25).
Gruß
Franz
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige