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

[VBA] Plantage pour piloter Word à partir d'Excel

10 réponses
Avatar
HD
Bonjour,

J'ai une macro pour remplacer du texte dans Word à partir d'Excel... Si sur
le poste où je lance la macro il y'a un Excel 2007 et un Word 2007 alors je
n'ai pas de souci... mais si je lance la macro sur les postes où j'ai Excel
2003 avec un Word 97 alors j'ai systématiquement un message d'erreur "Erreur
5 Argument ou appel de procédure incorrecte".

Pour les postes avec Excel et Word 2007, j'ai en référence:
Microsoft Excel 12.0 Object Library
Microsoft Word 12.0 Object Library
Pour les postes avec Excel 2003 et Word 97, j'ai en référence:
Microsoft Excel 11.0 Object Library
et m'apparait une référence manquante, celle de Word... j'ajoute alors la
référence
Microsoft Word 8.0 Object Library

Mais le souci est qu'alors lorsque je lance la macro j'ai constamment une
erreur 5 avec plantage d'Excel. Word s'ouvre bien mais mon texte n'est pas
remplacé.

Voici ma macro:
Set AppWord = New Word.Application
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open(CheminW, ReadOnly:=False)

i = 12
If Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value <> "" Then
Do
With DocWord.Content.Find
.ClearFormatting
.Text = Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value
'Mon erreur 5 apparaît ici
With .Replacement
.ClearFormatting
.Text =
Evaluate(Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 3).Formula)
End With
.Execute Replace:=wdReplaceAll
.Forward = True
.Wrap = wdFindContinue
End With
i = i + 1
Loop Until Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value = ""
End If

L'erreur 5 apparaît sur le premier .Text
Lorsque j'enregistre une macro sur Word97 pour voir si j'ai des différences
dans la syntaxe je n'ai pas de différence. J'ai le script suivant (exemple
avec remplacement du H par le e):
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "H"
.Replacement.Text = "e"
.Forward = True
.Wrap = wdFindContinue
.Format = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Je ne comprend donc pas trop ce qui coince...

Merci d'avance pour votre aide
--
@+
HD

10 réponses

Avatar
MichD
Bonjour,

Ne coche par lesdites bibliothèques pour "Word" et modifie ton code comme suit :

Dim AppWord As Object, DocWord As Object

Set AppWord = CreateObject("Word.Application")
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open(CheminW, ReadOnly:úlse)



MichD
--------------------------------------------
"HD" a écrit dans le message de groupe de discussion : imq3ki$23b5$

Bonjour,

J'ai une macro pour remplacer du texte dans Word à partir d'Excel... Si sur
le poste où je lance la macro il y'a un Excel 2007 et un Word 2007 alors je
n'ai pas de souci... mais si je lance la macro sur les postes où j'ai Excel
2003 avec un Word 97 alors j'ai systématiquement un message d'erreur "Erreur
5 Argument ou appel de procédure incorrecte".

Pour les postes avec Excel et Word 2007, j'ai en référence:
Microsoft Excel 12.0 Object Library
Microsoft Word 12.0 Object Library
Pour les postes avec Excel 2003 et Word 97, j'ai en référence:
Microsoft Excel 11.0 Object Library
et m'apparait une référence manquante, celle de Word... j'ajoute alors la
référence
Microsoft Word 8.0 Object Library

Mais le souci est qu'alors lorsque je lance la macro j'ai constamment une
erreur 5 avec plantage d'Excel. Word s'ouvre bien mais mon texte n'est pas
remplacé.

Voici ma macro:
Set AppWord = New Word.Application
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open(CheminW, ReadOnly:úlse)

i = 12
If Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value <> "" Then
Do
With DocWord.Content.Find
.ClearFormatting
.Text = Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value
'Mon erreur 5 apparaît ici
With .Replacement
.ClearFormatting
.Text Evaluate(Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 3).Formula)
End With
.Execute Replace:=wdReplaceAll
.Forward = True
.Wrap = wdFindContinue
End With
i = i + 1
Loop Until Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value = ""
End If

L'erreur 5 apparaît sur le premier .Text
Lorsque j'enregistre une macro sur Word97 pour voir si j'ai des différences
dans la syntaxe je n'ai pas de différence. J'ai le script suivant (exemple
avec remplacement du H par le e):
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "H"
.Replacement.Text = "e"
.Forward = True
.Wrap = wdFindContinue
.Format = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Je ne comprend donc pas trop ce qui coince...

Merci d'avance pour votre aide
--
@+
HD
Avatar
HD
Merci MichDenis.

Je viens également de trouve l'explication de plantage d'Excel que j'avais
avec le classeur via lequel je veux utiliser la macro pour transférer les
données d'Excel ves Word... Le classeur en question est sur un répertoire
partagé en lecture seule, l'accés à ce classeur se fait via un raccourci
dans lequel le répertoire de travail spécifié est le répertoire partagé en
lecture seule. J'ai changé le répertoire de travail du raccourci pour le
faire pointer vers le répertoire temporaire de l'ordinateur et... je n'ai
plus de plantage.

