VBProject.Reference msoutl.olb Office 2003 => 2002

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir à tous et toutes

Tiens me voilà dans un truc qui me fait perdre un certain temps, si ce n'est pas un temps certain !

Je résume, je peux travailler sous Office 2003 et Office 2002... Rien de bien fracassant...

J'ai un Programme qui fait ce genre de Chose :

Option Explicit

Const MailTo As String = 'Toto@xld.com'
Const MailCC As String = 'Zaza@xld.com; Titi@xld.com'

'=========================================================================
'        'Need reference to Microsoft Outlook xx Objects Library
'
'        'C:\\Program Files\\Microsoft Office\\OfficeXX\\msoutl.olb
'=========================================================================

Sub SendingDailyMail()
Dim OLApplication As Outlook.Application, OLMail As Outlook.MailItem
Dim Message As String
Dim TheDay As Date

TheDay =
Date

Message = 'Good Morning,' & vbCrLf & vbCrLf & _
= = = This is an automatic generated email = = = & vbCrLf & vbCrLf & _
Please find enclosed the Report for Transactions for  & Format(TheDay, 'DDDD') & _
  ' ' & Format(TheDay, 'DD/MM/YYYY') & vbCrLf & _
Best Regards & vbCrLf & '@+Thierry' & vbCrLf & vbCrLf


Set OLApplication = CreateObject('Outlook.Application')
Set OLMail = OLApplication.CreateItem(OLMailItem)
 
With OLMail
  .To = MailTo
  .CC = MailCC
  .Importance = olImportanceNormal
  .Subject = 'Daily Transactions Summary Reports (' & _
    Format(TheDay, 'YYYY-MM-DD') & ')'
  .Body = Message
  .Attachments.Add 'I:\\MC_PROD\\Reports\\Daily\\Test1.xls'
  .Attachments.Add 'I:\\MC_PROD\\Reports\\Daily\\Test1.pdf'
  .Categories = 'Daily'
  .OriginatorDeliveryReportRequested =
True
  .ReadReceiptRequested =
True
 
'.Send '<<<<<<<<<<<<<<<TO SEND DIRECTLY
&nbsp; .Display
'<<<<<<<<<<<<<TO SEE THE MAIL FIRST
&nbsp;
End With
&nbsp; &nbsp; &nbsp;
Set OLApplication = Nothing
Set OLMail = Nothing
End Sub


Jusque là rien de bien extraordinaire.... J'ai développé ceci sous Excel 2003...

Puis j'ai la bonne idée de faire des tests depuis un LapTop en réseau Wifi avec Office 2002 et Win XP Pro...

Paf !! la référence est manquante 'MISSING Microsoft Outlook 11.0 Objects Library...

Qu'à cela ne tienne je bascule manuellement sur la bonne référence (Microsoft Outlook 10.0 Objects Library) et je sauve mon Workbook, le ré-ouvre depuis ce LapTop, pas de soucis...

Je ré-ouvre depuis une autre machine avec Office 2003... Je fais tourner ma Sub 'SendingDailyMail'... No souci, je ferme, no souci, je ré-ouvre depuis 2002... No Souci...

Mais si jamais je sauve quand j'ai ce fichier sous 2003 et bien fini !! Ré_ouverture sous 2002 PAF !!! => MISSING Microsoft Outlook 11.0 Objects Library...

Cette satanée référence bascule vers la version la Plus haute à la sauvegarde et devient manquante sur une version Inférieure ensuite...

Donc à grand coup de renfort de Frédérique Sigonneau et Laurent Longre et tout ce que j'ai pu trouver sur le Net... j'ai écrit ceci :

Option Explicit

Sub ExcelVersionAnalysorForMSoutl()
Dim XLVersion As Byte
Dim OLLibraryPath As String
Dim LoadOutlookDLL As Boolean
Dim i As Byte

XLVersion = Val(Application.Version)

Select Case XLVersion
Case 9
&nbsp; &nbsp; OLLibraryPath = 'C:\\PROGRAM FILES\\MICROSOFT OFFICE\\OFFICE\\msoutl9.olb'
Case 10
&nbsp; &nbsp; OLLibraryPath = 'C:\\Program Files\\Microsoft Office\\Office10\\msoutl.olb'
Case 11
&nbsp; &nbsp; OLLibraryPath = 'C:\\Program Files\\Microsoft Office\\OFFICE11\\msoutl.olb'
Case Else
MsgBox 'Arf !!! ils ont sorti une nouvelle version d
'Office !!'
Exit Sub
End Select


