Domanda Error: Timeout durante il recupero dei risultati della conversazione.

Gollum1

Nuovo utente
6 Agosto 2021
15
3
office 365
1
Ciao a Tutti,

Ci hanno trasferito le mail sull'infrastruttura M$, con outlook 365, e finalmente con parecchio spazio a disposizione.

Ho quindi trasferito il contenuto di anni di .pst dentro questo contenitore.

Naturalmente ci sono mail che sono ripetute 3 o 4 volte (ne ho trovata una che per qualche motivo era ripetuta ben 22 volte, ma la media è 3 o 4), mi sono costruito uno script VBA in outlook che analizzando le conversazioni, partendo da una mail, mi marca come duplicato (gli assegna una categoria duplicati) tutte quelle mail della conversazione che sono identiche alla mail originale e che si trovano in altri folder, per poi scegliere la prima del folder in esame come master, e tutte quelle successive le marca anch'esse come duplicati).

Tendenzialmente lo script funziona, l'ho provato su folder relativamente piccoli, con mail senza duplicati, con mail con duplicati in altri folder, e con mail con duplicati nello stesso folder, e le prove sono state tutte positive.

Ora, provando a lanciarlo su un folder di 3605 elementi, o continui timeout con l'errore che numericamente ha sempre valore diverso, ma come descrizione è sempre uguale a quello dell'oggetto di questo post.

mettendo un punto di debug sulla riga che stampa l'errore, il resume mi riporta poi sempre alla riga successiva alla riga 38, dal quale posso desumere, che il timeout è provocato dalla funzione
GetRowCount , che messa sotto osservazione, in quel frangente mi da sempre come risultato 1 (e dovrebbe essere corretta, visto che anche questo folder non dovrebbe in realtà avere duplicati, e quasi tutte le conversazioni sono limitate ad un solo item, sono messaggi di allarme che arrivano da apparati).

Guardando la documentazione ufficiale, c'é questo criptico messaggio:

GetRowCount on a large table will result in a performance impact. Due to MAPI restrictions (for example, memory constraints for large tables, simultaneous operations on the Table), GetRowCount may not be able to determine the number of rows in the Table, or it may only return an approximate row count. In these cases, GetRowCount will return an error. You should use appropriate error detection for GetRowCount to determine if the call returns an error.
Ok... ci può essere l'errore, perché potrebbe non essere in grado di trovare tutte le mail che compongono la conversazione (sopratuttto se ci sono più .pst agganciati, mi viene da pensare), ma come evito il timeout? preferirei che se ne fregasse, al massimo non mi marca qualche duplicato, ma diventa veramente ingestibile aspettare tutto questo tempo, perchè lo fa veramente per tante tante email (e sono sicurer che non hanno duplicati).

Allego il codice completo della sub.

Spero in qualche vostro suggerimento, almeno per capire il problema reale.

Grazie

checkDuplicateEmail:
Sub checkDuplicateEmail()
    ' Per ogni mail del folder, cerco quelle che fanno parte della sua conversazione e marco quelle che sono uguale alla mail in esame.
   
    Dim currentExplorer As Explorer
    Dim Selection As Selection
    Dim CurrentFolder As Outlook.Folder
    Dim objEmail_ As Outlook.MailItem
    Dim Conversation As Outlook.Conversation
    Dim ConvTable As Outlook.Table
    Dim ConvRow As Outlook.Row
    Dim ConvEmail As Outlook.MailItem
    Dim Original As Boolean
    Dim i As Double
    Dim CheckEvent As Variant

On Error GoTo ErrorHandler
   
    Call ResetParameters
   
    Set currentExplorer = Application.ActiveExplorer
    Set Selection = currentExplorer.Selection
    Set CurrentFolder = Selection.Parent.CurrentFolder
   
    Debug.Print "checkDuplicateEmail:    ESECUZIONE INIZIATA  "
   
    ' Non viene eseguito se non ci sono elementi.
    If CurrentFolder.Items.Count <> 0 Then
        Debug.Print "checkDuplicateEmail: Scansiono le "; CurrentFolder.Items.Count; " mail nel folder '"; CurrentFolder.FolderPath; "'"
        i = 1
        ' Scansiono tutti gli elementi del folder
        While i <= CurrentFolder.Items.Count
            Set objEmail_ = CurrentFolder.Items.Item(i)
            If objEmail_ .Class = olMail Then
                Set Conversation = objEmail_.GetConversation()
                If Not (Conversation Is Nothing) Then
                    Set ConvTable = Conversation.GetTable()
                    Debug.Print i; ")"; objEmail_  'ConvTable.GetRowCount; " email nella conversazione: ";
                    If ConvTable.GetRowCount > 1 Then
                        Original = False
                        While Not ConvTable.EndOfTable
                            Set ConvRow = ConvTable.GetNextRow
                            Set ConvEmail = Application.Session.GetItemFromID(ConvRow.Item(1))
                            If Not CheckCategoryExists(ConvEmail, "DUPLICATI") Then
                                If (objEmail_ = ConvEmail) And (objEmail_.ReceivedTime = ConvEmail.ReceivedTime) Then
                                    If ConvEmail.Parent.FolderPath <> objEmail_.Parent.FolderPath Then
                                        Call AddCategory(ConvEmail, "DUPLICATI")
                                    Else
                                        If Not Original Then
                                            Original = True
                                        Else
                                            Call AddCategory(ConvEmail, "DUPLICATI")
                                        End If
                                    End If
                                End If
                            End If
                            CheckEvent = DoEvents()
                        Wend
                    End If
                End If
            End If
            i = i + 1
            CheckEvent = DoEvents()
        Wend 'i < CurrentFolder.Items.Count
    End If
   
    Debug.Print "checkDuplicateEmail:    ESECUZIONE TERMINATA  "
    MsgBox "checkDuplicateEmail:    ESECUZIONE TERMINATA  "
   
   
On Error GoTo 0
   
    Set currentExplorer = Nothing
    Set Selection = Nothing
    Set CurrentFolder = Nothing
    Exit Sub
   
ErrorHandler:
    Debug.Print "Error checkDuplicateEmail: "; Err.Number; " - "; Err.Description
    Err.Clear
    Resume Next

End Sub 'checkDuplicateEmail
 

Gollum1

Nuovo utente
6 Agosto 2021
15
3
office 365
1
Sono sempre più demoralizzato dall'inadeguatezza di VBA per Outlook, un gestione degli oggetti che compongono l'infrastruttura di Outlook veramente pesante, e che manca di coerenza al suo interno.

Scusate lo sfogo… che non è sicuramente costruttivo… vorrei tanto essere smentito da qualcuno, ma di tutto quello che trovo nella rete, nulla funziona come dovrebbe… Esistono oggetti di Outlook che dovrebbero permettere di fare certe operazioni, ma si deve ovviare con workaround arzigogolati, perché in realtà non funzionano.

Sono io che non li capisco? possibile… ma allora sono veramente in buona compagnia… 😭
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!