Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Info Coronavirus/Vaccinare vs Fake News

Revolut x Vodafone - Obține ...

Cade internetul la platformele St...

Rulouri de aluminiu DIY
 Magnolia Urban Residence

Despre Monitorizarea Sunetului &#...

Șeful bancii centrale a Polo...

Ac adaptor HKA 12150EC 230
 Dosarul Revoluției: „g...

Difuzor pentru smart Tv

Turul Frantei in Bucuresti mergeti?

Player fara casti
 Ati fi de acord cu gratuitatea pr...

Dynacord Pm600 3

Unitate programare(achizitie comp...

Cum ma fac profesor?
 

Modificare macro pentru a trimite 1 email in loc de mai multe

* * * - - 2 votes
  • Please log in to reply
1 reply to this topic

#1
M_r

M_r

    Active Member

  • Grup: Members
  • Posts: 1,462
  • Înscris: 25.06.2005
Buna ziua.

Am gasit un macro online pentru a trimite emailuri din excel in baza unei conditii dintr-o coloana. Merge foarte bine daca am 1-2 randuri unde se aplica acea conditie (se trimit 1-2 mailuri), dar cand conditia se aplica pe 10 randuri deodata si trimite 10 mailuri, devine enervant.

Descriu mai intai sheet-ul, situatia actuala si cea dorita de mine si apoi pun codul VBA pentru situatia actuala.

Structura sheet-ului este:
A - numele persoanei careia i se trimite email (acelasi nume pe 50 de randuri)
B+C - email si CC email (acelasi email pe 50 de randuri)
D - conditia, daca e "yes" se trimite email (conditia e daca diferenta dintre azi si o alta data e mai mica de 10 zile)
E - numele companiei
F - nr. ordine
G - sector care trebuie auditat
H/I - data de inceput / sfarsit audit
J/K - zile ramase pana la inceputu / sfarsitul auditului
L - ai facut auditul?: daca "da", coloana D devine "no" si nu se mai trimite mail

Cum functioneaza macro-ul acum:
Se trimite cate 1 mail pentru fiecare conditie "yes" din coloana D. Cu alte cuvinte, daca am 10 de yes, trimite 10 mailuri diferite, fiecare cu continutul lui extras din coloanele A, E, G, H, I, J. Exemplu continut email:

Quote

Atentie Cristi,
Auditul la compania X - sector 1 se desfasoara in perioada 5.02.2018 - 7.02.2018
Zile ramase pana la inceputul perioadei de audit: 10 ZILE
etc.
Apoi inca 9 emailuri, referitor la alte companii sau alte sectoare din aceeasi companie.

Cum as vrea sa fie:
Pentru cele zece conditii "yes" din coloana D sa se trimita un singur email cu toate informatiile in continut, de exemplu:

Quote

Atentie Cristi,
In urmatoarele zile vei avea de facut N audituri:
- auditul la sectorul 1 de la compania X se desfasoara in perioada 5.02.2018 - 7.02.2018 si dureaza 3 zile
- auditul la sectorul 2 de la compania X se desfasoara in perioada 8.02.2018 - 9.02.2018 si dureaza 2 zile
- auditul la sectorul 1 de la compania Y se desfasoara in perioada 14.02.2018 - 16.02.2018 si dureaza 3 zile
- auditul la sectorul 2 de la compania Y se desfasoara in perioada 19.02.2018 - 23.02.2018 si dureaza 5 zile
etc.

Ma poate ajuta cineva sa modific codul de mai jos pentru a face ceea ce vreau eu?

Codul este:
Sub audit()
Dim OutApp As Object
Dim OutMail As Object
Dim cell As Range
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
On Error GoTo cleanup
For Each cell In Columns("B").Cells.SpecialCells(xlCellTypeConstants)
	 If cell.Value Like "?*@?*.?*" And _
		 LCase(Cells(cell.Row, "D").Value) = "yes" Then
		 Set OutMail = OutApp.CreateItem(0)
		 On Error Resume Next
		 With OutMail
			 .To = cell.Value
			 .CC = Cells(cell.Row, "C").Value
			 .BCC = ""
			 .Subject = "MAIL ATENTIONARE AUDIT"
			 .Body = "Atentie, " & Cells(cell.Row, "A").Value & "!" & _
vbNewLine & vbNewLine & _
"AUDITUL INTERN la " & Cells(cell.Row, "G").Value & " de la firma " & Cells(cell.Row, "E").Value &_
" trebuie sa se desfasoare in perioada " & Cells(cell.Row, "H").Value & " - " & Cells(cell.Row, "I").Value & _
vbNewLine & vbNewLine & _
"Numarul de zile ramase pana la inceputul perioadei in care este programat auditul este de " & Cells(cell.Row, "J").Value & " ZILE!" & _
vbNewLine & vbNewLine & _
"Vei continua sa primesti acest email la fiecare 2 zile." & _
vbNewLine & vbNewLine & _
"Daca ai facut auditul deja, intra in fisierul DATE_AUDIT si scrie in coloana K cuvantul da. In coloana D culoarea trebuie sa devina in mod automat verde." & _
vbNewLine & vbNewLine & _
"Daca nu completezi in fisierul DATE_AUDIT, vei continua sa primesti acest email la fiecare 2 zile, chiar daca ai facut auditul."
			 .Display
		 End With
		 On Error GoTo 0
		 Set OutMail = Nothing
	 End If
Next cell
cleanup:
Set OutApp = Nothing
Application.ScreenUpdating = True
End Sub


Edited by MarianG, 29 January 2018 - 21:43.


#2
M_r

M_r

    Active Member

  • Grup: Members
  • Posts: 1,462
  • Înscris: 25.06.2005
Ok, pentru cei care mai au nevoie de raspunsul la aceasta intrebare sau carora li se pare interesanta si/sau utila, aceasta este codul care a functionat pentru mine, cu mentiunea ca nu am putut adauga cell.Value in tmpBody (cel dinafara loop-ului) si ca fata de varianta precedenta am adaugat HTML (sa arate mai bine si sa pot subilinia cateva lucruri). Fireste, va trebui sa adaptati acest macro situatiei voastre si fisierului vostru (coloanelor aferente):
Spoiler

In codul de mai sus, am facut cu BOLD partea care decide trimiterea mailului. Pentru testare, e bine sa lasati .Display fara apostrof in fata, cand vreti sa trimita mailuri, puneti apostroful in fata la .Display si eliminati-l de la .Send:
.Send
'.Display

Multumesc celor care si-au facut timp sa citeasca acest topic si celor care au incercat sa ma ajute (chiar daca nu au mai apucat sa posteze).

Ah, era sa uit. Pentru a face acest macro sa trimita mailuri la ore prestabilite si in zile prestabilite, in fiecare zi sau la 2 zile sau joia la ora 15:00 sau cat o fi, trebuie sa mai faceti cateva chestii si din moment ce suntem deja aici, am sa va spun ce, desi poate ar fi mai bine sa postez si in tutoriale:

1. In folderul in care tin acest excel (DATE_AUDIT.xlsm), am creat inca 2 fisiere: audit_run.bat si audit_script.vbs
2. Audit_run.bat contine urmatoarele:
cscript "CALEA INTREAGA UNDE TINETI FISIERELE[b]\audit_script.vbs[/b]" "CALEA INTREAGA UNDE TINETI FISIERELE[b]\DATE_AUDIT.xlsm[/b]"
exit
3. Audit_scipt.vbs (am facut cu bold numele macro-ului din VBA):
Spoiler
4. Totusi, pentru a face macro-ul sa ruleze la un interval de zile, ore etc., trebuie sa lucrati cu Task Scheduler. Eu am pus ca fisierul excel sa nu se deschida (cel putin nu in foreground) dar totusi va aparea un flash la o fereastra de cmd, dar de principiu n-ar trebui sa apucati sa vedeti altceva decat o scurta "clipire" a ferestrei pe ecran.
5. Deschideti Task Scheduler (start - run - cautati task scheduler // sau start - run - taskschd.msc - enter) si adaugati un nou task la care ii dati un nume si ii puneti o descriere (optionala).
6. In tab-ul Triggers, dati New si stabiliti cand sa inceapa sa ruleze, la ce ore, la cate zile sau in care zile din saptamana si jos de tot bifati Enabled (daca nu e deja bifat) si dati OK.
7. In tab-ul Actions, dati New si la Action selectati "Start a program". In campul "Program/script:" scrieti cmd si in campul "Add arguments (optional)" scrieti
/c start "DENUMIRE DORITA" /min "CALEA INTREAGA UNDE TINETI FISIERELE\audit_run.bat
8. De principiu celelalte optiuni din tab-urile Conditions si Settings ar trebui sa fie preselectate, la mine in tab-ul Conditions - Power sunt selectate primele 2 (Start the task only if the computer is on AC power" si "Stop if the computer switches to battery power" iar in tab-ul Settings sunt selectate "Allow task to be run on demand", "If the running task does not stop when requested, force it to stop".

Edited by MarianG, 29 January 2018 - 21:51.
format, edit command


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate