Macro Excel -> Word

Résolu
smattou2000 Messages postés 2 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 3 janvier 2006 - 3 janv. 2006 à 12:06
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 3 janv. 2006 à 18:43
Bonjour,

j'ai pour l'instant une macro sous Excel qui récupère les données contenues dans des cases du fichier excel et qui les insère dans un document word déja écris rempli de signets!

Dans ma macro j'ai donc une procédure principale qui fait appel à un certains nombres de fonctions:

Une fonction ressemble à ca:

Function nom_de_la_fonction ()

Dim MyWord As Word.Application, doc As Word.Document
Dim signet As String, i As Long
Dim chaine As String
Set MyWord = New Word.Application

With MyWord

Set doc = .Documents.Open("lien vers le document word contenant les signets", ReadOnly)

doc.Bookmarks("signet_0").Range.Text = ThisWorkbook.Worksheets("nom de l'onglet").Range("B4")
...
...
... pleins de signets
...
...
doc.TablesOfContents(1).Update
doc.SaveAs "nouveau nom pour le fichier créé"
.Visible = False
End With
doc.Application.Quit


End Function

Mon problème c'est que j'ai tellement de signets dans une fonction que j'obtiens une erreur lors du lancement de cette macro me disant que cette procédure est trop longue!

J'ai essayé de faire appel dans la fonction décrite ci-dessus à une autre fonction (une sous-fonction en qq sorte), mais j'ai alors une erreur d'objet. J'ai l'impression que l'objet doc n'est pas reconnu dans la sous-fonction.

Peut-etre n'est ce pas non plus la bonne solution pour résoudre ce prob!!

Je ne suis pas super fort en macro... je vous remercie donc par avance pour votre aide!

Smattou

3 réponses

ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 janv. 2006 à 18:43
Ok alors, déjà, au lieu de mettre :

doc.Bookmarks("Nom_0").Range.Text=ThisWorkbook.Worksheets("Paramètres").Range("B4")
doc.Bookmarks("Nom_1").Range.Text=ThisWorkbook.Worksheets("Paramètrest").Range("B4")
doc.Bookmarks("Nom_2").Range.Text=ThisWorkbook.Worksheets("Paramètres").Range("B4")

Met donc plutôt :

Dim varValueTemp
varValueTemp = ThisWorkbook.Worksheets("Paramètres").Range("B4")
doc.Bookmarks("Nom_0").Range.Text = varValueTemp
doc.Bookmarks("Nom_1").Range.Text = varValueTemp
doc.Bookmarks("Nom_2").Range.Text = varValueTemp
Tu économisera un sacré paquet de caractères!!!

Alors, sache que tu peux remplacer les noms des objets par des variables. Par exemple :

Dim varFeuille

Dim varNom
Dim varCellule
Dim varValue

varFeuille = "Paramètre2"

varNom = "Nom" & "_"
varCellule = "B5"
varValue = ThisWorkbook.Worksheets(varFeuille).Range(varCellule)
doc.Bookmarks(varNom & "0").Range.Text = varValue
doc.Bookmarks(varNom & "1").Range.Text = varValue
doc.Bookmarks(varNom & "2").Range.Text = varValue

varNom = "Beta" & "_"

varCellule = "B17"

varValue = ThisWorkbook.Worksheets(varFeuille).Range(varCellule)

doc.Bookmarks(varNom & "1").Range.Text =
varValue
doc.Bookmarks(varNom & "2").Range.Text =
varValue
doc.Bookmarks(varNom & "3").Range.Text =
varValue

Note que tu peux même mettre...

varValue =
ThisWorkbook.Worksheets(varFeuille).Range(varCellule)
... dans une fonction !!!
Mais remarque que si tu veux garder ton code en l'état tu peux aussi faire appel à une variable objet contenant ce fameux "ThisWorkbook.Worksheets(varFeuille)" répétitif.
varFeuilleActive = ThisWorkbook.Worksheets(varFeuille)
doc.Bookmarks(varNom & "0").Range.Text = varFeuilleActive.Range(varCellule)

Bref, c'est pas les moyens de raccourcir le code qui manquent!

Concernant le Module de code, il suffit d'aller dans le VBA, puis dans le cadre "Projet" cliquer, via le CLIC DROIT de la souris, sur le dossier contenant toutes les feuilles. Le menu contextuel s'affiche. Il suffit donc de cliquer sur "Insertion" => "Module".

Mais revenons-en à tes signets...
Afin de réduire considérablement ton code il nous faut connaître la structure, et surtout la régularité de cette dernière, du système de nomage de tes onglets que tu as utilisée.
Si, pour chaque nom de signet, il n'y a que ET TOUJOURS 3 "sous-signets", c'est joueable.
C'est à dire, si à chaque fois tu as :
xxx_1
xxx_2
xxx_3
yyy_1
yyy_2
yyy_3
ZZZ_1
...
Mais s'il n'y en a seulement 1 qui n'a que 2 "sous-signets" c'est foutu... tu comprends ?
Pour faire une routine d'automation, il faut que tout soit parfaitement régulier, qu'il n'y ai pas de cas particuliers, ...

Dans ce cas, avec 1 tableau à deux dimensions et deux boucles imbriquées on s'en tirent avec moins de 20 lignes de code!
Reste à savoir combien de lignes de code remplissent les originales ???

