vba - ¿Cuándo un MailItem no es un MailItem?
outlook-vba typeof (7)
escribí una función de manejo de mensajes en Visual Basic de Outlook (estamos usando Outlook 2003 y Exchange Server) para ayudarme a clasificar el correo electrónico entrante. Me funciona, excepto que algunas veces la regla falla y Outlook la desactiva. Luego vuelvo a activar la regla y la ejecuto manualmente en mi Bandeja de entrada para ponerme al día. La regla falla espontáneamente y se desactiva varias veces al día. Me encantaría solucionar esto de una vez por todas.
Aquí está el código desprovisto de la funcionalidad, pero le da una idea de cómo se ve:
Public WithEvents myOlItems As Outlook.Items
Public Sub Application_Startup()
'' Reference the items in the Inbox. Because myOlItems is declared
'' "WithEvents" the ItemAdd event will fire below.
'' Set myOlItems = Outlook.Session.GetDefaultFolder(olFolderInbox).Items
Set myOlItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub myOlItems_ItemAdd(ByVal Item As Object)
On Error Resume Next
If TypeName(Item) = "MailItem" Then
MyMessageHandler Item
End If
End Sub
Public Sub MyMessageHandler(ByRef Item As MailItem)
Dim strSender As String
Dim strSubject As String
If TypeName(Item) <> "MailItem" Then
Exit Sub
End If
strSender = LCase(Item.SenderEmailAddress)
strSubject = Item.Subject
rem do stuff
rem do stuff
rem do stuff
End Sub
Un error que recibo es "Type Mismatch" llamando a MyMessageHandler donde VB se queja de que Item no es un MailItem. De acuerdo, pero TypeName (Item) devuelve "MailItem", entonces, ¿cómo es que Item no es un MailItem?
Otro que recibo es donde aparece un correo electrónico con un tema vacío. La línea
strSubject = Item.Subject
me da un error Sé Item.Subject debe estar en blanco, pero ¿por qué es eso un error?
Gracias.
He escrito una función de manejo de mensajes en Visual Basic de Outlook (estamos usando Outlook 2003 y Exchange Server) para ayudarme a clasificar el correo electrónico entrante.
Me funciona, excepto que algunas veces la regla falla y Outlook la desactiva.
Luego vuelvo a activar la regla y la ejecuto manualmente en mi Bandeja de entrada para ponerme al día. La regla falla espontáneamente y se desactiva varias veces al día.
Me encantaría solucionar esto de una vez por todas.
Mi memoria está un tanto nublada al respecto, pero creo que un MailItem no es un MailItem cuando es algo así como un recibo de lectura. (Desafortunadamente, el código de VBA que demostró esto fue escrito en otro trabajo y no está disponible ahora).
También tuve un código escrito para procesar los mensajes entrantes, probablemente por la misma razón que usted (demasiadas reglas para Exchange o reglas demasiado complejas para el Asistente de reglas), y parece recordar que se encontró con el mismo problema que tenía, que algunos elementos parecían ser de un tipo diferente a pesar de que los estaba atrapando con algo como lo que escribiste.
Veré si puedo producir un ejemplo específico si me ayuda.
Este código me mostró los diferentes tipos de letra que estaban en mi bandeja de entrada:
Public Sub GetTypeNamesInbox()
Dim myOlItems As Outlook.Items
Set myOlItems = application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items
Dim msg As Object
For Each msg In myOlItems
Debug.Print TypeName(msg)
''emails are typename MailItem
''Meeting responses are typename MeetingItem
''Delivery receipts are typename ReportItem
Next msg
End Sub
HTH
Hay muchos tipos de elementos que se pueden ver en la Bandeja de entrada predeterminada.
En el procedimiento llamado, asigne el elemento entrante a una variable de tipo Object
. Luego use TypeOf
o TypeName
para determinar si es un MailItem
. Solo entonces su código debe realizar acciones que se apliquen a los correos electrónicos.
es decir
Dim obj As Object
If TypeName(obj) = "MailItem" Then
'' your code for mail items here
End If
Dim objInboxFolder As MAPIFolder
Dim oItem As MailItem
Set objInboxFolder = GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
For Each Item In objInboxFolder.Items
If TypeName(Item) = "MailItem" Then
Set oItem = Item
next
Uso el siguiente fragmento de código de VBA en otras aplicaciones de Office, donde se hace referencia directamente a la biblioteca de Outlook.
'' Outlook Variables
Dim objOutlook As Outlook.Application: Set objOutlook = New Outlook.Application
Dim objNameSpace As Outlook.NameSpace: Set objNameSpace = objOutlook.GetNamespace("MAPI")
Dim objFolder As MAPIFolder: Set objFolder = objNameSpace.PickFolder()
Dim objMailItem As Outlook.MailItem
Dim iCounter As Integer: iCounter = objFolder.Items.Count
Dim i As Integer
For i = iCounter To 1 Step -1
If TypeOf objFolder.Items(i) Is MailItem Then
Set objMailItem = objFolder.Items(i)
With objMailItem
etc.
¿por qué no utilizar un controlador de error simple para el código? Seriamente. Puede escribir un error por cada lectura de una propiedad u objeto que parece fallar. Luego haz que se reanude sin importar qué. No es necesario un manejo complejo de errores. Piense en una prueba que muestra un tema vacío. Como no sabe qué valor va a devolver, si lo hay, y parece haber un error en un sujeto vacío o en blanco, debe visualizarlo como una prueba simple con un posible error. Ejecute la prueba como una declaración if (una en la que obtendrá un error de todos modos) y pida al programa que reanude el error.
On Error Resume Next
If object.subject = Null ''produces an error when subject is null, otherwise allows a good read
strSubject = "" ''sets the subject grab string to a null or empty string as a string
Else
strSubject = object.subject ''Sets the subject grab string to the subject of the message/item
End If