PDA

Vollständige Version anzeigen : Mail versenden bei einer Veränderung in einer Zelle


Wolf38
30.09.2010, 12:55
Hallo,

ich habe da mal eine Frage, gibt es in VBA für Excel einen Code der bei einer Änderung in einem Urlaubskalender eine Meldung versendet an verschiedene Personen. Wenn jemand die Änderung beim verlassen speichert.

Währe froh über einen Tipp wie man so was gestalten könnte !


Danke mal vorerst !;)


Gruss

vom Wolf38

Severus
30.09.2010, 13:28
Hi Wolf38,
mit zwei Worten ist das leider nicht getan.
Ich sehe das so:
1) mit dem Worksheet_Change Ereignis die Änderung feststellen und irgendwo in der Arbeitsmappe in einer unsichtbaren Zelle oder auf einem unsichtbaren Blatt einen Vermerk setzen: z.B

ThisWorkbook.Sheets(x).Range("A1") = 1

2) Damit das beim Öffnen der Datei wieder zurückgesetzt wird das Workbook_Open Ereignis benutzen, um diesen Wert auf 0 zu setzen.
3) Das BeforeSafe Ereignis den Workbooks benutzen um die Mail ggf. zu Versenden.
Dazu einen Verweis auf die Objektbibliothek von Outlook setzen.

Private Sub Workbook_BeforSafe
Dim olApp as new Outlook.Application
Dim olMail as Outlook.MailItem
If ThisWorkbook.Sheets(x).Range("A1") <> 1 Then Exit Sub

Set olMail = olApp.CreateItem(0)
With olMail
.Recipients.Add "charlie.brown@peanuts.de"
.Subject = "Da versaut einer die Urlaubsplanung"
.Body = "Urlaubsplanung wurde geändert!"
.Send
End With
Set olMail = Nothing
End Sub


Severus

jinx
30.09.2010, 17:29
Moin, Severus,

bist Du im Geldschrankgewerbe tätig (wegen Safe statt Save)?

möglicherweise reicht auch der Zustand der Speicherung der Mappe:
'...
If Not ThisWorkbook.Saved Then
'weitere Code für ungespeicherte Mappe

@Wolf:
welche Mailprogramme werden verwendet?

Wolf38
30.09.2010, 18:02
Hallo, danke mal für die schnelle hilfe! Hab nur ein Problem wo soll ich den den Code einfügen ????

Hab mal bei mir einen Beitrag gehabt mit "VBA-Ferienkalender"

Da würde man sehen wie der Code im Ferienkalender ausschaut.


wäre super wenn ihr mal da nachschauen könntet.

Danke !

Gruss

Wolf 38

Ps. bin im VBA halt nur ein Anfänger

Severus
01.10.2010, 05:54
@jinx: http://smiles.kolobok.us/artists/mother_goose/MG_119.gif
Im Übrigen hast Du wahrscheinlich Recht. Auf das Eintragen eines Wertes bin ich deshalb gekommen, weil ich das an anderer Stelle auch gemacht habe. Allerdings mit Eingabe der Zeit, damit ich beim Schließen die Zeit berechnen konnte, welche die Datei geöffnet war.

@Wolf38:

Wie "Private Sub Workbook_BeforSave" schon sagt: Der Code gehört in das Klassenmodul "DieseArbeitsmappe" Deiner Datei.
http://smiles.kolobok.us/artists/fool/lam.gif
Severus

jinx
01.10.2010, 06:06
Moin, Severus,

Im Übrigen hast Du wahrscheinlich Recht.
Das ist abhängig von den verwendeten Formeln in der Mappe - Funktion wie Heute() oder Jetzt() unterlaufen diesen Ansatz, da muss in der von Dir skizzierten Vorgehensweise die Änderung der Daten betrachtet werden.

Wolf38
04.10.2010, 19:37
Hallo,

hab den Code mal in ein Klassenmodul eingefügt, aber es tut sich leider nichts.
Was muss ich da noch ändern das es funktioniert ?

Währe Dankbar für einen Tipp !!


Gruss

Wolf38

jinx
04.10.2010, 19:43
Moin, Wolf,

nicht in ein Klassenmodul, sondern in das Klassenmodul namens DieseArbeitsmappe...