Bref, tout ça pour te dire que tu ne m'as pas donnée l'information que je voulais!

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
3
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
3 janv. 2006 à 15:34
Je pense que le problème vient simplement du fait qu'il faut déclarer les variable au niveau supérieur afin qu'elles soient Globales.

Si tes deux fonctions sont dans la même feuille, déclare tes variables (celles qui doivent être utilisées par les deux fonctions!) au dessus de toute les fonctions/procédures.

Sinon (si elles sont dans deux feuilles différentes), ouvre un "module de code" dans lequel tu déclareras tes variables tout en haut.

Mais dans les deux cas, déclare-les avec le mot clef "Public" plutôt qu'avec "Dim".

Essaie de nous mettre plus de lignes tes appels aux signets STP.
Parce qu'a mon avis, y'a franchement moyen de simplifier le code avec une ou deux petites boucles... si on peut travailler sur les noms (s'ils ont une base identique!).

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
0
smattou2000 Messages postés 2 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 3 janvier 2006
3 janv. 2006 à 17:25
Bonjour,

et tout d'abord merci pour ton aide!!

J'ai tenté de placer au dessus de l'ensemble de mes procédures, les variables MyWord, doc etc.., mais cela ne change rien pour l'instant.


En revanche définir ces variables dans un "module de code" je ne connais pas (je ne suis pas vraiment un monstre en VB!)


En revanche s'il existait un moyen de réduire la taille de mon code, ce serait chouette, donc voici plus en détail mon code:

--------------------------------------------------------------------------------------


Sub MO_création()

If Range("B9") = "transparent" Then
generation1= Primaire_Trans()
End If

If Range("B9") = "transparent" And Range("B12") <> "" Then
generation2 = Secondaire_Trans()
End If

If Range("B9") = "non transparent" Then
generation1 = Primaire_NON_Trans()
End If

If Range("B9") = "non transparent" And Range("B12") <> "" Then
generation2 = Secondaire_NON_Trans()
End If

End Sub
-------------------------------------------------------------------------------------
Function Primaire_Trans()
Dim MyWord As Word.Application, doc As Word.Document
Dim signet As String, i As Long
Dim chaine As String
Set MyWord = New Word.Application

With MyWord

Set doc = .Documents.Open("lien vers le document word contenant les signets", ReadOnly)

doc.Bookmarks("Nom_0").Range.Text = ThisWorkbook.Worksheets("Paramètres").Range("B4")
doc.Bookmarks("Nom_1").Range.Text = ThisWorkbook.Worksheets("Paramètrest").Range("B4")
doc.Bookmarks("Nom_2").Range.Text = ThisWorkbook.Worksheets("Paramètres").Range("B4")
If Range("B11").Value "B014" And Range("B12").Value "B015" And Range("B95").Value = "en clair" Then
doc.Bookmarks("Nom_PN_1").Range.Text = ThisWorkbook.Worksheets ("Paramètres ").Range("B5")
...
...
doc.TablesOfContents(1).Update
doc.SaveAs "nouveau nom pour le fichier créé"
.Visible = False
End With
doc.Application.Quit


End Function


--------------------------------------------------------------------------------------
Function Secondaire_Trans()

...
...
...

-------------------------------------------------------------------------------------
Function Primaire_NON_Trans()
Dim MyWord As Word.Application, doc As Word.Document
Dim signet As String, i As Long
Dim chaine As String
Set MyWord = New Word.Application

With MyWord

Set doc = .Documents.Open("lien vers le document word contenant les signets", ReadOnly)

doc.Bookmarks("Nom_0").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B4")
doc.Bookmarks("Nom_1").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B4")
doc.Bookmarks("Nom_2").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B4")
If Range("B16").Value "D014" And Range("B11").Value "D015" And Range("B95").Value = "en tunnel" Then
doc.Bookmarks("Nom_PN_1").Range.Text = ThisWorkbook.Worksheets ("Paramètres2").Range("B5")
End if
If Range("A28").Value "D003" And Range("C25").Value "D05" And Range("B95").Value = "en tunnel" Then
Call procédure1()
End if

...
...
doc.TablesOfContents(1).Update
doc.SaveAs "nouveau nom pour le fichier créé"
.Visible = False
End With
doc.Application.Quit


End Function

-------------------------------------------------------------------------------------
Function Procédure1()

doc.Bookmarks("Nom_0").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B5")
doc.Bookmarks("Nom_1").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B5")
doc.Bookmarks("Nom_2").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B5")
doc.Bookmarks("Beta_1").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B17")
doc.Bookmarks("Beta_2").Range.Text = ThisWorkbook.Worksheets("Paramètres2").Range("B17")
... plein de signets

End function
-------------------------------------------------------------------------------------

J'ai effectivement de nombreux signets qui doivent être remplacé par le contenu de la même case de mon tableau Excel, mais j'avais cru comprendre que chaque signet devait etre unique. Donc pour chaque signet, une ligne de code! Je me trompe?

Par ailleurs, j'ai l'impression que le problème réside dans le fait que dans la fonction Primaire_NON_Trans j'ouvre mon document Word, et que je fais ensuite appel à une autre fonction pour remplacer les signets de ce meme document Word! (j'ai été clair?)

J'ai par contre beaucoup de conditions If et mon fichier Word est assez long. Les conditions if me permettent justement de supprimer des parties de mon document word (si la case B8=oui, alors le paragraphe 2.3 est supprimé par exemple!).

Peut-on simplifier tout cela?

Par avance merci pour vos réponses!
0
Rejoignez-nous