OVH Cloud OVH Cloud

VBA et WORD

5 réponses
Avatar
Carole
Bonjour,

J'ai une proc=E9dure VBA qui s'ex=E9cute tout =E0 fait=20
normalement sur tous les postes sauf 1 !

Sur ce poste, la proc=E9dure plante sur cette ligne :
If ActiveDocument.Paragraphs(i).Style =3D "EXIGENCE TITRE"=20
Then

Je liste en fait les paragraphes qui ont ce style. Si un=20
paragraphe a un style non list=E9 dans les styles=20
disponibles comme "TM1" (il n'existe plus en 2000 et=20
2002), cela plante mais uniquement sur un poste. Sur les=20
autres, cela ne pose pas de probl=E8me.
Tous ces postes disposent de WOrd97, 2000 et 2002.

Si au moins j'arravais =E0 tester le contenu de "style" et=20
zapper.
Merci

5 réponses

Avatar
Jean-Guy Marcil
Carole was telling us:
Carole nous racontait que :

Bonjour,

J'ai une procédure VBA qui s'exécute tout à fait
normalement sur tous les postes sauf 1 !


Avez-vous vérifié les différences entre ce poste et les autres? Service
Pack, Outils > Options, etc.

Sur ce poste, la procédure plante sur cette ligne :
If ActiveDocument.Paragraphs(i).Style = "EXIGENCE TITRE"
Then


Est-ce que ça plante quand "i = toujours le même chiffre", ou toujours à la
première passe (quand i = 1). Avez-vous débuggé pour voir ce qui ce passait
avec le paragrpahe qui génère l'erreur (si c'est toujours le même)?
En passant, une ligne seule de code n'est pas très utile, surtout quand elle
contient une variable (i).
Il faut donner un peu de contexte VBA.

Je liste en fait les paragraphes qui ont ce style. Si un
paragraphe a un style non listé dans les styles
disponibles comme "TM1" (il n'existe plus en 2000 et
2002), cela plante mais uniquement sur un poste. Sur les


TM1 à TM9 existent toujours. Ils sont juste cachés par défaut. Le plus
simple pour les voir est de faire SHIFT-Clic sur la liste déroulante des
styles dans la barre d'outils de mise en forme. Là, tous les styles
s'affichent.

Sinon, il faut aller les cocher à partit de loption de personnalisation du
volet des styles.

autres, cela ne pose pas de problème.
Tous ces postes disposent de WOrd97, 2000 et 2002.


Comment est-ce qu'un seul poste peut avoir trois versions de Office?
Pourquoi?
Ou, voulez-vous dire que chaque poste à une version ou une autre de Word?
Dans ce cas, le poste qui plante, quelle version de Word? Est-ce que ce
poste est le seul à avoir cette version? Sinon, est-ce que les autres ont
les mêmes options et service pack?

Si au moins j'arravais à tester le contenu de "style" et
zapper.


Ici je ne comprends pas très bien ce que vous voulez dire.

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org

Avatar
Carole
Bonjour et merci d'avoir répondu,

1. Effectivement je n'ai pas vérifié le service pack sur
ces postes.

2. Bien sur que j'ai débuggé, et cela plante sur des
paragraphes bien précis en version 2002 uniquement, ces
paragraphes contiennent une rupture de page ou de section.

3.Pour les styles, j'avais fini par trouver et ce n'est
pas le problème.

4.Tous ces postes on 3 versions de Word car dans la
société les 3 versions perdurent et ce service doit
s'assurer que les macros fonctionnent sur tous et assurer
un support qualité dans les 3 versions. Si, si

5. En fait, je sors l'erreur sur un test sur chr(13) ou
chr(12), ce qui n'est pas très rationnel. Cependant, en
version 2002, la procédure met 15 minutes à remplir 2
tableaux de paragraphes et moins de 3 minutes sur Word
2000 (même document, même macro) ? En fait, y a-t-il des
options particulières pour le traitement des sauts de
page, de saut de ligne et des tableaux en version 2002 ?

Merci
-----Message d'origine-----
Carole was telling us:
Carole nous racontait que :

Bonjour,