With Application.VBE.ActiveVBProject.References
&nbsp; &nbsp; &nbsp; &nbsp;
For i = 1 To .Count
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If .Item(i).IsBroken = True Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If .Item(i).Name = 'Oultlook' Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Remove .Item(i)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LoadOutlookDLL =
True
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Exit For
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp; &nbsp;
Next i
&nbsp; &nbsp;
If LoadOutlookDLL = True Then .AddFromFile OLLibraryPath
End With
End Sub

Et je pensais m'en sortir avec un lancement dans le WorkBook_Open...

Et re Paf !!! Non j'ai bien VBE qui voit cette référence 'IsBroken', mais du coup j'ai ce message très sympathique :

'Complie Error' => Can't find Project or Library'
sur la Ligne :

If .Item(i).IsBroken = True Then

Ceci quand il a bouclé sur le 'i' à la position de cette fameuse référence à Outlook (que j'ai pris soin de mettre en dernière position de Priorité dans les références utilisées...) Par conséquent, isBroken, ne me semble pas adéquate, si il lui faut la référence à la Dll... (olb ici)

Je m'amuse à ce petit jeu depuis 3 bonnes heures, et j'avoue que c'est assez énervant, surtout que j'ai beau essayer dans tous les sens, mais à chaque fois Paf et Re-Paf !!

Est-ce que quelqu'un s'est déjà sorti de ce genre de galère, ou bien dois-je faire stopper systématiquement le déploiement d'Office 2003 tant qu'il restera des 2002 en exploitation ?

Je vous remercie d'avance pour vos essais, remarques ou suggestions...

Bonne Soirée
@+Thierry
 

deudecos

XLDnaute Impliqué
Bonsoir Thierry, le forum,

La je dois avouer sincerement que je compatis, a plus forte raison que les Pafs et Re pafs, je les collectionnes depuis que j'ai eu l'idee saugrenue de vouloir vous imiter vous autres les exceliens en puissance... ;) .
Enfin, ceci pour dire que j'ai confiance et que, meme si ce n'est toi ce sera ton 'frere' excelien qui trouvera la solution. et comme chacun se plait a le repeter, tout est question de patience....


Bonne chance a toi Thierry !

Bonne soiree

Olivier
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Olivier

Merci pour ta 'compaticence' !!! oui les Pafs ne peuvent se traîter qu'avec patience, ça c'est sûr !, un peu comme tendre l'autre joue pour le re-paf lol

Sinon cet algo d'enfer, il avance Olivier ? En tout cas tu auras capté pourquoi je n'avais pas trop de temps pour le générer ;)

Merci en tout cas

@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re bonsoir le Forum, Olivier

Bon alors je me suis débrouillé... Mais je trouve que les explications de Microsoft sont assez ambigues quand même...

Dans le cas d'un développement pouvant circuler de versions Ultérieures vers des version Antérieures et vice/versa, en fait il ne faut jamais faire instance aux Objets Directement :
Dim OLApplication As Outlook.Application, OLMail As Outlook.MailItem

Mais il faut simplement faire une une liaison tardive au lieu d'une liaison anticipée comme ci-dessus...

Huum :whistle:

En fait Microsoft explique pour ceci contourner ce problème :

'Une liaison tardive est recommandée pour l'automatisation de plusieurs versions d'une application Office depuis un client hors processus. L'implémentation initiale du membre révisé est également dans la nouvelle version de Microsoft Office et se trouve à la même position par rapport au début de l'interface. C'est pourquoi, un client Automation compilé avec une bibliothèque de types Office 97 fonctionne avec l'application Office 2000 ou version ultérieure'....

Donc dans le sens 'montant' no problèmo...

Mais ensuite je lis ceci :
'Si vous développez un client Automation pour Microsoft Access 97 et 2000, vous ne devez pas utiliser une liaison anticipée : une liaison tardive est recommandée. Le modèle d'objet Access 2000 a été modifié de sorte à interrompre la compatibilité binaire (vtable) et Dispid. Toute application client qui utilise une liaison anticipée ou Dispid avec Access 97 peut cesser de fonctionner correctement en cas d'utilisation avec Access 2000....'


Enfin en bref il ne faut pas faire d'instance aux Objects directement si l'application est en circulation sur différentes version d'Office...

