OVH Cloud OVH Cloud

Re: Excel n'ouvre pas Word

3 réponses
Avatar
michdenis
Bonjour Ange Ounis, PMO,

Avec plusieurs jours de retard, je tenais à rectifier une méprise
au sujet de "Late Binding vs Early binding"

| Je suis désolé d'insister mais dans les 2 exemples proposés par PMO la référence
| à la librairie des objets de Word _doit_ être cochée pour que le code compile
| sans erreur.

Voici un extrait d'un des derniers bouquins publiés sur Excel :
(Excellent mais pas nécessairement pour débutant...
Je ne sais pas si la traduction française existe !)
'-----------------------
Professional Excel Development: The Definitive Guide to
Developing Applications Using Microsoft® Excel and VBA®
By Stephen Bullen, Rob Bovey, John Green

Publisher: Addison Wesley Professional
Pub Date: February 01, 2005
ISBN: 0-321-26250-6
Pages: 936
'-----------------------

( Au chapitre III )

Dim objConnection As Object

' It doesn't matter how you create the object, it's still
' late bound due to the As Object variable declaration.
Set objConnection = New ADODB.Connection
Set objConnection = CreateObject("ADODB.Connection")

Le simple fait de déclarer une variable AS OBJECT est suffisant pour que cette déclaration
soit considérée comme "Late Binding".

Et pourquoii ? Tout simplement parce que "Late Binding" vs "Early Binding" fait référence
au moment où la procédure identifie l'objet (ses méthodes et propriétés) concerné
et où il se situe dans la base de registre.

Lorsqu'un objet n'est pas spécifiquement "typé" dans la déclaration de la variable,
l'objet est nécessairement identifié "at the run time" et c'est le fondement même de
cette expression "Late Binding" . Dans le cas contraire, lorsque l'objet est
bien "typé", la location de l'objet dans la base de registre, l'identification de
l'objet ainsi que les méthodes et les propriétés de cet objet utilisées dans la
procédure sont faits au moment de la compilation : "Early binding"

Le code soumis par PMO requiert que la référence soit présente pour l'exécution
du code mais cela n'a rien à voir avec la définition du
paradigme "Late vs Early Binding"

Voilà !


Salutations!











"michdenis" <michdenis@hotmail.com> a écrit dans le message de news: ...
Bonjour,

Je m'étais contenté de lire les lignes de déclaration des variables, et,
c'est vrai qu'une telle ligne de code cause problème si on croit effectuer
une liaison prococe :
Set AppWord = New Word.Application

;-)


Salutations!



"Ange Ounis" <nospam@nospam> a écrit dans le message de news: Ocuhj5L%23FHA.2640@tk2msftngp13.phx.gbl...
Je suis désolé d'insister mais dans les 2 exemples proposés par PMO la référence
à la librairie des objets de Word _doit_ être cochée pour que le code compile
sans erreur.
C'est facile à vérifier :)
Si la référence à la librairie de Word n'est pas cochée, l'instruction
New Word.Application
de la 2ème procédure provoque l'erreur 'type défini par l'utilisateur non
défini', erreur qui ne se produit plus dès que la librairie est cochée...

Les 2 procédures proposées par PMO utilisent donc toutes les 2 des liaisons
précoces. Pour une liaison dite tardive, sans référence à la librairie d'objets
de Word, il faut utiliser soit GetObject (si on suppose que Word est déjà
ouvert) soit CreateObject (pour créer une nouvelle instance de Word).

----------
Ange Ounis
----------