J'ai une procédure VBA qui s'exécute tout à fait
normalement sur tous les postes sauf 1 !


Avez-vous vérifié les différences entre ce poste et les
autres? Service

Pack, Outils > Options, etc.

Sur ce poste, la procédure plante sur cette ligne :
If ActiveDocument.Paragraphs(i).Style = "EXIGENCE
TITRE"


Then


Est-ce que ça plante quand "i = toujours le même
chiffre", ou toujours à la

première passe (quand i = 1). Avez-vous débuggé pour
voir ce qui ce passait

avec le paragrpahe qui génère l'erreur (si c'est
toujours le même)?

En passant, une ligne seule de code n'est pas très
utile, surtout quand elle

contient une variable (i).
Il faut donner un peu de contexte VBA.

Je liste en fait les paragraphes qui ont ce style. Si
un


paragraphe a un style non listé dans les styles
disponibles comme "TM1" (il n'existe plus en 2000 et
2002), cela plante mais uniquement sur un poste. Sur
les



TM1 à TM9 existent toujours. Ils sont juste cachés par
défaut. Le plus

simple pour les voir est de faire SHIFT-Clic sur la
liste déroulante des

styles dans la barre d'outils de mise en forme. Là, tous
les styles

s'affichent.

Sinon, il faut aller les cocher à partit de loption de
personnalisation du

volet des styles.

autres, cela ne pose pas de problème.
Tous ces postes disposent de WOrd97, 2000 et 2002.


Comment est-ce qu'un seul poste peut avoir trois
versions de Office?

Pourquoi?
Ou, voulez-vous dire que chaque poste à une version ou
une autre de Word?

Dans ce cas, le poste qui plante, quelle version de
Word? Est-ce que ce

poste est le seul à avoir cette version? Sinon, est-ce
que les autres ont

les mêmes options et service pack?

Si au moins j'arravais à tester le contenu de "style"
et


zapper.


Ici je ne comprends pas très bien ce que vous voulez
dire.


--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org






Avatar
Jean-Guy Marcil
Carole was telling us:
Carole nous racontait que :

Bonjour et merci d'avoir répondu,

1. Effectivement je n'ai pas vérifié le service pack sur
ces postes.


Et...?

2. Bien sur que j'ai débuggé, et cela plante sur des
paragraphes bien précis en version 2002 uniquement, ces
paragraphes contiennent une rupture de page ou de section.


Y a-t-il d'autres points communs? (Style, contenu, etc.)

3.Pour les styles, j'avais fini par trouver et ce n'est
pas le problème.

4.Tous ces postes on 3 versions de Word car dans la
société les 3 versions perdurent et ce service doit
s'assurer que les macros fonctionnent sur tous et assurer
un support qualité dans les 3 versions. Si, si


D'accord, je comprend, j'ai sur mon poste 4 versions de Office, et je vais
bientôt en installer une cinquième. Mais pas sur le mème disque.
Est-ce que l'erreur ce produit sur un poste qui a les trois versions de Word
ou sur un poste utilisateur, qui je présume, n'aura qu'une seule version de
Office? Sur les postes de production/support, j'espère qu'il y a des disque
virtuels ou VPC/VMWare pour simuler un envrinnement où une version type de
Office est unique sur le poste. Avec les trois versions sur le même disque,
ça peut causer des surprises...

5. En fait, je sors l'erreur sur un test sur chr(13) ou
chr(12), ce qui n'est pas très rationnel. Cependant, en
version 2002, la procédure met 15 minutes à remplir 2
tableaux de paragraphes et moins de 3 minutes sur Word
2000 (même document, même macro) ? En fait, y a-t-il des
options particulières pour le traitement des sauts de
page, de saut de ligne et des tableaux en version 2002 ?


Là je ne suis pas. Sans voir le code (et sans savoir ce que le code est
supposé faire) il est très difficile de répondre...
--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org

Avatar
Carole
Bonjour,

1. SP3 chez tous, sauf moi SP1 : donc pas de lien à priori
2. Non, je ne vois pas d'autres points communs avec ces
paragraphes sauf peut être que le paragraphe précédent
comporte un style non "visbles", comme TM1 ou "Tableau
des illustrations"

