Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tester existance de word ou Excel

14 réponses
Avatar
Pascal
bonjour,

Quel est d'après vous le meilleur moyen de tester l'existence de WORD et/OU
EXCEL sur le pc
je fais ceci pour word, est-ce correct? quelque soit la version installée?
merci d'avance
Pascal


On Error Resume Next
' récupération de l'erreur
Set wd = GetObject(, "Word.Application")

If Err.Number <> 0 Then
'Word existe
Set wd = CreateObject("Word.Application")
End If

Err.Clear

10 réponses

1 2
Avatar
Jacques93
Bonjour Pascal,
Pascal a écrit :
bonjour,

Quel est d'après vous le meilleur moyen de tester l'existence de WORD
et/OU EXCEL sur le pc
je fais ceci pour word, est-ce correct? quelque soit la version installée?
merci d'avance
Pascal


On Error Resume Next
' récupération de l'erreur
Set wd = GetObject(, "Word.Application")

If Err.Number <> 0 Then
'Word existe
Set wd = CreateObject("Word.Application")
End If

Err.Clear




Juste une petite remarque : si Word est présent, et qu'une instance est
déjà active :

Set wd = GetObject(, "Word.Application")

te renverra un pointeur sur cette instance. et le CreateObject en créera
une nouvelle. Donc tout dépend de ce que tu désires faire. Pour voir les
différente possibilités, tu peux faire :

Dim wd As Object

On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
' Word existe peut être, mais pas d'instance lancée
Set wd = CreateObject("Word.Application")
If wd Is Nothing Then
'Word n'est pas présent
MsgBox "Word non trouvé"
Else
' Word est présent et un nouvelle instance est crée
MsgBox "Lancement de Word"
wd.Visible = True
End If
Else
' Word existe et une instance est lancée
MsgBox "Word déjà lancé"
End If
Err.Clear

NB : tu peux combiner le code Err (429), et le wd Is Nothing
--
Cordialement,

Jacques.
Avatar
Jean-marc
Pascal wrote:
bonjour,

Quel est d'après vous le meilleur moyen de tester l'existence de WORD
et/OU EXCEL sur le pc
je fais ceci pour word, est-ce correct? quelque soit la version
installée? merci d'avance
Pascal


On Error Resume Next
' récupération de l'erreur
Set wd = GetObject(, "Word.Application")

If Err.Number <> 0 Then
'Word existe
Set wd = CreateObject("Word.Application")
End If

Err.Clear



Hello,

Plusieurs méthodes sont en effet possible.

Ce que tu fais est correct sur le principe,
et fonctionnera en effet avec toutes les versions.

Il serait sans doute plus joli d'écrire une fonction
dédiée et de faire comme cela:

Private Function WordExists() As Boolean
Dim Wd As Object

On Error GoTo WordExists_ERR

Set Wd = GetObject(, "Word.Application")
WordExists = True

WordExists_END:
Exit Function

WordExists_ERR:
Resume WordExists_END
End Function

Puis pour l'appel de la fonction :

Dim bRet As Boolean
Dim Wd As Object

bRet = WordExists()

If bRet Then
MsgBox "Word trouve"
Set Wd = CreateObject("Word.application")
' ...
Wd.Quit
Set Wd = Nothing
Else
MsgBox "pas de Word installé"
End If

Mais comme on le voit dans l'article
http://faq.vb.free.fr/index.php?question4,
le mieux est quand même d'utiliser le early binding quand
c'est possible.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
>Jean-marc wrote:


...

C'est Jacques qui a raison, j'ai répondu trop vite.
Le getObject() n'est pas une bonne façon de tester
l'existence de Word.

Et il a encore raison en disant de combiner 429 et nothing.

Tu peux donc oublier mon post précédent, en tout cas le code de
la fonction WordExists. Il pourrait devenir ceci:

Private Function WordExists() As Boolean
Dim Wd As Object

On Error GoTo WordExists_ERR

Set Wd = CreateObject("Word.Application")
Wd.Quit
Set Wd = Nothing
WordExists = True

WordExists_END:
Exit Function

WordExists_ERR:
Resume WordExists_END
End Function



--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Pascal
merci à vous deux pour ces excellentes réponses
j'en apprend beaucoup ici et vous en remercie

Pascal


"Pascal" a écrit dans le message de news:
%
bonjour,

Quel est d'après vous le meilleur moyen de tester l'existence de WORD
et/OU EXCEL sur le pc
je fais ceci pour word, est-ce correct? quelque soit la version installée?
merci d'avance
Pascal


On Error Resume Next
' récupération de l'erreur
Set wd = GetObject(, "Word.Application")

If Err.Number <> 0 Then
'Word existe
Set wd = CreateObject("Word.Application")
End If

