› Sviluppare funzionalita su Microsoft Office con VBA › Creazione eventi Outlook da dati Excel
-
AutoreArticoli
-
Buonasera,
ho trovato sul forum la seguente discussione: https://www.excelvba.it/Forum/story/Excel_e_gli_applicativi_Office/Gestione_Calendar_Outlook_tramite_Excel.html
premettendo che devo creare un qualcosa di molto simile a quanto descritto nel link precedente, il mio problema sorge soltanto dopo la prima esecuzione della macro: i dati inseriti in Excel prima dell'esecuzione, vengono trasformati in eventi Outlook e, se ci sono eventi uguali già inseriti, o li salta o li aggiorna; ma, dalla seconda esecuzione in poi, se la prima riga del file Excel contiene un evento non ancora inserito, la macro lo inserisce e controlla anche le righe successive (inserendo eventualmente anche quelle), se, invece, la prima riga contiene un evento già inserito, la macro si ferma lì e non controlla le altre righe. Così, se aggiorno il file Excel ed inserisco delle righe nuove al di sotto di quelle originarie, la macro non mi crea più i rispettivi eventi Outlook.
Detto ciò, grazie in anticipo a chiunque mi aiuterà.
Buona serata
P.S. dimenticavo di dire che sto utilizzando il codice di vecchio frac (presente nella discussione linkata).
Bella discussione quella, impegnativa, mi ricordo. Certo è fuori contesto ma possiamo farcela a capire cosa serve a te... magari puoi allegare un pezzo di file con lo scenario e l'obiettivo da raggiungere 🙂 Così vediamo anche il codice che hai scritto tu e vediamo che problemi ci sono.
<u>Purtroppo non ho il file con me, ma sto adoperando esattamente il codice scritto da te. Ho cambiato giusto i numeri delle colonne per fargli trovare i dati corretti. Dalle prove che ho effettuato, mi è parso di capire che il problema sorge nel momento in cui controlla il subject: se la prima riga Excel ha un subject non inserito, fa gli altri controlli e poi inserisce l'evento proseguendo con le righe successive, ma se ha un subject già inserito, si ferma alla prima riga e non controlla le successive. Questo, come dicevo, solo dopo aver aggiunto nuove righe al file Excel, mentre, alla prima esecuzione, qualsiasi sia il numero e la disposizione delle righe, funziona perfettamente.</u>
Allora devo rileggere meglio quel thread e capire il problema, se il codice si adatta bene anche a te, meglio... riutilizzare è meglio che reinventare 🙂
Tanto per cominciare a eliminare dubbi, dove comincia il ciclo
For Each v In Range("A1").CurrentRegion.Rows
sei certo che la base dati (l'indirizzario con l'elenco eventi) sia integra, cioè non ci siano righe vuote in mezzo?
Riesco a seguire il flusso del mio vecchio codice, però servirebbe molto avere sottomano la tua struttura dati per poter fare qualche test. Così alla cieca non riesco :/
Domani provo a farti avere il file.
Comunque, avevo pensato anch'io agli spazi vuoti, leggendo "CurrentRegion", ma nel file Excel non ce ne sono.
In pratica, ho una situazione di questo tipo:
Subject - Body - Start
1 ...........................
2 ...........................
3 ...........................
avvio la macro e mi carica gli eventi (se la eseguo due volte, non li inserisce nuovamente, quindi, i controlli dovrebbero andare);
poi, aggiungo dei dati in una nuova riga:
Subject - Body - Start
1 ...........................
2 ...........................
3 ...........................
4 ........................... <----
avvio nuovamente la macro ed ecco che se la riga 1 non è stata inserita su Outlook, inserisce sia quella che la numero 4, ma, se la riga 1 ha già il relativo evento, la 4 non la inserisce (probabilmente esegue il controllo solo sulla prima riga e poi si ferma).
Questo avviene qualsiasi sia la posizione della nuova stringa (riga 2, 3, 4, ecc...).
Ho ricreato al volo il file e mi si presenta lo stesso problema dell'originale, quindi, credo dovrebbe andare bene per le prove.
Allegati:
You must be logged in to view attached files.Ok bene appena riesco mi dedico 🙂
Uh mi ero perso questo thread. Spero di riuscire ad applicarmi, non ho avuto tempo ultimamente.
Dunque, ho controllato il codice nel file che hai allegato e (pur non potendolo provare qui a casa perchè non ho Outlook), credo di notare questo: se viene trovato un evento con lo stesso soggetto definito nel foglio, la variabile bFound viene impostata su True, il che impedisce poi la creazione di eventi successivi (if not bFound Then ...). Il problema è che ad ogni assaggio la variabile bFound rimarrà su True, impedendo la creazione anche successiva di nuovi eventi. La soluzione è, semplicemente, settare bFound a False ad ogni giro.
Modifica quindi il codice di aggiornaScadenze come segue:
... '---- check For Each ItemAppt In fdrCalendar.Items bFound = False ' <---- If ItemAppt.Subject = Trim(v.Cells(1)) Then bFound = True 'trovato subject uguale: verifico se il corpo è uguale, se diverso lo aggiorno ...
Ciao,
ho provato, ma adesso, se eseguo la macro due volte consecutivamente, mi crea nuovamente gli stessi eventi su Outlook. La cosa non si verifica solo se, prima di eseguire per la seconda volta la macro, aggiungo una nuova stringa di dati al file Excel.
Ciao,
ho fatto qualche prova e credo che il problema sia questo: lanciata la macro la prima volta e creati gli eventi (il problema si presenta soltanto se sono più di uno), nel lanciarla la seconda volta, questa confronta il primo evento con la prima riga di Excel, vede che è uguale e non lo reinserisce. A questo punto, invece di passare all'evento Outlook successivo, continua a confrontare il primo, ma, questa volta, con la seconda riga di Excel, così, vede che sono diversi e lo reinserisce. Questo si ripete tutte le volte, così che ogni volta che si lancia la macro, vengono ricreati tutti gli eventi.
buongiorno a tutti, ho preso spunto dal codice che avete allegato all'inizio per la gestione di un foglio excel con outlook, ho solo un problema che mi piacerebbe vedere con voi, ho messo come vincolo la data e l'ora di fine del meeting, ma nel momento in cui modifico la data di fine meeting non mi aggiorna la riunione in outlook, sapete aiutarmi?
allego codice grazie mille in anticipo
Option Explicit
Sub aggiornaScadenze_VF()
Dim v As Variant
Dim OutApp As Object
Dim fdrCalendar As Object
Dim ItemAppt As Object
Dim i As Long, j As Long
Dim bFound As BooleanSet OutApp = CreateObject("Outlook.Application")
Set fdrCalendar = OutApp.GetNamespace("MAPI").GetDefaultFolder(9) '9 = olFolderCalendarOutApp.Session.Logon
Sheets("Foglio1").Select
For Each v In Range("A1").CurrentRegion.Rows
If v.Row > 1 Then
If Trim(v.Cells(3)) = "" Then
MsgBox "il documento " & v.Cells(1) & " non ha una data scadenza", vbInformation, "campo obbligatorio"
Else
'---- check
For Each ItemAppt In fdrCalendar.Items
If ItemAppt.Subject = Trim(v.Cells(1)) Then
bFound = True
'trovato subject uguale: verifico se il corpo è uguale, se diverso lo aggiorno
If ItemAppt.Body <> Trim(v.Cells(2)) Then
ItemAppt.Body = Trim(v.Cells(2))
ItemAppt.Save
j = j + 1
End If'data di scadenza non uguale all'appuntamento già inserito:
'cancella appuntamento esistente e lo reinserisce in nuova posizione
If ItemAppt.Start <> v.Cells(3) Then
ItemAppt.End = v.Cells(4)
ItemAppt.Delete
Call CreateItem(OutApp, v)
j = j + 1
End If
End If
Next
'--------------------
If Not bFound Then
Call CreateItem(OutApp, v)
i = i + 1
bFound = False
End If
End If
End If
NextSet OutApp = Nothing
MsgBox "Ho inserito " & i & " scadenze, ho modificato " & j & " scadenze"
End Sub
Private Sub CreateItem(olApp As Object, v As Variant)
Dim OutCalendar As Object
Set OutCalendar = olApp.CreateItem(1) 'nuovo appuntamento
With OutCalendar
.AllDayEvent = False
.Start = Trim(v.Cells(3)) 'data scadenza
.End = Trim(v.Cells(4)) 'data fine riunione
.Subject = Trim(v.Cells(1)) 'tipo documento
.Body = Trim(v.Cells(2)) 'note documento
.ReminderMinutesBeforeStart = 15
.ReminderSet = True
.Recipients.Add ("mattiaponkia@hotmail.it")
.MeetingStatus = 1 ' 1 = olMeeting
.Recipients.ResolveAll
.Send
.Save
End With
Set OutCalendar = Nothing
End Sub -
AutoreArticoli