4. Non, les histoires de machines virtuelles c pour les
développeurs ou les gens des services informatiques pas
pour le service qualité ... Donc, tout est sur le même
disque.

Les deux codes :

Cette procédure remplit des tableaux avec les paragraphes
des styles cherchés . Le but final est de générer un
tableau à placer en fin de document.
J'ai ajouté les tests sur chr(12) et chr(13) pour éviter
que cela plante ?
*********************
Sub RemplirTabId()


wErreur = 0
Frm_Choix.Frame1.Caption = "Construction du tableau"

'Se placer en début de document et chercher les styles de
type exigence
nbpara = 0
ActiveDocument.Bookmarks("StartOfDoc").Select

nbparaall = ActiveDocument.Paragraphs.Count
ReDim TID(nbparaall)
Index = 0
'Remplir le tableau des paragraphes de style exigence
titre
For i = 1 To nbparaall
Titre = True
'Faire progresser la barre d'avancement
Frm_Choix.Progress.Width = Int(100 * (i / nbparaall))
Frm_Choix.Frame1.Repaint
Set wpara = ActiveDocument.Paragraphs(i).Range
'If (i = 203) Or (i = 204) Then
'MsgBox (ActiveDocument.Paragraphs(i))
'MsgBox (Asc(wpara))
'End If
If Asc(wpara) <> 13 And Asc(wpara) <> 12 Then
If ActiveDocument.Paragraphs(i).Style = "EXIGENCE
TITRE" Then

nbpara = nbpara + 1
'sélectionner le paragraphe
TID(Index) = wpara
Index = Index + 1
End If
End If

Next i
'Récupérer la taille en fin de premier tableau
WAvancement = Frm_Choix.Progress.Width

nbExigenceTitre = Index
ReDim TParag(nbparaall)
ActiveDocument.Bookmarks("StartOfDoc").Select

'Remplir le tableau des paragraphes de style exigence
Index = 0
For i = 1 To nbparaall
Titre = False
'Faire progresser la barre d'avancement
Frm_Choix.Progress.Width = WAvancement + Int(100 * (i /
nbparaall))
Frm_Choix.Frame1.Repaint
Set wpara = ActiveDocument.Paragraphs(i).Range
'If (i = 203) Or (i = 204) Then
'MsgBox (ActiveDocument.Paragraphs(i))
'MsgBox (Asc(wpara))
' MsgBox (ActiveDocument.Paragraphs(i).Style)
'End If

If Asc(wpara) <> 13 And Asc(wpara) <> 12 Then
If ActiveDocument.Paragraphs(i).Style = "EXIGENCE"
Then
'sélectionner le paragraphe
TParag(Index) = wpara
Index = Index + 1
End If
End If

Next i
nbExigence = Index
Frm_Choix.Frame1.Caption = "Terminé"



End Sub

*****************************


Ceci est le début de la procédure qui insère le tableau
dans le document. En word 2002, il plante sur
tabexig.columns(1).width=nnn. Je le laisse donc faire lui
même ses tailles de colonnes ?
Le code fonctionne toujours en 2000!
***********************
Sub InsererTableauId()
'Ménage en fin de document
'Call PlacerTableau

'Insérer un tableau : 2 colonnes et nbpara en nombre de
lignes
'Ajouter 1 pour le titre
nbpara = nbpara + 1
'Set tabexig = ActiveDocument.Tables.Add
(Range:=Walldocument, NumRows:=nbpara, NumColumns:=2)
Set tabexig = ActiveDocument.Tables.Add
(Range:=Walldocument, NumRows:=nbpara, NumColumns:=2,
DefaultTableBehavior:=wdWord8TableBehavior)
tabexig.Columns.PreferredWidthType = wdPreferredWidthAuto


'Taille des colonnes du tableau
'tabexig.Columns(1).Width = 140
'tabexig.Columns(2).Width = 320
'Remplir les entetes
tabexig.Cell(1, 1).Select
Selection.TypeText Text:="Identifiant"

tabexig.Cell(1, 2).Select
Selection.TypeText Text:="Libellé"

****************



