Moro,
Voisiko joku teistä ammattilaisista neuvoa, että kuinka teen excelillä muistutuksen sähköpostiin kun tietty päivämäärä koittaa.
Kyseisessä sähköpostissa olisi kiva jos näkyisi tietoja halutuista soluista.
Pahoittelen huonosta esimerkistä, mutta...
Tarkoituksena olisi saada alla olevasta taulukosta seuraavat tiedot: Etunimi, Sukunimi ja Asia
Etunimi Sukunimi Asia Muistutuspäivä
Keke Rousberg blaa blaa blaa 14.8.2014
Pena Rekkamies jotain jargonia 25.4.2015
Arvid Kröönberg Ja blaa blaa blaa 24.12.2018
- Kekkonen -
Äkkiseltään tuntuisi siltä, että sopivampi työkalu kuvaamaasi tarpeeseen olisi Outlook. Tai joku muu kalenteriohjelmisto, esim. ilmainen/mainosrahoitteinen Google-kalenteri, jolla saisi kaupan päälle myös tekstiviestimuistutuksen.
Virittele tältä pohjalta mielesi mukaan...
VBA-Projektiin referenssi:
Microsoft Outlook xx.0 Object Library
(xx=versionumero, tiedosto on MSOUTL.OLB)
'ThisWorkbook tai TämäTyökirja Private Sub Workbook_Open() StartTimer End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) StopTimer ThisWorkbook.Save End Sub
'Module1
Dim aOutlook As Outlook.Application
Dim aEmail As Outlook.MailItem
Public RunWhen As Double
Public Const cRunIntervalSeconds = 60 '300 '(5 minuuttia)
Public Const cRunWhat = "RunAtInterval"
Public Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime EarliestTime:=RunWhen, _
Procedure:=cRunWhat, Schedule:=True
End Sub
Sub RunAtInterval()
Dim rvalues As Variant
rvalues = CheckDates()
If rvalues(0) Then
SendMail rvalues(1), "Moi " & Split(rvalues(2), " ")(0) & "!" & _
vbLf & vbLf & rvalues(3)
End If
StartTimer
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime RunWhen, "RunAtInterval", Schedule:=False
If Err <> 0 Then
Err.Clear
On Error GoTo 0
End If
End Sub
Function CheckDates() As Variant()
Dim rArray(3) As Variant
Dim pvm As String
pvm = Split(Now(), " ")(0)
Dim vrivi As Long
ActiveSheet.Unprotect Password:="salasana"
vrivi = Taul1.Cells.SpecialCells(xlCellTypeLastCell).Row
ActiveSheet.Protect Password:="salasana", DrawingObjects:=True, Contents:=True, Scenarios:=True
For i = 1 To vrivi
If Taul1.Cells(i, 3).Text = pvm Then
rArray(0) = True
rArray(1) = Taul1.Cells(i, 2).Text
rArray(2) = Taul1.Cells(i, 1).Text
rArray(3) = Taul1.Cells(i, 4).Text
Taul1.Cells(i, 3).Value = ""
Taul1.Cells(i, 4).Value = ""
Exit For
End If
Next i
CheckDates = rArray
End Function
Sub SendMail(ByVal address As String, ByVal message As String)
Set aOutlook = New Outlook.Application
Set aEmail = aOutlook.CreateItem(olMailItem)
aEmail.Importance = 1
aEmail.Subject = "ASIAA"
aEmail.BodyFormat = olFormatPlain
aEmail.Body = message
aEmail.To = address
On Error Resume Next
aEmail.Send
If Err <> 0 Then
MsgBox "Sähköpostia lähetettäessä tapahtui virhe" & _
vbCrLf & vbCrLf & Error$
Err.Clear
On Error GoTo 0
End If
aOutlook.Quit
Set aEmail = Nothing
Set aOutlook = Nothing
End SubKuvia:
Taul1
TämäTyökirja
Module1
Kiitoksia neosofta hyvästä ja nopeasta vastauksesta.
Tarvii alkaa viritteleen tuota omaan tarpeeseen.. ja vielä kerran kiitoksia :)
- Kekkonen -
Mikäli haluat käyttää viestin lähetykseen OUTLOOK'n asemesta CDO:ta niin poista edellisen esimerkin Module1 alun deklaraatiosta nämä rivit:
Dim aOutlook As Outlook.Application Dim aEmail As Outlook.MailItem
ja korvaa Sub SendMail koodi seuraavalla koodilla:
Sub SendMail(ByVal address As String, ByVal message As String)
Dim cdoMsg As Object
Dim cdoConf As Object
Set cdoMsg = CreateObject("CDO.Message")
Set cdoConf = CreateObject("CDO.Configuration")
Dim schema As String
schema = "http://schemas.microsoft.com/cdo/configuration/"
Set Flds = cdoConf.Fields
With Flds
.Item(schema & "sendusing") = 2
.Item(schema & "smtpserver") = "smtp.gmail.com"
.Item(schema & "smtpserverport") = 465
.Item(schema & "smtpauthenticate") = 1
.Item(schema & "sendusername") = "erkki.esimerkki@gmail.com"
.Item(schema & "sendpassword") = "salasana"
.Item(schema & "smtpusessl") = 1
.Update
End With
With cdoMsg
Set .Configuration = cdoConf
.To = address
.From = "Erkki Esimerkki"
.Subject = "ASIAA"
.TextBody = message
On Error Resume Next
.Send
If Err <> 0 Then
MsgBox "Sähköpostin lähettämisessä tapahtui virhe" _
& vbCrLf & vbCrLf & Err.Description
Err.Clear
On Error GoTo 0
End If
End With
Set cdoMsg = Nothing
Set cdoConf = Nothing
Set Flds = Nothing
End SubValiste VBA editorissa TOOLS -> References ja tutki löytyykö listasta: Microsoft CDO 1.21 Library
Mikäli kirjasto löytyy niin kaikki on OK. Mikäli ei löydy niin lataa tämä, pura .zip pakkaus ja asenna kirjastotiedostot ohjeen mukaan.
Moro,
Jonkin verran on mennyt aikaa kun kerkisin testaileen tuota koodipätkää ja se ei suostu toimimaan.
Ilmoittaa virhettä "Compile error: User-defined type not defined"
ja boldaa seuraavan kohdan "aOutlook As Outlook.Application".
- Kekkonen
Ja olet tehnyt tämän?
neosofta kirjoitti:
VBA-Projektiin referenssi:
Microsoft Outlook xx.0 Object Library
(xx=versionumero, tiedosto on MSOUTL.OLB)
Olin mielestäni tehnyt, mutta en sitten ollutkaan.. sori!
Tuon jälkeen se ilmoitti seuraava..
Virheilmoitus
Ja kiitoksia avusta :)
- Kekkonen
Virittele työkirja seuraavasti:
Poista kaikki muut taulukot paitsi taulukko Taul1.
Valitse taulukon Taul1 sarakkeet sarakkeesta E eteenpäin valitsemalla hiirellä sarake E paina Shift näppäin pohjaan ja pidä se alas painettuna, paina End näppäintä ja sen jälkeen Nuoli oikealle näppäintä, klikkaa valitun alueen sisällä hiiren kakkospainikkeella ja valitse Piilota.
Kirjoita otsikot 1. riville sarakkeiden A - D soluihin.
Valitse sarakkeet A:sta D:hen, klikkaa valitun alueen sisällä hiiren kakkospainikkeelle, valitse Muotoile solut, valitse Suojaus välilehti, poista ruksi valinnasta Lukittu ja klikkaa Ok.
Valitse 1. rivi (otsikkorivi), klikkaa hiiren kakkospainikkeella valitun alueen sisällä, valitse Muotoile solut, valitse Suojaus välilehti, ruksaa valinta Lukittu ja klikkaa Ok.
Suojaa ensin taulukko antamalla salasanaksi salasana ja sen jälkeen työkirja antamalla salasanaksi salasana.
Lopuksi tallenna työkirja makrot sallivaan muotoon
Aihe on jo aika vanha, joten et voi enää vastata siihen.