(par contre... ma macro ne fonctionne pas puisque si la recherche fonctionne
bien, elle ne fait que sélectionner le mot recherché sans pour autant le
remplacer...)
--
@+
HD
Avatar
MichD
La section problème devrait ressembler à ceci :

Ceci est une question réservée au guru de Word !
'--------------------------------
With DocWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "Le texte du document que tu veux remplacer"
'Le texte de remplacement
.Replacement.Text = _
Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value
.Forward = True
.Execute Replace:=wdReplaceAll
End With
'--------------------------------


MichD
--------------------------------------------
Avatar
HD
Ceci est une question réservée au guru de Word !


Les guru de Word sont hélas bien silencieux...

'--------------------------------
With DocWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "Le texte du document que tu veux remplacer"
'Le texte de remplacement
.Replacement.Text = _
Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value
.Forward = True
.Execute Replace:=wdReplaceAll
End With
'--------------------------------


Le souci est que cela ne fonctionne pas non plus... Rien est remplacé. J'ai
toujours les mêmes données. Pourtant lorsque je fais le premier remplacement
de la boucle à la main cela fonctionne bien. Je n'ai pas non plus de message
d'erreur. Mon poste est en Word97 avec Excel97 sous XP SP3 mais j'ai le
souci quelque soit la version d'office.

En test, j'ai crée un script tout simple:
Sub test
Dim AppWord As Object, DocWord As Object
Dim ret As Long
Dim CheminW As String
Dim i As Long
Dim AWkb As String

CheminW = Range("D8").Value

Set AppWord = CreateObject("Word.Application")
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open(CheminW, ReadOnly:úlse)
With DocWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "[PRODVEGER]"
'Le texte de remplacement
.Replacement.Text = "TTTTESSTTTTTTTTTT"
.Forward = True
.Execute Replace:=wdReplaceAll
End With
End Sub

Mais rien y fait... Le document Word s'ouvre bien, je n'ai aucun message
d'erreur et je n'ai pourtant aucun texte remplacé.

--
@+
HD
Avatar
MichD
Fais une petite expérience...

A )Tu ouvres Word, tu insères dans le document actif
ton expression "[PRODVEGER]" , tu peux même la
copier dans diverses cellules d'un tableau.
B ) Exécute la macro suivante... Avec Word 2007,
tous les remplacements sont faits.

Si cela ne fonctionne pas sous Word 1997, je n'ai aucune idée du
pourquoi...Je n'ai jamais travaillé avec cette version et elle ne
m'est pas disponible pour de plus amples tests !

Tu insères cette macro dans le ThisDocument de ton document
dans la fenêtre de l'éditeur de code.
'----------------------------------
Sub test()
Dim docWord As Document
Set docWord = ActiveDocument
With docWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "[PRODVEGER]"
'Le texte de remplacement
.Replacement.Text = "TTTTESSTTTTTTTTTT"
.Forward = True
.Execute Replace:=wdReplaceAll
End With

End Sub
'----------------------------------


MichD
--------------------------------------------
"HD" a écrit dans le message de groupe de discussion : iokasa$17e3$

Ceci est une question réservée au guru de Word !


Les guru de Word sont hélas bien silencieux...

'--------------------------------
With DocWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "Le texte du document que tu veux remplacer"
'Le texte de remplacement
.Replacement.Text = _
Workbooks(AWkb).Sheets("Transf_Word").Cells(i, 2).Value
.Forward = True
.Execute Replace:=wdReplaceAll
End With
'--------------------------------


Le souci est que cela ne fonctionne pas non plus... Rien est remplacé. J'ai
toujours les mêmes données. Pourtant lorsque je fais le premier remplacement
de la boucle à la main cela fonctionne bien. Je n'ai pas non plus de message
d'erreur. Mon poste est en Word97 avec Excel97 sous XP SP3 mais j'ai le
souci quelque soit la version d'office.

En test, j'ai crée un script tout simple:
Sub test
Dim AppWord As Object, DocWord As Object
Dim ret As Long
Dim CheminW As String
Dim i As Long
Dim AWkb As String

CheminW = Range("D8").Value

Set AppWord = CreateObject("Word.Application")
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open(CheminW, ReadOnly:úlse)
With DocWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = T
'Le texte de remplacement
.Replacement.Text = "TTTTESSTTTTTTTTTT"
.Forward = True
.Execute Replace:=wdReplaceAll
End With
End Sub

Mais rien y fait... Le document Word s'ouvre bien, je n'ai aucun message
d'erreur et je n'ai pourtant aucun texte remplacé.

--
@+
HD
Avatar
HD
Fais une petite expérience...
A )Tu ouvres Word, tu insères dans le document actif
ton expression "[PRODVEGER]" , tu peux même la
copier dans diverses cellules d'un tableau.