Quant au temps d'exécution, je l'ai diminué car j'ai
découvert que le mode modification était coché par défaut
en 2002, sur ce document? Mais c'est toujours pire sur
2002.


Merci

-----Message d'origine-----
Carole was telling us:
Carole nous racontait que :

Bonjour et merci d'avoir répondu,

1. Effectivement je n'ai pas vérifié le service pack
sur


ces postes.


Et...?

2. Bien sur que j'ai débuggé, et cela plante sur des
paragraphes bien précis en version 2002 uniquement, ces
paragraphes contiennent une rupture de page ou de
section.



Y a-t-il d'autres points communs? (Style, contenu, etc.)

3.Pour les styles, j'avais fini par trouver et ce n'est
pas le problème.

4.Tous ces postes on 3 versions de Word car dans la
société les 3 versions perdurent et ce service doit
s'assurer que les macros fonctionnent sur tous et
assurer


un support qualité dans les 3 versions. Si, si


D'accord, je comprend, j'ai sur mon poste 4 versions de
Office, et je vais

bientôt en installer une cinquième. Mais pas sur le mème
disque.

Est-ce que l'erreur ce produit sur un poste qui a les
trois versions de Word

ou sur un poste utilisateur, qui je présume, n'aura
qu'une seule version de

Office? Sur les postes de production/support, j'espère
qu'il y a des disque

virtuels ou VPC/VMWare pour simuler un envrinnement où
une version type de

Office est unique sur le poste. Avec les trois versions
sur le même disque,

ça peut causer des surprises...

5. En fait, je sors l'erreur sur un test sur chr(13) ou
chr(12), ce qui n'est pas très rationnel. Cependant, en
version 2002, la procédure met 15 minutes à remplir 2
tableaux de paragraphes et moins de 3 minutes sur Word
2000 (même document, même macro) ? En fait, y a-t-il
des


options particulières pour le traitement des sauts de
page, de saut de ligne et des tableaux en version
2002 ?



Là je ne suis pas. Sans voir le code (et sans savoir ce
que le code est

supposé faire) il est très difficile de répondre...
--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org



.




Avatar
Jean-Guy Marcil
Carole was telling us:
Carole nous racontait que :

Bonjour,

4. Non, les histoires de machines virtuelles c pour les
développeurs ou les gens des services informatiques pas
pour le service qualité ... Donc, tout est sur le même
disque.


J'en reparlerais avec le département concerné dans ta boîte. Si le but du
département du service de qualité est d'assurer un service auprès des
utilisateurs, les ordis de ce département devraient reproduire
l'environnement des utilisateurs qui n'ont pas trois versions de Office sur
leur poste. Beaucoup de macros vont fonctionner différemment sur un poste à
trois versions (surtout celles concernant le création de documents)... Donc,
faut-il écrire les macros pour que ce problème soit évité ou fournir au
département du Service de qualité trois ordis, chacun ayant une version de
Office? Ou un ordi avec des disques virtuels permettant de simuler un
environnement utilisteur particulier? Cette dernière option est la moins
coûteuse.

Les deux codes :


Je ne vois pas ce qu pourrait causer le problème sur une machine et pas sur
une autre. Par contre, je vois que les variables ne sont pas déclarées et
que l'objet Selection est utilisé. Il faut éviter ça si ont veut du code
fiable et plus performant. Aussi, il y a deux [For i = 1... - Next] boucles,
c'est forcément 2 fois plus long! Un Select Case accélère le processus.
Finlaement, l'utilisation de blocs [With - End With] accélère aussi
l'exécution et utilise moins de mémoire.
Je vois aussi que tu déclare un largeur de colonne en points mais que tu
spécifie une largeur automatique. C'est peut-être la cause du problème pour
la largeur de colonne.

Voici une version de ton code que j'ai simplifié (J'utilise le StatusBar au
lieu d'un Progressbar car je n'ai pas fait de test à partir d'un userform.)

'_______________________________________
Dim TID As Variant
Dim TParag As Variant
'_______________________________________
Sub RemplirTabId()

Dim wpara As Range
Dim nbparaall As Long
Dim Index1 As Long
Dim Index2 As Long
Dim i As Long