Err.Clear





Avatar
Pascal
hello jacques merci pour la réponse
mais pourquoi cette procédure ne fonctionne pas pour EXCELL
malgré le remplacement par GetObject(, "Excel.Application")
Excell travaille differement?

bà Toi

"Jacques93" a écrit dans le message de news:

Bonjour Pascal,
Pascal a écrit :
bonjour,

Quel est d'après vous le meilleur moyen de tester l'existence de WORD
et/OU EXCEL sur le pc
je fais ceci pour word, est-ce correct? quelque soit la version
installée?
merci d'avance
Pascal


On Error Resume Next
' récupération de l'erreur
Set wd = GetObject(, "Word.Application")

If Err.Number <> 0 Then
'Word existe
Set wd = CreateObject("Word.Application")
End If

Err.Clear




Juste une petite remarque : si Word est présent, et qu'une instance est
déjà active :

Set wd = GetObject(, "Word.Application")

te renverra un pointeur sur cette instance. et le CreateObject en créera
une nouvelle. Donc tout dépend de ce que tu désires faire. Pour voir les
différente possibilités, tu peux faire :

Dim wd As Object

On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
' Word existe peut être, mais pas d'instance lancée
Set wd = CreateObject("Word.Application")
If wd Is Nothing Then
'Word n'est pas présent
MsgBox "Word non trouvé"
Else
' Word est présent et un nouvelle instance est crée
MsgBox "Lancement de Word"
wd.Visible = True
End If
Else
' Word existe et une instance est lancée
MsgBox "Word déjà lancé"
End If
Err.Clear

NB : tu peux combiner le code Err (429), et le wd Is Nothing
--
Cordialement,

Jacques.


Avatar
Jean-marc
Pascal wrote:
hello jacques merci pour la réponse
mais pourquoi cette procédure ne fonctionne pas pour EXCELL
malgré le remplacement par GetObject(, "Excel.Application")
Excell travaille differement?



Non, Excel fonctionne identiquement.
Tu as bien écrit "Excel.Application" ?

En tout cas la fonction suivante (la même que pour
Word) fonctionne parfaitement (testé bien sur):

Private Function ExcelExists() As Boolean
Dim Wd As Object

On Error GoTo ExcelExists_ERR

Set Wd = CreateObject("Excel.Application")
Wd.Quit
Set Wd = Nothing
ExcelExists = True

ExcelExists_END:
Exit Function

ExcelExists_ERR:
Resume ExcelExists_END
End Function

Peut etre as tu fait une faute de frappe ?

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Pascal
hello jean-marc,
autant pour moi
c'est bien une faute de frappe, ai oublié la virgule avant
"Excel.application" navré !
merci


"Jean-marc" a écrit dans le message
de news: 472a4af8$0$29264$
Pascal wrote:
hello jacques merci pour la réponse
mais pourquoi cette procédure ne fonctionne pas pour EXCELL
malgré le remplacement par GetObject(, "Excel.Application")
Excell travaille differement?



Non, Excel fonctionne identiquement.
Tu as bien écrit "Excel.Application" ?

En tout cas la fonction suivante (la même que pour
Word) fonctionne parfaitement (testé bien sur):

Private Function ExcelExists() As Boolean
Dim Wd As Object

On Error GoTo ExcelExists_ERR

Set Wd = CreateObject("Excel.Application")
Wd.Quit
Set Wd = Nothing
ExcelExists = True

ExcelExists_END:
Exit Function

ExcelExists_ERR:
Resume ExcelExists_END
End Function

Peut etre as tu fait une faute de frappe ?

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Gloops
Bonjour,

Sur le principe très bien, mais une chose m'intrigue : il me semble que
je n'obtiens quelque chose dans l'objet qu'une fois que la session Word
est ouverte, ce qui n'est pas instantané.

Quand je tape

Set wd = CreateObject("Word.Application")
While wd Is Nothing
Wend
'Word est chargé

est-ce une ânerie ?

En faisant ça je pars du principe que Word est installé, faut-il pré voir
un temps maximum de chargement ? Ou y a-t-il un moyen plus rapide ?

Ou je peux partir du principe que CreateObject va tout de suite me
renvoyer une erreur si Word n'est pas installé ?

________________________________________
Jacques93 a écrit, le 01/11/2007 12:09 :
Juste une petite remarque : si Word est présent, et qu'une instance e st
déjà active :

Set wd = GetObject(, "Word.Application")

te renverra un pointeur sur cette instance. et le CreateObject en cré era
une nouvelle. Donc tout dépend de ce que tu désires faire. Pour voi r les
différente possibilités, tu peux faire :

Dim wd As Object