Wolf38
05.10.2010, 06:19
hallo, das hab ich jetzt gemacht. aber es tut sich leider gar nichts.

code von dieser Arbeitsmappe
Private Sub Workbook_BeforSave()
Dim olApp As New Outlook.Application
Dim olMail As Outlook.MailItem
If ThisWorkbook.Sheets(x).Range("A1") <> 1 Then Exit Sub

Set olMail = olApp.CreateItem(0)
With olMail
.Recipients.Add "wolf@someaddress.com"
.Subject = "Da versaut einer die Urlaubsplanung"
.Body = "Urlaubsplanung wurde geändert!"
.Send
End With
Set olMail = Nothing
End Sub

Private Sub Workbook_Open()
EintragÜberspringen = False
Ausgangsjahr = Application.Sheets("Jan").Range("A1").Value
End Sub
<hr>
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
ActiveCell.Offset(1, 0).Select
Exit Sub
End Sub
<hr>
Private Sub Workbook_WindowActivate(ByVal Wn As Window)

Dim i As Integer
Dim strZeichen As String
For i = 0 To 255
On Error Resume Next
Application.OnKey Chr(i), ""
On Error GoTo 0
Next i

For i = 0 To 255
On Error Resume Next
Application.OnKey "+" & Chr(i), ""
On Error GoTo 0
Next i

Application.OnKey "^{LEFT}", ""
Application.OnKey "U", "UTaste"
Application.OnKey "u", "UTaste"
Application.OnKey "u", "UTaste"
Application.OnKey "h", "HTaste"
Application.OnKey "^{DOWN}", ""
Application.OnKey "^{UP}", ""
Application.OnKey "^{LEFT}", ""
Application.OnKey "^{RIGHT}", ""
Application.OnKey "+{DOWN}", ""
Application.OnKey "+{UP}", ""
Application.OnKey "+{LEFT}", ""
Application.OnKey "+{RIGHT}", ""
Application.OnKey "^+{DOWN}", ""
Application.OnKey "^+{UP}", ""
Application.OnKey "^+{LEFT}", ""
Application.OnKey "^+{RIGHT}", ""
Application.OnKey "{DELETE}", "Löschen"
Application.OnKey "^v", ""
Application.OnKey "^c", ""
Application.OnKey "{RETURN}"

'Application.SendKeys (NUMLOCK)

End Sub
<hr>
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)

Dim i As Integer
For i = 0 To 255
On Error Resume Next
Application.OnKey Chr(i)
On Error GoTo 0
Next i

For i = 0 To 255
On Error Resume Next
Application.OnKey "+" & Chr(i)
On Error GoTo 0
Next i

Application.OnKey "u", "UTaste"
Application.OnKey "u", "UTaste"
Application.OnKey "h", "UTaste"
Application.OnKey "^{DOWN}"
Application.OnKey "^{UP}"
Application.OnKey "^{LEFT}"
Application.OnKey "^{RIGHT}"
Application.OnKey "+{DOWN}"
Application.OnKey "+{UP}"
Application.OnKey "+{LEFT}"
Application.OnKey "+{RIGHT}"
Application.OnKey "^+{DOWN}"
Application.OnKey "^+{UP}"
Application.OnKey "^+{LEFT}"
Application.OnKey "^+{RIGHT}"
Application.OnKey "{DELETE}"
Application.OnKey "^v"
Application.OnKey "^c"
'Application.OnKey "{NUMLOCK}"

End Sub
Gruss

Wolf38

jinx
05.10.2010, 06:57
Moin, Wolf,

was für einen Wert hat x in

If ThisWorkbook.Sheets(x).Range("A1") <> 1 Then Exit Sub
x steht für eine Variable - wenn sie nicht in einer globalen Variable gefüllt wurde, müsste dort meiner Meinung nach der Name der Tabelle stehen, wie sie auf dem Tabellenreiter steht, z.B.
If ThisWorkbook.Sheets("Sicherheitsblatt").Range("A1") <> 1 Then Exit Sub

Wolf38
05.10.2010, 07:54
Hallo, da passt was nicht ! Weil ich hab jetzt eine neue Mappe mit dem Code gemacht und es funktioniert nichts.

Da muss wohl was falsch in dem Code sein.


Blöd :-(



Gruss

Wolf38