J'ai effectivement déjà un fichier word avec l'expression "[PRODVEGER]".

B ) Exécute la macro suivante... Avec Word 2007,
tous les remplacements sont faits.


J'ai Word 2007 sur mon poste, effectivement, lorsque la macro est placée sur
le document lui même elle s'exécute bien et l'expression "[PRODVEGER]" est
bien remplacée par "TTTTESSTTTTTTTTTT".

Mais si je lance la macro adaptée pour être lancée via Excel (j'ai également
la version 2007) alors cela ne fonctionne pas. J'ajoute juste les objets
AppWord et docWord. Le document word s'ouvre bien mais le texte n'est pas
remplacé et je n'ai aucun message d'erreur :
Sub test3()
Dim AppWord As Object
Dim docWord As Object
CheminW = Range("D8").Value

Set AppWord = CreateObject("Word.Application")
AppWord.ShowMe
AppWord.Visible = True
Set docWord = AppWord.Documents.Open(CheminW, ReadOnly:úlse)
With docWord.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "[PRODVEGER]"
'Le texte de remplacement
.Replacement.Text = "TTTTESSTTTTTTTTTT"
.Forward = True
.Execute Replace:=wdReplaceAll
End With
End Sub

--
@+
HD
Avatar
HD
A savoir que si j'active la référence "Microsoft Word 12.0 Object Library"
alors ça fonctionne... Mais le souci est qu'il me faudrait ne pas activer
cette référence car la macro doit pouvoir fonctionner sur toutes les
plateformes (Word 97 à Word 2010)... et si j'active la référence "Microsoft
Word 12.0 Object Library" sur mon classeur alors lorsqu'il est ouvert sur un
poste avec une autre version de word cela plante car la référence
""Microsoft Word 12.0 Object Library" est affichée manquante.

--
@+
HD
Avatar
MichD
Dans le ThisWorkbook de ton classeur, sur l'évènement Workbook_Open
tu inscris cette procédure qui va se charger la référence Word à
l'OUVERTURE d'Excel sans égard à la version Office d'installer sur la machine.

'---------------------------
Private Sub Workbook_Open()
Dim Refs As Object, Ref As Object
On Error Resume Next
With ThisWorkbook
Set Refs = .VBProject.References
For Each Ref In Refs
If Ref.IsBroken Then
Refs.Remove Ref
End If
Next
.VBProject.References.AddFromGuid _
"{00020905-0000-0000-C000-000000000046}", 8, 4
End With
End Sub
'---------------------------

Et tu pourras utiliser ta macro () dans un module standard

'-----------------------------
sub Ta_Macro()
Dim AppWord As Word.Application
Dim DocWord As Document

Set AppWord = New Word.Application
AppWord.ShowMe
AppWord.Visible = True
Set DocWord = AppWord.Documents.Open(CheminW, ReadOnly:úlse)

'Le reste de ta macro

End sub
'-----------------------------

MichD
--------------------------------------------
Avatar
HD
Un grand MERCI à toi MichDenis.

Où avez vous eu l'info que le Guid "{00020905-0000-0000-C000-000000000046}"
correspond à la référence Microsoft Word ?
--
@+
HD
Avatar
MichD
GUID -> Globally Unique Identifier

Tu charges manuellement les références que tu désires et tu
exécutes cette procédure. Tu obtiendras les 3 données nécessaires
"Guid", "Major", "Minor" à l'utilisation de la méthode : "AddFromGuid"
pour charger une bibliothèque. Elle sera chargée à partir du registre de
Windows plutôt que d'un fichier dans l'arborescence de Windows.

'---------------------------------------
Sub AfficherLesGuids_Propriétés()
Dim X As Integer, Sh As Worksheet
Dim NbRef As Integer

Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))

On Error Resume Next
With Sh
.Name = "GUIDS"
.Cells(1, 1) = "Nom de la bibliothèque"
'Son appellation dans la fenêtre Reférences
.Cells(1, 2) = "Description"
.Cells(1, 3) = "Guid"
.Cells(1, 4) = "Major"
.Cells(1, 5) = "Minor"
.Cells(1, 6) = "Chemin complet"
With .Range("A1:F1")
.Font.Bold = True
.Font.Size = 12
End With
With Sh.Parent.VBProject.References
NbRef = .Count
X = 2
For a = 1 To NbRef
Sh.Cells(X, 1) = .Item(a).Name
Sh.Cells(X, 2) = .Item(a).Description
Sh.Cells(X, 3) = .Item(a).GUID
Sh.Cells(X, 4) = .Item(a).Major
Sh.Cells(X, 5) = .Item(a).Minor
Sh.Cells(X, 6) = .Item(a).fullpath
X = X + 1
Next
End With
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End Sub
'---------------------------------------

MichD
--------------------------------------------