michdenis a écrit :
> Bonjour Ange Ounis,
>
> | La distinction que tu fais, AMHA, ne différencie pas 2 types de liaisons, mais
> | plutôt 2 méthodes de déclaration des variables objet : typée (Dim AppWord As
> | Word.Application) et non typée (Dim AppWord As Object).
>
> Le commentaire de PMO est exact.
>
> Dim AppWord As Word.Application
> Ce type de déclaration requiert le chargement de la référence à
> "Microsoft Word x.x object librairy" avant l'exécution du code.
>
> Lors de la compilation, Excel a déjà identifié l'activex et où il est situé dans
> la base de registre. À l'exécution, le code est plus rapide car la "recherche"
> est déjà faite. De là, l'expression "Liaison précode"
>
> Dim AppWord As Object
> - Ne requiert pas le chargement de la référence
> -Lors de la compilation... excel n'est pas en mesure de savoir de quel
> activex il s'agit et de le localiser... c'est ce qu'il va faire à l'exécution
> du code ... d'où l'expression : "Liaison tardive" et un temps d'exécution
> un peu plus lent.
>
>
> Salutations!
>
>
> "Ange Ounis" <nospam@nospam> a écrit dans le message de news: %23xwIZEE%23FHA.4012@TK2MSFTNGP10.phx.gbl...
> Ah, OK.
> Cependant, ce n'est pas, à ma connaissance, la définition habituelle de ces termes.
> La liaison précoce est celle qui s'effectue à la compilation du code alors que
> la liaison tardive s'effectue à l'exécution du code.
> Même si la "compilation" de VBA n'en est pas vraiment une, les liaisons précoces
> et tardives sont bien effectuées selon la définition habituelle, pour ce que
> j'en sais.
> La distinction que tu fais, AMHA, ne différencie pas 2 types de liaisons, mais
> plutôt 2 méthodes de déclaration des variables objet : typée (Dim AppWord As
> Word.Application) et non typée (Dim AppWord As Object).
>
> ----------
> Ange Ounis
> ----------
>
> PMO a écrit :
>
>>Bonjour,
>>
>>1) J'entends par Liaison PRECOCE
>>- Déclaration des variables AVEC spécification
>> du type du composant ActiveX soit:
>> Dim DocWord As Word.Document
>> Dim AppWord As Word.Application
>>VBA reconnaît l'intention et optimise le code compilé
>>
>>2) J'entends par Liaison TARDIVE
>>- Déclaration des variables SANS spécification soit:
>> Dim DocWord As Object
>> Dim AppWord As Object
>>Ce n'est qu'à l'exécution que VBA interprètera l'intention
>>
>>Cordialement.
>
>
>

3 réponses

Avatar
PMO
Bonjour Michel Denis et Ange Ounis,

En fait, je me suis trompé dans la procédure ouvreWord_TARDIVE
et tout le monde a raison sauf moi.
Il faut lire:

'**********
Sub ouvreWord_TARDIVE()
Dim DocWord As Object 'Word.Document
Dim AppWord As Object 'Word.Application
Dim Chemin_prog As String
'°°° Correction d'erreur PMO °°°
Set AppWord = CreateObject("Word.Application") 'bonne instruction
'Set AppWord = New Word.Application 'et non celle-ci
'°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Chemin_prog = ActiveWorkbook.Path & ""
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open _
(Chemin_prog & "tableau.doc", ReadOnly:=True)
End Sub
'**********

Je vous prie de m'excuser d'avoir causé tant de tracas.
J'ai rejoins le clan de ceux qui ont raison, du moins je l'espère
Cordialement.
--
PMO
Patrick Morange



Bonjour Ange Ounis, PMO,

Avec plusieurs jours de retard, je tenais à rectifier une méprise
au sujet de "Late Binding vs Early binding"

| Je suis désolé d'insister mais dans les 2 exemples proposés par PMO la référence
| à la librairie des objets de Word _doit_ être cochée pour que le code compile
| sans erreur.

Voici un extrait d'un des derniers bouquins publiés sur Excel :
(Excellent mais pas nécessairement pour débutant...
Je ne sais pas si la traduction française existe !)
'-----------------------
Professional Excel Development: The Definitive Guide to
Developing Applications Using Microsoft® Excel and VBA®
By Stephen Bullen, Rob Bovey, John Green

Publisher: Addison Wesley Professional
Pub Date: February 01, 2005
ISBN: 0-321-26250-6
Pages: 936
'-----------------------

( Au chapitre III )

Dim objConnection As Object

' It doesn't matter how you create the object, it's still
' late bound due to the As Object variable declaration.
Set objConnection = New ADODB.Connection
Set objConnection = CreateObject("ADODB.Connection")

Le simple fait de déclarer une variable AS OBJECT est suffisant pour que cette déclaration
soit considérée comme "Late Binding".

Et pourquoii ? Tout simplement parce que "Late Binding" vs "Early Binding" fait référence
au moment où la procédure identifie l'objet (ses méthodes et propriétés) concerné
et où il se situe dans la base de registre.

Lorsqu'un objet n'est pas spécifiquement "typé" dans la déclaration de la variable,
l'objet est nécessairement identifié "at the run time" et c'est le fondement même de
cette expression "Late Binding" . Dans le cas contraire, lorsque l'objet est
bien "typé", la location de l'objet dans la base de registre, l'identification de
l'objet ainsi que les méthodes et les propriétés de cet objet utilisées dans la
procédure sont faits au moment de la compilation : "Early binding"