On Error Resume Next
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
' Word existe peut être, mais pas d'instance lancée
Set wd = CreateObject("Word.Application")
If wd Is Nothing Then
'Word n'est pas présent
MsgBox "Word non trouvé"
Else
' Word est présent et un nouvelle instance est crée
MsgBox "Lancement de Word"
wd.Visible = True
End If
Else
' Word existe et une instance est lancée
MsgBox "Word déjà lancé"
End If
Err.Clear

NB : tu peux combiner le code Err (429), et le wd Is Nothing


Avatar
Jean-marc
Gloops wrote:
Bonjour,

Sur le principe très bien, mais une chose m'intrigue : il me semble
que je n'obtiens quelque chose dans l'objet qu'une fois que la
session Word est ouverte, ce qui n'est pas instantané.



C'est exact.

Quand je tape

Set wd = CreateObject("Word.Application")
While wd Is Nothing
Wend
'Word est chargé

est-ce une ânerie ?



Oui :-) L'instruction CreateObject est "bloquante", en ce
sens qu'elle ne rend la main (on ne passe à la suite du programme)
que quand elle a fini de s'exécuter.
Donc, à la ligne suivante de CreateObject, wd est soit différent
de nothing (Word est installé et l'instance est créée), soit à
nothing et une erreur a été générée.

Donc le While Wend est non seulement inutile mais potentiellement
dangereux car si l'erreur est trappée avant par un
On error Resume Next, le programme va boucler jusqu'à la fin des
temps (en prime tu vas prendre tout le CPU car il n'y a pas de
Doevents dans ta boucle).

En faisant ça je pars du principe que Word est installé, faut-il
prévoir un temps maximum de chargement ? Ou y a-t-il un moyen plus
rapide ?



Pas tout compris. Mais en gros il n'y a pas plus rapide et la boucle
est inutile. C'est le CreateObject qui est synchrone et qui se
charge de tout.

Ou je peux partir du principe que CreateObject va tout de suite me
renvoyer une erreur si Word n'est pas installé ?



Oui il va tout de suite générer une erreur.

<digression>
Un des bons moyens de progresser et de pouvoir répondre
à ce genre de questions, c'est de tester...

Pourquoi ne pas écrire un programme de test qui va te donner
la réponse à toutes ces questions en 10 lignes de code ?

Il suffit d'écrire ceci:

Private Sub Command1_Click()
Dim test As Object
Dim ClassName As String

On Error Resume Next

ClassName = "word.application"
Set test = CreateObject(ClassName)

If test Is Nothing Then
MsgBox "pas de " & ClassName
Else
MsgBox ClassName & " trouvée."
test.quit
Set test = Nothing
End If
End Sub

Tu constateras que si Word est installé, tu as le
message l'indiquant, après une ou 2 secondes, et ceci
sans boulce while.

Maintenant modifie ce programme en faisant:
ClassName = "Gloops.test"

et tu verras que cette fois l'application renvoie instantanément
la message box "pas de classe ..."

Tu as donc avec ces 10 lignes la réponse aux 3 questions :-)

</digression>

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Gloops,
Gloops a écrit :
Bonjour,

Sur le principe très bien, mais une chose m'intrigue : il me semble que
je n'obtiens quelque chose dans l'objet qu'une fois que la session Word
est ouverte, ce qui n'est pas instantané.

Quand je tape

Set wd = CreateObject("Word.Application")
While wd Is Nothing
Wend
'Word est chargé

est-ce une ânerie ?

En faisant ça je pars du principe que Word est installé, faut-il prévoir
un temps maximum de chargement ? Ou y a-t-il un moyen plus rapide ?

Ou je peux partir du principe que CreateObject va tout de suite me
renvoyer une erreur si Word n'est pas installé ?




Oui, car je pense qu'une des première chose que fait CreateObject est de
vérifier la présence du la clé "Word.Application" et de sa sous-clé
CLSID dans HKCR, ce qui est pratiquement instantanée. D'ailleurs tu peux
essayer en renommant cette clé ou en modifiant le CLSID, ou par sécurité
utiliser le code suivant (un seul p à Aplication)

Dim wd As Object

Debug.Print Time
On Error GoTo Err_CLSID
Set wd = CreateObject("Word.Aplication")
Debug.Print wd.Name
Debug.Print Time
wd.Visible = True
Exit Sub
Err_CLSID:
Debug.Print "Erreur : ", Time


L'erreur est immédiate. Mais si la clé existe wd est renseigné (il y a
peut être, probablement même, d'autres contrôles que j'ignore). Ensuite,
il peut y avoir d'autre erreurs, personne n'est parfait ;-) , mais
l'objet existe.

Ceci dit, ton code n'est peut être pas indispensable, mais il ne peut
pas faire de mal. Ce n'est que mon avis :-)

--
Cordialement,

Jacques.
1 2