Par conséquent, je ne déclare aucune référence à la librairie Outlook, et mon code donne ceci :
'Option Explicit '<<<<< NB DEVIENT INTERDIT

Const MailTo As String = 'Toto@xld.com'
Const MailCC As String = 'Zaza@xld.com; Titi@xld.com'

'===========================================================================
'&nbsp; &nbsp; &nbsp; &nbsp; 'NO Need reference to Microsoft Outlook xx Objects Library
'
'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; => AS USING LATE BINDING
' One problem with early binding is that most type library aware compilers
' will 'auto-update' your reference to the latest library that is available
' on the system. This means that if you need to use the earliest version
' of the library in order to work with multiple versions of an Office
' application, you must explicitly specify the older library in your project.
'
' MS Article :&nbsp; Q244167 /// words:&nbsp; kbinfo kbautomation KB244167
' support.microsoft.com/default.aspx?scid=kb;EN-US;244167
'===========================================================================

Sub SendingDailyMail()
Dim OLApplication As Object, OLMail As Object
Dim Message As String
Dim TheDay As Date

TheDay =
Date

Message = 'Good Morning,' & vbCrLf & vbCrLf & _
= = = This is an automatic generated email = = = & vbCrLf & vbCrLf & _
Please find enclosed the Report for Transactions for&nbsp; & Format(TheDay, 'DDDD') & _
&nbsp; ' ' & Format(TheDay, 'DD/MM/YYYY') & vbCrLf & _
Best Regards & vbCrLf & '@+Thierry' & vbCrLf & vbCrLf


Set OLApplication = CreateObject('Outlook.Application')
Set OLMail = OLApplication.CreateItem(OLMailItem)
&nbsp;
With OLMail
&nbsp; .To = MailTo
&nbsp; .CC = MailCC
&nbsp; .Importance = olImportanceNormal
&nbsp; .Subject = 'Daily Transactions Summary Reports (' & _
&nbsp; &nbsp; Format(TheDay, 'YYYY-MM-DD') & ')'
&nbsp; .Body = Message
&nbsp;
'.Attachments.Add 'I:\\MC_PROD\\Reports\\Daily\\Test1.xls'
&nbsp;
'.Attachments.Add 'I:\\MC_PROD\\Reports\\Daily\\Test1.pdf'
&nbsp; .Categories = 'Daily'
&nbsp; .OriginatorDeliveryReportRequested =
True
&nbsp; .ReadReceiptRequested =
True
&nbsp;
'.Send '<<<<<<<<<<<<<<<TO SEND DIRECTLY
&nbsp; .Display
'<<<<<<<<<<<<<TO SEE THE MAIL FIRST
&nbsp;
End With
&nbsp; &nbsp; &nbsp;
Set OLApplication = Nothing
Set OLMail = Nothing
End Sub



C'est OK !!!!

Je viens de faire tourner ce code sur 97 / 2000 / 2002 et 2003 et en sens descendant aussi en sauvant le fichier entre chaque machine.

Ce que je suggère, lors d'un développement, faite quand même l'instance aux Objets dans les déclarations (liaison anticipée) pour pouvoir bénéficier de toutes les propriétés et méthodes s'afférant à l'objet ainsi que l'aide... Une fois que çà tourne sur votre configuration, 'saborder' les déclarations précises sur les Objets au profit de simples déclaration As Object... l'Option Explicit risque aussi d'avoir besoin d'être sabordé aussi... Et of course décochet la référence à la librairie de l'objet...

Voilà encore un sacré dimanche, et je n'ai pas du tout fini mon projet, mais au moins je suis moins bête qu'hier !!!

Bien à vous
@+Thierry

EDITION !!! Schmilblick avec l'URL de MS

La voilà à part :
http://support.microsoft.com/default.aspx?scid=kb;EN-US;244167

Message édité par: _Thierry, à: 19/06/2005 20:43
 

deudecos

XLDnaute Impliqué
Bonsoir Thierry, le forum,

Heureux que tu ais pu ajouter quelques nouvelles notions parmis le milliers que cintiennent deja tes neurones.

En ce qui concerne mon algo, j'avais plein de courage, mais une autre urgence histoire de me rendre utile a un excelien dans la detresse (entre nous peut etre est ce pire maintenant :woohoo: )
J'ai donc remis mon algo a demain, on dit souvent que la nuit porte conseil, je vais essayer d'en profiter.

Bonne soiree

Olivier
 

Discussions similaires

Réponses
14
Affichages
621

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof