2011-09-27 22 views
0

J'ai un script que j'ai reconstitué au fil du temps. Récemment, un plugin que nous devons utiliser dans Outlook a causé quelques problèmes. Fondamentalement, nous sommes sollicités deux fois car lorsque le plugin est utilisé, le courrier électronique est détruit et recréé avec un nom de fichier de pièce jointe spécifique. À ce stade, l'utilisateur est à nouveau invité. J'ai essayé de travailler dans une boucle For pour ignorer le script s'il trouve cette pièce jointe. Cependant, lorsque j'ai ajouté la boucle For, il semble que tout le script soit ignoré. J'ai une expérience limitée avec VBA et donc je suis sûr que c'est un problème avec ma syntaxe ou mon utilisation. Voir script ci-dessous:VBA Outlook Script

Private Sub Application_ItemSend _ 
(ByVal Item As Object, Cancel As Boolean) 
Dim strMsg As String 
Dim Atmt As Variant 

'strMsg = Item.Class 
If Item.Class = "43" Then 
    For Each Atmt In Item.Attachments 
     If VBA.Right(Atmt.FileName, 3) = ".sf" Then 
      GoTo NonEmailError 
     End If 
    Next Atmt 
    If Item.CC = "" Then 
     strMsg = "To recipients: " & Item.To & vbCrLf & _ 
     "Are you sure you want to send this message?" 
    Else 
     strMsg = "To recipients: " & Item.To & vbCrLf & _ 
     "Cc recipients: " & Item.CC & vbCrLf & _ 
     "Bcc recipients: " & Item.BCC & vbCrLf & _ 
     "Are you sure you want to send this message?" 
    End If 
Else 
    GoTo NonEmailError 
End If 
' Exit Sub 

' Ignore errors for now. 
On Error GoTo NonEmailError 

' Prompt user to fill in subject 
If Item.Subject = "" Then 
    MsgBox "You must enter a subject.", 48, "Empty Subject" 
    Cancel = True 
    GoTo NonEmailError 
End If 
' Exit Sub 

' Prompt user to verify E-Mails 
If MsgBox(strMsg, vbYesNo + vbQuestion _ 
    , "Send Confirmation") = vbNo Then 
    Cancel = True 
End If 
Exit Sub 

NonEmailError: 
' The item being sent was not an e-mail and so don't prompt the user anything 
Exit Sub 

End Sub 
+0

Quelques commentaires: 1) Les deux invites s'affichent-elles indépendamment du fait que le courrier électronique contient des pièces jointes ou non? 2) Quelle est la ligne associée à la première invite, et laquelle à la seconde? 3) Il est probablement une bonne idée de travailler sur un 'Outlook.MailItem' au lieu d'un' Object', avec 'Dim OLMI As Outlook.MailItem --- Si TypeName (Item) =" MailItem "Puis --- Set OLMI = Item --- 'Faites vos affaires --- End If'. –

Répondre

0

Je ne suis pas familier avec Outlook et VBA, mais ma première supposition dans ce cas est que item.class doit être comparée à la valeur numérique 43 plutôt que la valeur de chaîne littérale "43". La seule chose qui me donne une pause est que je m'attendrais à ce que l'instruction jette une erreur parce que "43" est le mauvais type pour Item.Class, mais cela peut refléter mon manque de familiarité avec le matériel.

Selon référence msdn, item.class (dans ce cas un mailItem) est une constante OlObjectClass et 43 est olMail. Il serait sans doute préférable de changer:

If Item.Class = "43" Then

à

If Item.Class = olMail Then

ou au moins:

If Item.Class = 43 Then

(voir: http://msdn.microsoft.com/en-us/library/bb208118%28v=office.12%29.aspx et http://msdn.microsoft.com/en-us/library/bb207137%28v=office.12%29.aspx)

+0

Avant de créer la "boucle For" pour tester le type de pièce jointe, le script fonctionnait correctement avec la classe définie à 43. – Untalented

+0

@Untalented - Même si je suis d'accord avec horatio. Je recommande de travailler sur un 'Outlook.MailItem' au lieu d'un' Object', en testant avec 'Item.Class' ou' TypeName (Item) ', voir mon commentaire à votre message. –

Questions connexes