Application.StatusBar = "Construction du tableau"

nbparaall = ActiveDocument.Paragraphs.Count
ReDim TID(nbparaall)
ReDim TParag(nbparaall)
Index1 = 0
Index2 = 0
'Remplir le tableau des paragraphes de style exigence Titre
For i = 1 To nbparaall
Application.StatusBar = Int(100 * (i / nbparaall)) & "%"
Set wpara = ActiveDocument.Paragraphs(i).Range
'pour éviter les paragraphes vides (seulement un caractère, le ¶)
If wpara.Characters.Count > 1 Then
'pour enlever le ¶ qui ne sera pas nécessaire
'dans le tableau Word
wpara.MoveEnd wdCharacter, -1
Select Case ActiveDocument.Paragraphs(i).Style
Case "EXIGENCE Titre"
'sélectionner le paragraphe
TID(Index1) = wpara
Index1 = Index1 + 1
Case "EXIGENCE"
'sélectionner le paragraphe
TParag(Index2) = wpara
Index2 = Index2 + 1
End Select
End If
Next

ReDim Preserve TID(Index1 - 1)
ReDim Preserve TParag(Index2 - 1)

InsererTableauId

Application.StatusBar = "Terminé"

End Sub
'_______________________________________

'_______________________________________
Sub InsererTableauId()

Dim LineCount As Long
Dim DocRange As Range
Dim tabexig As Table
Dim i As Long

Set DocRange = ActiveDocument.Range
DocRange.Collapse wdCollapseEnd
DocRange.InsertParagraphAfter

'Ajouter 1 car index de la variable tableau commence à 0
'Plus du code au cas où les index des variables seraient différents
'Pas nécessaire si tu es certaine que les deux index seront toujours
identiques
'Dans ce cas, on utilise seulement
' LineCount = UBound(TID) + 1
If UBound(TID) >= UBound(TParag) Then
LineCount = UBound(TID) + 1
Else
LineCount = UBound(TParag) + 1
End If

'Insérer un tableau : 2 colonnes et LineCount en nombre de lignes
'Ajouter 1 pour le titre
LineCount = LineCount + 1
Set tabexig = DocRange.Tables.Add(Range:=DocRange, _
NumRows:=LineCount, NumColumns:=2)

'Taille des colonnes du tableau
With tabexig
With .Columns
.PreferredWidthType = wdPreferredWidthPoints
.Item(1).Width = 140
.Item(2).Width = 320
End With
'Remplir les entetes
.Cell(1, 1).Range.Text = "Identifiant"
.Cell(1, 2).Range.Text = "Libellé"
'et le reste du tableau
For i = 0 To LineCount
If i <= UBound(TID) Then
.Cell(i + 2, 1).Range.Text = TID(i)
End If
If i <= UBound(TParag) Then
.Cell(i + 2, 2).Range.Text = TParag(i)
End If
Next
End With

End Sub
'_______________________________________

S'il n'est pas absolument nécessaire d'avoir un ProgressBar, alors le code
suivant devrait être plus rapide:

'_______________________________________
Dim TID As Variant
Dim TParag As Variant
'_______________________________________
Sub RemplirTabId()

Dim CheckPara As Paragraph
Dim wpara As Range
Dim ParaCount As Long
Dim Index1 As Long
Dim Index2 As Long

ParaCount = ActiveDocument.Paragraphs.Count
ReDim TID(ParaCount)
ReDim TParag(ParaCount)
Index1 = 0
Index2 = 0
For Each CheckPara In ActiveDocument.Paragraphs
Set wpara = CheckPara.Range
If wpara.Characters.Count > 1 Then
wpara.MoveEnd wdCharacter, -1
Select Case CheckPara.Style
Case "EXIGENCE Titre"
TID(Index1) = wpara
Index1 = Index1 + 1
Case "EXIGENCE"
TParag(Index2) = wpara
Index2 = Index2 + 1
End Select
End If
Next

ReDim Preserve TID(Index1 - 1)
ReDim Preserve TParag(Index2 - 1)

InsererTableauId

End Sub
'_______________________________________

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org