Le code soumis par PMO requiert que la référence soit présente pour l'exécution
du code mais cela n'a rien à voir avec la définition du
paradigme "Late vs Early Binding"

Voilà !


Salutations!











"michdenis" a écrit dans le message de news: ...
Bonjour,

Je m'étais contenté de lire les lignes de déclaration des variables, et,
c'est vrai qu'une telle ligne de code cause problème si on croit effectuer
une liaison prococe :
Set AppWord = New Word.Application

;-)


Salutations!



"Ange Ounis" a écrit dans le message de news: Ocuhj5L%
Je suis désolé d'insister mais dans les 2 exemples proposés par PMO la référence
à la librairie des objets de Word _doit_ être cochée pour que le code compile
sans erreur.
C'est facile à vérifier :)
Si la référence à la librairie de Word n'est pas cochée, l'instruction
New Word.Application
de la 2ème procédure provoque l'erreur 'type défini par l'utilisateur non
défini', erreur qui ne se produit plus dès que la librairie est cochée...

Les 2 procédures proposées par PMO utilisent donc toutes les 2 des liaisons
précoces. Pour une liaison dite tardive, sans référence à la librairie d'objets
de Word, il faut utiliser soit GetObject (si on suppose que Word est déjà
ouvert) soit CreateObject (pour créer une nouvelle instance de Word).

----------
Ange Ounis
----------

Bonjour Ange Ounis,

| La distinction que tu fais, AMHA, ne différencie pas 2 types de liaisons, mais
| plutôt 2 méthodes de déclaration des variables objet : typée (Dim AppWord As
| Word.Application) et non typée (Dim AppWord As Object).

Le commentaire de PMO est exact.

Dim AppWord As Word.Application
Ce type de déclaration requiert le chargement de la référence à
"Microsoft Word x.x object librairy" avant l'exécution du code.

Lors de la compilation, Excel a déjà identifié l'activex et où il est situé dans
la base de registre. À l'exécution, le code est plus rapide car la "recherche"
est déjà faite. De là, l'expression "Liaison précode"

Dim AppWord As Object
- Ne requiert pas le chargement de la référence
-Lors de la compilation... excel n'est pas en mesure de savoir de quel
activex il s'agit et de le localiser... c'est ce qu'il va faire à l'exécution
du code ... d'où l'expression : "Liaison tardive" et un temps d'exécution
un peu plus lent.


Salutations!


"Ange Ounis" a écrit dans le message de news: %23xwIZEE%
Ah, OK.
Cependant, ce n'est pas, à ma connaissance, la définition habituelle de ces termes.
La liaison précoce est celle qui s'effectue à la compilation du code alors que
la liaison tardive s'effectue à l'exécution du code.
Même si la "compilation" de VBA n'en est pas vraiment une, les liaisons précoces
et tardives sont bien effectuées selon la définition habituelle, pour ce que
j'en sais.
La distinction que tu fais, AMHA, ne différencie pas 2 types de liaisons, mais
plutôt 2 méthodes de déclaration des variables objet : typée (Dim AppWord As
Word.Application) et non typée (Dim AppWord As Object).

----------
Ange Ounis
----------


Bonjour,

1) J'entends par Liaison PRECOCE
- Déclaration des variables AVEC spécification
du type du composant ActiveX soit:
Dim DocWord As Word.Document
Dim AppWord As Word.Application
VBA reconnaît l'intention et optimise le code compilé

2) J'entends par Liaison TARDIVE
- Déclaration des variables SANS spécification soit:
Dim DocWord As Object
Dim AppWord As Object
Ce n'est qu'à l'exécution que VBA interprètera l'intention

Cordialement.











Avatar
Michel Gaboly
Bonjour,

Aucun problème ;-))

La raison pour laquelle j'ai défini W comme Object et non comme Word.Ap plication, dans le fichier sur CJoint, est que ma
version d'Excel (2004, pour Mac) fait un caprice :

Avec Word.Application, j'obtenais hier le message "Erreur de compilation Type défini par l'utilisateur non défini."
alors qu'il me semblait qu'avant-hier cela marchait directement.

J'étais obligé d'aller cocher manuellement dans les références "M icrosoft Word 11.0 Object Library".

Le plus curieux, c'est pour cela que je parle de caprice est qu'après a voir exécuté le code une fois, il était possible
de décocher la référence sans conséquence.

En fait c'est comme si la référence ayant été cochée, "quelque chose" a été chargé en mémoire, qui reste disponible tant
qu'on ne quittte pas Excel. C'est un comportement que j'ai déjà renco ntré dans d'autres circonstances.


