Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Geänderte Daten per EMail versenden
14.04.2018 23:42:01
Naki
Hallo Zusammen,
ich beschreibe mein Vorhaben und Problem mal in Stichworten.
Folgendes habe ich bereits:
- Eine Liste mit mehr als 2000 Zeilen (variiert immer wieder") und 16 Spalten.
- Ich kann per UF neue Datensätze (Zeilen) anlegen und speichern oder bestehende Daten ändern und speichern.
- Das Speichern erfolgt mit einem klick auf ein Commandbutton (Speichern).
Mein Vorhaben:
- Die neu angelegeten oder die veränderten Daten (immer nur eine komplette Zeile!) sollen beim anklicken des Commandbuttons (Speichern) gespeichert und und dann noch per Email (Outlook) versendet werden (Empfänger ist immer der Gleiche).
- Es soll nicht eine Exceldatei mit dem Datensatz oder gar die komplette Datei versendet werden, sondern lediglich nur die Eingaben aus der Excelliste in die Email übertragen und versendet werden!
-Die Neu erfassten Daten stehen immer am Ende der Liste, aber die bereits vorandenen stehen irgendwo in der Liste.
Ich weiss, dass man bestimmte Zellbereiche oder ganze Listen per Email versenden kann. Aber in meinem Fall kann man sich, aus dem o. g. Grund, nicht auf einen bestimmten bzw. festen Zellbereich berufen.
Wäre das Problem mit VBA lösbar?
Gruß
Naki

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Geänderte Daten per EMail versenden
15.04.2018 00:05:44
Firmus
Hi Haki,
wenn Du jetzt noch eine Beispieldatei hochlädst, tun sich die willigen Helfer viel leichter.
Besonders solltest Du vermerken welche Zellen jeweils in ein Email reinkommen sollen.
Speziell mit diesem Satz
"Die Neu erfassten Daten stehen immer am Ende der Liste, aber die bereits vorhandenen stehen irgendwo in der Liste."
konnte ich gar nichts anfangen.
Gruß,
Firmus
PS: Bin nicht sicher, ob ich in den nächsten Tagen nachfassen kann - sorry.
AW: Geänderte Daten per EMail versenden
15.04.2018 12:43:18
fcs
Hallo Naki,
mögliche Variante:
du legst in deiner Datei ein Tabellenblatt für Änderungen an.
Wenn du Änderungen/Ergänzungen machst, dann kopierst du die geänderten/neuen Datensätze um zusätzlich auch in dieses zusätzliche Blatt.
Wenn du deine Eingaben abgeschlossen hast, dann versendest du den Zellbereich mit den Änderungen nach der dir bekannten Methode an den/die Empfänger per E-Mail.
Nach dem Mail-Versand löscht du in deiner Arbeitsdatei im Anderungsblatt die Einträge.
Ich persönlich würde aber das Tabellenblatt mit den Änderungen in eine neu Mappe kopieren und die Mappe per E-Mail versenden. Das meiner Meinung nach einfacher für den Empfänger als sich in einer E-Mail durch eine als HTML-Text generierte Tabelle aus ggf. vielen Zeilen zu kämpfen.
Gruß
Franz
Anzeige
AW: Geänderte Daten per EMail versenden
15.04.2018 14:51:39
Naki
Hallo Franz,
über dein Vorschlag habe ich auch mal nachgedacht. Jedoch ist dies für unseren Bereich nicht sehr praktikabel, da mehrere User verschiedene Daten bearbeiten und die Mail zuerst an ein Sammelmail verschickt wird. Von dort aus werden die Mails weitergeleitet. Daher muss bei jeder Erfassung eine Email mit dem "einen" Datensatz verschickt werden, und das mehrmals am Tag.
Ich poste mal ein Beispieldatei. Vielleicht wird es besser verständlicher.
Zuerst aber mal der Code, der das Speichern auslöst und hier soll auch der Code mit dem Email hin:
Private Sub EINTRAG_SPEICHERN()
Dim lZeile As Long
Dim i As Integer
'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
If ListBox1.ListIndex = -1 Then Exit Sub
'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
lZeile = ListBox1.List(ListBox1.ListIndex, 0)
For i = 1 To iCONST_ANZAHL_EINGABEFELDER
ActiveSheet.Cells(lZeile, i + 1) = Me.Controls("TextBox" & i)
Next i
'Der Benutzer könnte die angezeigten Werte in der Liste geändert haben,
'daher aktualisieren wir den ausgewählten Eintrag entsprechend.
ListBox1.List(ListBox1.ListIndex, 1) = TextBox1
ListBox1.List(ListBox1.ListIndex, 2) = TextBox2
ListBox1.List(ListBox1.ListIndex, 3) = TextBox3
MsgBox "Änderung übernommen", vbInformation
'''JETZT SOLLEN DIE DATEN NEUEN BZW. GEÄNDERTEN KOPIERT UND IN EMAIL EINGEFÜGT/VERSENDET  _
WERDEN!
'ActiveWorkbook.Save    'Speichert nach jeder eingabe
End Sub
Und diesen Code habe ich gefunden, was meinen Bedürfnissen entsprechen würde. Das Problem ist jedoch, ich kann nur einen bestimmten Zellbereich hier auswählen und nicht tatsächlich die Daten die ich will. Ich denke, wenn ich anstatt den Zellbereich eine Variable definiere (hier im Code;.HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Range("A1:E12"))) wo ich die Daten die übertragen wurden übergeben kann, könnte es gehen, oder?!
Option Explicit
Public Sub TableToMail()
Dim objOutlook As Object
Dim objMail As Object
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
With objMail
.to = "Test@Test.aa"
.Subject = "ÄNDERUNG " & CStr(Date)
.HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Range("A1:E12"))
.Display    'nur Anzeigen
'        .Send       'direkt senden
End With
Set objMail = Nothing
Set objOutlook = Nothing
End Sub
Private Function RangeToHTML(objSheet As Worksheet, objRange As Range) As String
Dim strFilename As String
strFilename = Environ$("TEMP") & "/" & Format(Now, "dd-mm-yyyy_hh-mm-ss") & ".htm"
ActiveWorkbook.PublishObjects.Add( _
SourceType:=xlSourceRange, _
Filename:=strFilename, _
Sheet:=objSheet.Name, _
Source:=objRange.Address, _
HtmlType:=xlHtmlStatic).Publish True
RangeToHTML = CreateObject("Scripting.FileSystemObject"). _
GetFile(strFilename).OpenAsTextStream(1, -2).ReadAll
Kill strFilename
End Function
Hier die Datei:
https://www.herber.de/bbs/user/121048.xls
Anzeige
AW: Geänderte Daten per EMail versenden
15.04.2018 18:50:00
Firmus
Hi Naki,
hier ein Beispiel mit dynamischer Range-Übergabe.
https://www.herber.de/bbs/user/121051.xlsm
Lass wissen, ob es geklappt hat.
Gruß,
Firmus
AW: Geänderte Daten per EMail versenden
15.04.2018 20:08:09
Naki
Hi Firmus,
leider hat es nicht so funktioniert wie gedacht.
Ich erhalte mit dem Code in der Outlook Mail nun Zeilen.
Es soll nur die Zeile ausgegeben werden, die geändert bzw. neu angelegt wurde. s. U.:
Müller Muster 01.01.2000 XY 3 20,00 € 10,00 € 10,00 € 10 x Jan. 00
Meyer Muster 01.01.2000 XY 3 20,00 € 10,00 € 10,00 € 10 x Jan. 00
Lieschen Muster 01.01.2000 XY 3 20,00 € 10,00 € 10,00 € 10 x Jan. 00
Gruß
Naki
Anzeige
AW: Geänderte Daten per EMail versenden
15.04.2018 20:30:26
Naki
Hallo,
ich muss nochmal editieren!
Die bereits vorhandenen und geänderten Daten werden unter dem

Private Sub EINTRAG_SPEICHERN()
und die Neuangelegten unter

Private Sub EINTRAG_ANLEGEN()
erfasst.
An der Problematik ändert sich jedoch nichts, da in beiden Fällen immer nur eine Zeile versendet werden muss.
Gruß
Naki
AW: Geänderte Daten per EMail versenden
15.04.2018 21:59:19
Firmus
Hallo Naki,
ich habe es so verstanden:
1. In deinem Code
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
ActiveSheet.Cells(lZeile, i + 1) = Me.Controls("TextBox" & i)
Next i

wird die gewünschte Datenzeile in dem XLS-Blatt geschrieben - aus der Listbox.
2. Diese Zeile, die dynamisch an irgendwelchen Stellen im Code stehen kann, soll per Email
verschickt werden.
Was habe ich gemacht?
Ich habe den statischen Teil " .HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Range("A1:E12"))"
so verändert, dass ein beliebiger Bereich(Range) in das Email kopiert werden kann.
Wie habe ich das gemacht?
Ich habe den statischen Bereich 'ActiveSheet.Range("A1:E12")' durch 'ActiveSheet.Range(xRange)'ersetzt.
Natürlich muss die Variable 'XRange' passend definiert werden.
Einfachster Weg:
Gleich nach deinem Code, der die XLS befüllt, sind die Zell-Adressen bekannt, da sollte XRange
gesetzt werden:
Beispielhaft habe das so gemacht:

' letzte Zelle in Range (linksoben)    => das ist die erste Zelle die ins Email soll.
ActiveSheet.Cells(lZeile, i + 1).Select
LinksOben = ActiveCell.Address
' werte für test setzen
i = i + iCONST_ANZAHL_EINGABEFELDER        'Hier schaltest Du durch die Zeile
' letzte zelle in Range  (rechtsunten) => das ist die letzte Zelle die ins Email soll.
ActiveSheet.Cells(lZeile, i + 1).Select
RechtsUnten = ActiveCell.Address
' Range als STRING zusammensetzen
xRange = LinksOben & ":" & RechtsUnten
Wenn lZeile erhöht wird (ich hatte als Test '3' addiert), dann bekommst Du mehrere Zeilen ausgewählt.
Ohne diese Addition bleibt es genau eine Zeile.
Mit Debug-stop nach dem Zusammensetzen von 'xRange' und dem Überwachungsfenster kannst Du genau sehen welche Zellen für das Email ausgewählt werden.
Viel Erfolg,
Lass wissen, ob es klappt.
Gruß,
Firmus
Anzeige
AW: Geänderte Daten per EMail versenden
16.04.2018 14:41:20
Naki
Hi,
danke nochmal für die Erklärung, aber der Code passt irgendwie doch nicht .
Du hast mich jedoch mit "xlRange" auf eine Idee gebracht, den ich auch umgesetzt habe und es klappt damit sowie ich es mir vorstelle. Ein problem blebt aber dennoch.
Erst was ich gemacht habe:
Der Code den ich auffinden konnte sah so aus:
.HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Range("A1:E12"))

Damit konnte ich jedoch immer nur einen bestimmten Bereich zur Email importieren.
Ich habe ja in meinem Code die Variable "lZeile". Habe .Range... ersetzt mit:
.HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Rows(lZeile))

Nun erscheinen die Zeilen, die ich bearbeitet oder neuangelegt habe in meinem Email. Jedoch ist de Ansicht ganz komisch. Die Spalten sind zwar nebeneinander, aber erscheinen wie im Blocksatz, sodass das lesen sehr mühsam ist. In der Excel Tabelle ist dies nicht so.
Wenn ich aber den Code unverändert, also

.HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Range("A1:E12"))
, ausführe ist alles OK, aber halt nicht die Zeilen die ich will!
Wie kann ich das jetzt lösen, dass die Zeilen im Email wie im xls erscheinen?
Gruß
Naki
Anzeige
AW: Geänderte Daten per EMail versenden
16.04.2018 18:18:38
fcs
Hallo Naki,
so
.HTMLBody = RangeToHTML(ActiveSheet, ActiveSheet.Range("A" & lZeile & ":E" & lZeile))

sollte der Bereich in der Zeile korrekt ausgegeben werden.
Mit Rows beinhaltet der Bereich ja alle Zellen der Zeile, was dann wohl im HTML-Code für die E-Mail entsprechend unschön aussieht.
Gruß
Franz
AW: Geänderte Daten per EMail versenden
16.04.2018 22:10:17
Firmus
Hi Naki,
ich habe Deine Eingabe nachvollzogen. Es wird eine GESAMTE ZEILE ausgegeben.
Im Email sind Spalte A bis Spalte x, wobei x die letzte Spalte ist, in der noch Daten stehen.
Alle weiteren (leeren) Spalten werden ignoriert, d.h. nicht ausgegeben,
und das trotz Deiner Angabe "ganze Zeile".
Franz' Ausdruck gefällt mir gut, da er ohne den Zwischenschritt mit einer Variablen arbeitet.
Die Variable ist erst im Debug-Falle hilfreich.
Jedoch greift der Ausdruck "ActiveSheet.Range("A" & lZeile & ":E" & lZeile))" fix die Spalten
"A" bis "E" in der von Dir spezifizierten Zeile ab.
Prüfe bitte, was für Dich die beste Variante ist.
Lass wissen, falls Du noch etwas benötigst.
Gruß,
Firmus
Anzeige
AW: Geänderte Daten per EMail versenden
17.04.2018 21:26:51
Naki
Hallo,
vielen Dank für die Antworten.
Franz seine Variante klappt super! Alles wie gewünscht!
Eine Frage aus Neugier und wenn es nicht sehr aufwendig wird:
Franz hatte in seiner ersten Antwort geschrieben, dass ich die Zeile in einem seperaten Tabelle übertragen und dann versenden kann.
Wie wäre die Vorgehensweise, wenn ich:
die Zeile, den ich versenden will kopiere, mit Code ein tempor. Tabelle öffne und die Zeile einfüge, per Email sende und die temp. Tabelle nach versenden automatisch ohne speichern lösche?
Wie gesagt, mein Problem ist gelöst, würde im Fall der Fälle auch diesen Weg gerne anwenden können und somit auch meien VBA-Wissen bereichern :)
Grüße
Naki
Anzeige
AW: Geänderte Daten per EMail versenden
17.04.2018 22:49:31
Firmus
Hi Naki,
nach meinem Kenntnisstand macht das keinen Sinn, denn wenn Du einen Teil einer XLS-Tabelle
in Tabellenformat in einen Emailbody setzen willst, brauchst Du html.
Und dazu temporär ein Workbook zu erzeugen und wieder zu löschen - sinnfrei.
Wenn Du mit create workbook Dinge testen willst, dann sieht das SO aus. + Tante Google.

xGesamtDatei = "SchulungsplanDaten_per_" & Format((Now), "YYYYMMDD-hhmmss")
Workbooks.Add
ActiveWorkbook.SaveAs Filename:=xGesamtDatei
Set WBgesamt = ActiveWorkbook
WBgesamt.Sheets(1).Name = "ALLE_per_" & Format((Now), "YYYYMMDD-hhmmss")
Gruß,
Firmus
Anzeige
AW: Geänderte Daten per EMail versenden
18.04.2018 08:24:35
fcs
Hallo Naki,
zum Erstellen eines Attachments mit einem Zellbereiich für eine E-mail sieht es etwa wie folgt aus.
Gruß
Franz
Public Sub TableRangeToMail()
Dim objOutlook As Object
Dim objMail As Object
Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
Dim lZeile As Long
Dim sAttName As String
' werte für test setzen
lZeile = 2
sAttName = VBA.Environ("Temp") & "\" & "ÄNDERUNG " _
& Format(Now, "YYYY-MM-DD hh_mm_ss") & ".xlsx"
If fncMakeAttachment(strAttachmentName:=sAttName, wks:=ActiveSheet, _
Zei1:=lZeile, Zei2:=lZeile, Spa1:=1, Spa2:=5) = True Then
With objMail
.to = "test.test@gibts.nicht"
.Subject = "ÄNDERUNG " & CStr(Date)
.Attachments.Add sAttName
.Display    'nur Anzeigen
'        .Send       'direkt senden
End With
End If
If Dir(sAttName)  "" Then VBA.Kill sAttName
Set objMail = Nothing
Set objOutlook = Nothing
End Sub
Private Function fncMakeAttachment(strAttachmentName As String, wks As Worksheet, _
Zei1 As Long, Zei2 As Long, _
Spa1 As Long, Spa2 As Long) As Boolean
'wks = Tabellenblatt mit den zu sendenden Daten
'strAttachmentName = Pfad+Name des Attachments
'Zei1, Zei2, Spa1,Spa2'Zeilen/Spaltenbereich  der übernommen werden soll
Dim wkb As Workbook, rng As Range, wksAtt As Worksheet
On Error GoTo Fehler
Set wkb = Application.Workbooks.Add(Template:=xlWBATWorksheet)
Set wksAtt = wkb.Worksheets(1)
With wks
Set rng = .Range(.Cells(Zei1, Spa1), .Cells(Zei2, Spa2))
End With
With wksAtt
rng.Copy
.Range("A1").PasteSpecial xlPasteColumnWidths
.Range("A1").PasteSpecial xlPasteFormats
.Range("A1").PasteSpecial xlPasteValues
.Name = "Änderung"
End With
wkb.SaveAs Filename:=strAttachmentName, FileFormat:=51 '
wkb.Close False
Fehler:
With Err
Select Case .Number
Case 0
fncMakeAttachment = True
Case Else
fncMakeAttachment = False
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description, vbOKOnly, _
"Makro: fncMakeAttachment"
End Select
End With
End Function

Anzeige

336 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige