Lancer du VBA depuis du VBScript [Résolu]

cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 27 juil. 2007 à 10:56 - Dernière réponse : cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention
- 30 juil. 2007 à 11:33
Bonjour à tous,

Je cherche à lancer depuis un formulaire Outlook une macro qui rapatrie des informations vers le formulaire. Cette macro est donc bien sûr en VBA.
L'idée est de lancer la macro non pas depuis un bouton de la barre d'outils mais depuis le formulaire lui-même donc depuis du VBScript.

Actuellement, je fais la chose suivante:
<li>La macro d'appelle InsertionInfos</li><li>Dans CetteSessionOutlook, j'ai ajouté:</li>Public Sub InserInfos()
    Call InsertionInfos
End Sub

<li>Le code utilisé dans le formulaire est :</li>Sub CommandButton1_Click()
    Application.InserInfos
End Sub

Ainsi le Bouton appelle InserInfos qui lance la macro.

Malheureusement, ça ne semble marcher que si ma macro a déjà été exécutée ! Quand j'ouvre le formulaire, le bouton est inopérant. Il me faut d'abord lancer la macro "à la main" ou lancer VB Editor et là ça marche.
A note que si je mets des MsgBox, une MsgBox placée  dans le code du bouton avant l'appel à InserInfos fonctionne, alors que celle placée dans InserInfos ne marche pas, c'est donc l'appel à InserInfos depuis le VBS qui est foireux.

Des idées ?

Merci
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 30 juil. 2007 à 09:29
3
Merci
VBA s'exécute, oui, mais si on l'appelle comme du VBA, par ex par un item de la barre d'outils. VBS lui, s'exécute dans les forms. Le fond du pb c'est que je veux lancer du VBA depuis le VBS or d'après Microsoft (voir plus haut http://support.microsoft.com/kb/221827 ) ça ne marche que si le composant VBA a été initialisé au préalable. Mais j'ai ptet trouvé une astuce: passer par une macro pour créer le nouveau mail et de la sorte lancer VBA.

Merci cs_Piksou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 120 internautes ce mois-ci

Commenter la réponse de cs_Piksou
cs_JMO 1854 Messages postés jeudi 23 mai 2002Date d'inscription 22 juin 2018 Dernière intervention - 27 juil. 2007 à 12:12
0
Merci
 Bonjour à tous

Il y a la possiblité d'écrire et d'activer la macro par un script vbs.

Exemple:

Set sh = WScript.CreateObject("WScript.Shell")
on error resume next
sh.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\accessVBOM",1,"REG_DWORD"
on error goto 0

Set exl = WScript.CreateObject("excel.Application")
exl.Visible = True 'false
set fichxl=exl.workbooks.add

Set mdle = fichxl.VBProject.VBComponents.Add(1)

num=0
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function GetDC Lib ""user32"" (ByVal hwnd As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function TextOut Lib ""gdi32"" Alias ""TextOutA"" ( _ "
num=num+1:mdle.CodeModule.InsertLines num, "     ByVal hdc As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal x As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal y As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal lpString As String, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal nCount As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function SetTextColor Lib ""gdi32"" ( _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal hdc As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal crColor As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function SetBkMode Lib ""gdi32"" ( _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal hdc As Long, _ "
num=num+1:mdle.CodeModule.InsertLines num, "ByVal nBkMode As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function SetRect Lib ""user32"" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Declare Function DrawText Lib ""user32"" Alias ""DrawTextA"" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long"
num=num+1:mdle.CodeModule.InsertLines num, "Private Type RECT"
num=num+1:mdle.CodeModule.InsertLines num, "    Left As Long"
num=num+1:mdle.CodeModule.InsertLines num, "    Top As Long"
num=num+1:mdle.CodeModule.InsertLines num, "    Right As Long"
num=num+1:mdle.CodeModule.InsertLines num, "    Bottom As Long"
num=num+1:mdle.CodeModule.InsertLines num, "End Type"

num=num+1:mdle.CodeModule.InsertLines num, "Sub ecriture_en_rouge_sur_fond_transparent()"
'num=num+1:mdle.CodeModule.InsertLines num, "Msgbox now"
num=num+1:mdle.CodeModule.InsertLines num, "Dim rct As RECT"
num=num+1:mdle.CodeModule.InsertLines num, "fen = GetDC(0)"
num=num+1:mdle.CodeModule.InsertLines num, "SetRect rct, 250, 250, 500, 500"
num=num+1:mdle.CodeModule.InsertLines num, "Call SetBkMode(fen, 1) "
num=num+1:mdle.CodeModule.InsertLines num, "Call SetTextColor(fen, vbRed)"
num=num+1:mdle.CodeModule.InsertLines num, "txt = ""Avec les fonctions API, on peut écrire n'importe où sur l'écran. On peut utiliser les API en VBScript en les lançant sous VBA Excel"""
num=num+1:mdle.CodeModule.InsertLines num, "Call DrawText(fen, txt, Len(txt), rct, &H10)"
num=num+1:mdle.CodeModule.InsertLines num, "End Sub"

exl.Run "ecriture_en_rouge_sur_fond_transparent"
fichxl.close(false)
exl.quit

Set fichxl=nothing
set mdle=nothing
set exl=nothing
set sh=Nothing

jean-marc
Commenter la réponse de cs_JMO
cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 27 juil. 2007 à 12:26
0
Merci
Mais là tu lances ton code dans Excel non ? Moi je suis dans Outlook et le code doit être lancé dans Outlook pour pouvoir travailler sur le mail actuellement en cours d'édition.

J'ai au passage trouvé la raison de mon pb:
http://support.microsoft.com/kb/221827

The reasons to not use this functionality include, but are not necessarily limited to:
<li>By default, Outlook Visual Basic for Applications is not initialized, for performance reasons, when you start Outlook. This means that if you start Outlook, open an item, and run the VBScript code, it will produce an error because Visual Basic for Applications is not available at that time.</li>Donc mon pb c'est d'initialiser le VBA d'Outlook depuis Outlook et je vois pas comment faire...
Commenter la réponse de cs_Piksou
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 27 juil. 2007 à 12:34
0
Merci
Bonjour
Dans un formulaire Outlook l'objet message c'est "Item" et l'événement décelchant le lancement de script à l'ouverture c'est "Open"

Donc , je verrai bien une routine du type

Sub Item_Open()
Set objSession = CreateObject("mapi.session")

'le code pour ajouter des données dans les champs du formulaire
....
End sub
Commenter la réponse de cs_loulou69
cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 27 juil. 2007 à 12:52
0
Merci
Oui oui, ma macro commence d'ailleirs par:

Dim myMail As MailItem
Set myMail = ActiveInspector.CurrentItem

et après je joue avec et ça marche bien, tu as accès à toutes les propriétés de tous les composants.

Mais je ne veux pas lancer la macro direct, ça doit être à la demande, avec un bouton. Si j'utilise un bouton dans la barre d'outils, pas de pb mais c'est ch**nt à déployer et en plus petit et moins logique, je préfèrerais nettement un bouton dans le form, donc en VBScript et c'est là que je dois lancer le VBA depuis le VBS. Genre instancier un objet pour VBA et l'activer ?
Commenter la réponse de cs_Piksou
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 27 juil. 2007 à 16:13
0
Merci
Je n'ai pas beaucoup d'expérience sur les formulaires Outlook alors peut-être
pourquoi " Application.InserInfos", Et plus simplement, un simple "call"

Sub CommandButton1_Click()
    Call InserInfos()
End Sub
Commenter la réponse de cs_loulou69
cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 27 juil. 2007 à 16:17
0
Merci
Je suis pas expert non plus en fait, je pompe les exemples Microsoft :-D
Si j'ai bien pigé tu ne peux pas appeler direct le VBA depuis le VBS, il faut "tricher" en utilisant le Outlook Objetct Model, tu crées une mini macro qui devient un membre de l'objet ThisOutlookSession et celui là semble partagé entre VBA et VBS.
Sauf que pour ça il faut que le moteur VBA soit démarré :-/
Commenter la réponse de cs_Piksou
cs_loulou69 672 Messages postés mercredi 22 janvier 2003Date d'inscription 2 juin 2016 Dernière intervention - 27 juil. 2007 à 16:44
0
Merci
On ne va pas avancé car pour moi je me reconnecterai lundi matin..

VBA s'exécute toujours dans Outlook sauf si me le paramétrage de la sécurité des Macros est Elevé sinon en sécruité basse ou moyenne pas de problème.
VBScript est un sous ensemble de VBA à peu près le niveau de VB dans une version antérieure à la 6 (soit 4 ou 5) ou les variable ne sont pas typées. Sauf peut être que certaines fonctions inclusent dans des bibliothèques chargés en référence dans VB ou VBA doivent être chargé par une méthode spécifique en VBS mais c'est sûr au niveau du code tout n'est pas identique, VBScript est un sous-ensemble de VB6 comme VBA en est un.
Commenter la réponse de cs_loulou69
cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 30 juil. 2007 à 09:45
0
Merci
Eh m***e ça marche toujours pas :-/
Une macro me crée mon nouveau mail, ça devrait suffire si j'en juge par l'article de la KB Microsoft :-/
Commenter la réponse de cs_Piksou
cs_Piksou 7 Messages postés vendredi 27 juillet 2007Date d'inscription 30 juillet 2007 Dernière intervention - 30 juil. 2007 à 11:33
0
Merci
J'avais fait n'importe quoi, c'est bon, ça marche
Merci à tous pour votre aide
Commenter la réponse de cs_Piksou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.