Bonjour Michel Denis et Ange Ounis,

En fait, je me suis trompé dans la procédure ouvreWord_TARDIVE
et tout le monde a raison sauf moi.
Il faut lire:

'**********
Sub ouvreWord_TARDIVE()
Dim DocWord As Object 'Word.Document
Dim AppWord As Object 'Word.Application
Dim Chemin_prog As String
'°°° Correction d'erreur PMO °°°
Set AppWord = CreateObject("Word.Application") 'bonne instruction
'Set AppWord = New Word.Application 'et non celle-ci
'°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°
Chemin_prog = ActiveWorkbook.Path & ""
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open _
(Chemin_prog & "tableau.doc", ReadOnly:=True)
End Sub
'**********

Je vous prie de m'excuser d'avoir causé tant de tracas.
J'ai rejoins le clan de ceux qui ont raison, du moins je l'espère
Cordialement.



--
Cordialement,

Michel Gaboly
www.gaboly.com

Avatar
michdenis
Bonjour PMO,

Mon commentaire était à l'effet de distinguer le paradigme
"relation précoce vs relation tardive" et d'autre part la création
d'un objet.
Dans la littérature pour le moins sérieuse (voir message précédent)
une relation précoce ou tardive n'est pas liée à la façon de créer
un objet, mais à la manière dont on "TYPE" une variable dans
à la ligne de déclaration en début de procédure :
Dim AppWord As Object -> liaison tardive
Dim AppWord As Word.Application -> Liaison précoce

Je conçois que la création de l'objet fait de cette manière
Set AppWord = New Word.Application
requiert la présence de la référence au projet.... mais cela n'en
fait pas moins une liaison précoce

On peut tergiverser longtemps sur la meilleure façon de créer un objet, mais
il ne faut pas pour autant mélanger les concepts.

Loin de moi, l'idée de déterminer qui avait raison...J'ai tenu à faire cette
distinction parce qu'il est courant de se mêler les pinceaux
et d'associer (de définir) la présence ou l'absence de la référence à une relation
précoce ou tardive... et c'est une conception erronée de ce qu'est le paradigme
"Early binding vs Late Binding"

Ce commentaire est venu sur le tard à la lecture de ce bout de code déjà cité dans mon
message précédent et émanant d'éminence grise dans le domaine :
'------------------------------
' It doesn't matter how you create the object, it's still
' late bound due to the As Object variable declaration.
Set objConnection = New ADODB.Connection
Set objConnection = CreateObject("ADODB.Connection")
'------------------------------


Voilà !


Salutations!





"PMO" <patrickPOINTmorangeAROBASElapostePOINTnet> a écrit dans le message de news:

Bonjour Michel Denis et Ange Ounis,

En fait, je me suis trompé dans la procédure ouvreWord_TARDIVE
et tout le monde a raison sauf moi.
Il faut lire:

'**********
Sub ouvreWord_TARDIVE()
Dim DocWord As Object 'Word.Document
Dim AppWord As Object 'Word.Application
Dim Chemin_prog As String
'°°° Correction d'erreur PMO °°°
Set AppWord = CreateObject("Word.Application") 'bonne instruction
'Set AppWord = New Word.Application 'et non celle-ci
'°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
Chemin_prog = ActiveWorkbook.Path & ""
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open _
(Chemin_prog & "tableau.doc", ReadOnly:=True)
End Sub
'**********

Je vous prie de m'excuser d'avoir causé tant de tracas.
J'ai rejoins le clan de ceux qui ont raison, du moins je l'espère
Cordialement.
--
PMO
Patrick Morange



Bonjour Ange Ounis, PMO,

Avec plusieurs jours de retard, je tenais à rectifier une méprise
au sujet de "Late Binding vs Early binding"

| Je suis désolé d'insister mais dans les 2 exemples proposés par PMO la référence
| à la librairie des objets de Word _doit_ être cochée pour que le code compile
| sans erreur.

Voici un extrait d'un des derniers bouquins publiés sur Excel :
(Excellent mais pas nécessairement pour débutant...
Je ne sais pas si la traduction française existe !)
'-----------------------
Professional Excel Development: The Definitive Guide to
Developing Applications Using Microsoft® Excel and VBA®
By Stephen Bullen, Rob Bovey, John Green

Publisher: Addison Wesley Professional
Pub Date: February 01, 2005
ISBN: 0-321-26250-6
Pages: 936
'-----------------------

( Au chapitre III )

Dim objConnection As Object

' It doesn't matter how you create the object, it's still
' late bound due to the As Object variable declaration.
Set objConnection = New ADODB.Connection
Set objConnection = CreateObject("ADODB.Connection")

