Impossible de faire fonctionner l'objet d'application Outlook

0

J'essaie d'écrire un programme qui répertorie les membres d'une liste de distribution de courrier électronique Outlook.

J'ai trouvé que VBA semble avoir des objets qui pourraient rendre cela possible, mais je n'ai pas encore réussi à le faire fonctionner. j'ai étudié cet article de Microsoft sur l'objet Application Outlook, celui-là à propos de GetDefaultFolder méthode, ainsi que de nombreux autres documents de référence, et ont élaboré le programme suivant:

Set Application = CreateObject("Outlook.Application")
Set myNameSpace = Application.GetNameSpace("MAPI") 
Set myFolder = myNameSpace.GetDefaultFolder(olFolderContacts) 
myFolder.Display

Cependant, lorsque je lance ceci en utilisant wscript ou cscript, je reçois ce qui suit:

Erreur d'exécution Microsoft VBScript: Appel ou argument de procédure non valide:   'myNameSpace.GetDefaultFolder'

Quelqu'un peut-il voir quel est le problème?

fireblood
la source

Réponses:

2

La raison pour laquelle votre code ne fonctionne pas, par exemple lorsque vous accédez à une bibliothèque avec une liaison tardive, par exemple. en utilisant CreateObject("Outlook.Application"), les énumérations intégrées à la bibliothèque ne sont pas disponibles.

Depuis que vous n'avez pas utilisé le Option Explicit directive, Excel a automatiquement déclaré olFolderContacts en tant que variable de type Variant avec une valeur de Empty. Cette est l'argument non valide auquel le message d'erreur fait référence.

Si vous souhaitez continuer à utiliser la liaison tardive, ajoutez le code suivant pour que les constantes soient disponibles:

  'v0.1.1
  ' Required if late binding Outlook
  ' (Note that this list excludes newer values available in Outlook 2010 or later)
  Private Enum OlDefaultFolders
    olFolderDeletedItems = ------------3
    olFolderOutbox = ------------------4
    olFolderSentMail = ----------------5
    olFolderInbox = ------------------(6)
    olFolderCalendar = ----------------9
    olFolderContacts = --------------(10)
    olFolderJournal = ----------------11
    olFolderNotes = ------------------12
    olFolderTasks = ------------------13
    olFolderDrafts = ----------------(16)
    olPublicFoldersAllPublicFolders = 18
    olFolderConflicts = --------------19
    olFolderSyncIssues = ------------(20)
    olFolderLocalFailures = ----------21
    olFolderServerFailures = --------(22)
    olFolderJunk = ------------------(23)
    olFolderRssFeeds = --------------(25)
    olFolderToDo = ------------------(28)
    olFolderManagedEmail = ----------(29)
  End Enum

ou coder en dur les valeurs:

'v0.1.0
Set OutlookApp = CreateObject("Outlook.Application")
Set myNamespace = OutlookApp.GetNameSpace("MAPI")
Set myFolder = myNamespace.GetDefaultFolder(10)
myFolder.Display

Notez que j'ai changé le nom de la variable pour l'objet Application Outlook afin d'éviter toute confusion avec l'objet intégré. Application objet.


Je trouve préférable, au moins lors de l'élaboration du code, d'utiliser la liaison anticipée. Pour ce faire, vous ajoutez une référence à la bibliothèque d'objets Outlook dans le projet:

Worksheet Screenshot

et en utilisant le code suivant:

'v0.1.0
Dim OutlookApp As Outlook.Application
Set OutlookApp = New Outlook.Application
Dim myNamespace As Outlook.Namespace
Set myNamespace = OutlookApp.GetNameSpace("MAPI")
Dim myFolder As Outlook.MAPIFolder
Set myFolder = myNamespace.GetDefaultFolder(olFolderContacts)
myFolder.Display

Un dernier conseil est de toujours utiliser le Option Explicit directive, et toujours déclarer explicitement toutes vos variables.

Le meilleur moyen de s’assurer que cela se produit est de définir le Require Variable Declaration option:

Worksheet Screenshot

De cette façon, le VBE insérera toujours la directive dans chaque module créé.

robinCTS
la source
Excellente réponse! J'ai utilisé l'exemple de quatre lignes que vous avez fourni après sayhing "ou coder en dur les valeurs" et cela fonctionne parfaitement. Je vous remercie!
fireblood
@fireblood De rien. N'oubliez pas que vous pouvez également inverser la liste de toutes les réponses, y compris celles acceptées, en cliquant sur le triangle gris pointant vers le haut, en haut à gauche de la réponse. Vous pouvez également upvoter toute question que vous trouvez utile aussi.
robinCTS
Réponse bien faite, j'ai voté. Je suis presque certain que cela aidera mon application de comptabilité (VB6), qui a récemment commencé à échouer avec son interface de contacts Outlook. J'avais déjà cherché des solutions, mais je n'avais trouvé aucune documentation sur ce problème si bien expliqué. Je donnerais ces 100 votes positifs si je le pouvais.
Bill Hileman
1
@ BillHileman Vous savez, vous pouvez toujours déposer une prime sur n'importe quelle question et l'attribuer à n'importe quelle réponse à cette question ;-) (La question doit avoir au moins deux jours avant de pouvoir le faire, bien que :-()
robinCTS
J'ai vérifié que le code que j'utilise est essentiellement identique à votre exemple, sauf que ma référence concerne la version 16, et non 12, ce qui est probablement mon problème. Je reçois l'actifX ne peut pas créer d'erreur d'objet. De mémoire, MS dit simplement que "cela se produit" sur certaines machines, soupir. create object renvoie la même erreur. Ce n’est pas très grave pour moi, mais je pourrais peut-être aller plus loin un jour. Merci pour l'offre.
Bill Hileman