Le simple fait de déclarer une variable AS OBJECT est suffisant pour que cette déclaration
soit considérée comme "Late Binding".

Et pourquoii ? Tout simplement parce que "Late Binding" vs "Early Binding" fait référence
au moment où la procédure identifie l'objet (ses méthodes et propriétés) concerné
et où il se situe dans la base de registre.

Lorsqu'un objet n'est pas spécifiquement "typé" dans la déclaration de la variable,
l'objet est nécessairement identifié "at the run time" et c'est le fondement même de
cette expression "Late Binding" . Dans le cas contraire, lorsque l'objet est
bien "typé", la location de l'objet dans la base de registre, l'identification de
l'objet ainsi que les méthodes et les propriétés de cet objet utilisées dans la
procédure sont faits au moment de la compilation : "Early binding"

Le code soumis par PMO requiert que la référence soit présente pour l'exécution
du code mais cela n'a rien à voir avec la définition du
paradigme "Late vs Early Binding"

Voilà !


Salutations!











"michdenis" a écrit dans le message de news: ...
Bonjour,

Je m'étais contenté de lire les lignes de déclaration des variables, et,
c'est vrai qu'une telle ligne de code cause problème si on croit effectuer
une liaison prococe :
Set AppWord = New Word.Application

;-)


Salutations!



"Ange Ounis" a écrit dans le message de news: Ocuhj5L%
Je suis désolé d'insister mais dans les 2 exemples proposés par PMO la référence
à la librairie des objets de Word _doit_ être cochée pour que le code compile
sans erreur.
C'est facile à vérifier :)
Si la référence à la librairie de Word n'est pas cochée, l'instruction
New Word.Application
de la 2ème procédure provoque l'erreur 'type défini par l'utilisateur non
défini', erreur qui ne se produit plus dès que la librairie est cochée...

Les 2 procédures proposées par PMO utilisent donc toutes les 2 des liaisons
précoces. Pour une liaison dite tardive, sans référence à la librairie d'objets
de Word, il faut utiliser soit GetObject (si on suppose que Word est déjà
ouvert) soit CreateObject (pour créer une nouvelle instance de Word).

----------
Ange Ounis
----------

Bonjour Ange Ounis,

| La distinction que tu fais, AMHA, ne différencie pas 2 types de liaisons, mais
| plutôt 2 méthodes de déclaration des variables objet : typée (Dim AppWord As
| Word.Application) et non typée (Dim AppWord As Object).

Le commentaire de PMO est exact.

Dim AppWord As Word.Application
Ce type de déclaration requiert le chargement de la référence à
"Microsoft Word x.x object librairy" avant l'exécution du code.

Lors de la compilation, Excel a déjà identifié l'activex et où il est situé dans
la base de registre. À l'exécution, le code est plus rapide car la "recherche"
est déjà faite. De là, l'expression "Liaison précode"

Dim AppWord As Object
- Ne requiert pas le chargement de la référence
-Lors de la compilation... excel n'est pas en mesure de savoir de quel
activex il s'agit et de le localiser... c'est ce qu'il va faire à l'exécution
du code ... d'où l'expression : "Liaison tardive" et un temps d'exécution
un peu plus lent.


Salutations!


"Ange Ounis" a écrit dans le message de news: %23xwIZEE%
Ah, OK.
Cependant, ce n'est pas, à ma connaissance, la définition habituelle de ces termes.
La liaison précoce est celle qui s'effectue à la compilation du code alors que
la liaison tardive s'effectue à l'exécution du code.
Même si la "compilation" de VBA n'en est pas vraiment une, les liaisons précoces
et tardives sont bien effectuées selon la définition habituelle, pour ce que
j'en sais.
La distinction que tu fais, AMHA, ne différencie pas 2 types de liaisons, mais
plutôt 2 méthodes de déclaration des variables objet : typée (Dim AppWord As
Word.Application) et non typée (Dim AppWord As Object).

----------
Ange Ounis
----------


Bonjour,

1) J'entends par Liaison PRECOCE
- Déclaration des variables AVEC spécification
du type du composant ActiveX soit:
Dim DocWord As Word.Document
Dim AppWord As Word.Application
VBA reconnaît l'intention et optimise le code compilé

2) J'entends par Liaison TARDIVE
- Déclaration des variables SANS spécification soit:
Dim DocWord As Object
Dim AppWord As Object
Ce n'est qu'à l'exécution que VBA interprètera l'intention

Cordialement.