Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/04/2011, 12h33   #1
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : avril 2011
Messages : 4
Points : 1
Points : 1
Par défaut problème appel de procédure (type incompatible)

Bonjour à tous,
je suis nouveau ici et me permets de poster un message afin de recevoir un peu d'aide dans la résolution de mon problème (je pense que c'est trois fois rien mais je suis bloqué quand même...).
J'ajoute que je suis débutant dans ce domaine ce qui doit expliquer en partie mon blocage!

J'ai cherché assez longuement une solution dans les ressource du site mais n'ai rien trouvé, désolé. Donc j'expose:
Je veux créer une macro qui ouvrirait des fichiers .doc dans un dossier source, leur appliquerait un traitement (détecter s'il existerait des champs TIME et les remplacer par des SAVEDATE) et les copierait dans un dossier de destination.

La première et la dernière étape fonctionnent bien. En revanche, l'étape du traitement des dates ne fonctionne que lorsqu'elle est exécutée seule sans les autres.

Je reformule pour être plus clair: Seule, cette macro fonctionne mais lorsqu'elle est appelée, elle ne fonctionne plus.
Voici mon code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Option Explicit
Sub ChangementDate_Click()
'compteur de fichiers traites
Dim nb As Integer
Dim MonFichier As Variant
 
 
'chemin du dossier contenant les fichiers
Const RepATraiter = "C:\test\"
'chemin du dossier ou déplasser les fichiers
Const RepTraité = "C:\traite\"
 
'desactiver le mise a jour ecran
Application.ScreenUpdating = False
 
'changer le dossier courant
ChDir RepATraiter
 
'donner le type de fichiers a traiter
MonFichier = Dir("*.doc")
 
'ourvrir chaque document tour à tour
Do Until MonFichier = ""
    Documents.Open MonFichier
 
    'Appeler la procedure de traitement
    Call DateAChanger(MonFichier)
 
    'Fermer le document
    Documents(MonFichier).Close savechanges:=False
 
    'copier le fichier dans le dossier de destination
    FileCopy RepATraiter & MonFichier, RepTraité & MonFichier
 
    'Passer au fichier suivant
    MonFichier = Dir
 
    'compter le nombre de documents traites
    nb = nb + 1
Loop
 
'message si aucun fichier a traiter
If nb = 0 Then
    MsgBox "Aucun fichier ne répond aux critères"
End If
End Sub
 
'procedure de traitement des fichiers
Sub DateAChanger(ByVal oFile As Variant)
'Dim oFile As Variant
    For Each oFile In ActiveDocument.Fields
    If oFile.Type = wdFieldTime Then
    ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldSaveDate
    oFile.Delete
    End If
    Next
    Set oFile = Nothing
End Sub
Je pense que le problème vient du type utilisé dans la variable MonFichier de la procédure ChangementDate différent de celui de la variable oFile de DateAchanger. J'ai typé volontairement ces deux variables en variant mais ça ne règle pas mon problème: Les fichiers sont ouverts et copiés dans un dossier de sortie mais sans le changement de code du champ TIME.

Que dois-je faire à votre avis? En vous remerciant par avance.
pickanier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h19   #2
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Il y a peut-être plusieurs pb, en voici un
Code :
1
2
3
4
5
6
7
8
9
10
11
...
'donner le type de fichiers a traiter
MonFichier = Dir("*.doc")
 
'ourvrir chaque document tour à tour
Do Until MonFichier = ""
    Documents.Open MonFichier
 
    'Appeler la procedure de traitement
    Call DateAChanger(MonFichier)
...
MonFichier contient une chaîne de caractère, passée en argument de la procédure DateAChanger.

Code :
1
2
3
4
Sub DateAChanger(ByVal oFile As Variant)
'Dim oFile As Variant
    For Each oFile In ActiveDocument.Fields
...
Ici, comme oFile est un variant, on ne sait pas trop ce que l'on attend. Mais on reçoit une chaîne de caractère, en valeur.
Cette chaîne, on ne s'en sert pas, mais on essai de lui affecter un objet! cela ne peut pas fonctionner.

Alors, soyons fous :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'donner le type de fichiers a traiter
MonFichier = Dir("*.doc")
 
'ourvrir chaque document tour à tour
Do Until MonFichier = ""
    Documents.Open MonFichier
 
    'Appeler la procedure de traitement
    Call DateAChanger
...
 
Sub DateAChanger()
Dim oField As Word.Field
    For Each oField In ActiveDocument.Fields
...
En fait l'argument qui pourrait être utile, c'est une instance du document à modifier
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'donner le type de fichiers a traiter
MonFichier = Dir("*.doc")
 
'ourvrir chaque document tour à tour
Do Until MonFichier = ""
    Set oDoc = Documents.Open(MonFichier)
 
    'Appeler la procedure de traitement
    Call DateAChanger(oDoc)
...
 
Sub DateAChanger(byval oDoc as Word.Document)
Dim oField As Word.Field
    For Each oField In oDoc.Fields
...
Il y en a peut-être d'autres...

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 16h30   #3
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : avril 2011
Messages : 4
Points : 1
Points : 1
Bonjour PGZ,
et merci pour la réponse rapide.

Alors je suis assez content car j'avais bien senti que le problème venait de là. Simplement, j'avais fait comme tu le mentionnes dans ton premier exemple:

Code :
1
2
3
4
5
6
7
8
9
 
'Appeler la procedure de traitement
    Call DateAChanger
...
 
Sub DateAChanger()
Dim oField As Word.Field
    For Each oField In ActiveDocument.Fields
...
mais cela ne marche pas (j'oublie peut-être quelque chose encore?) puisque les deux procédures sont indépendantes l'une de l'autre (DateAChanger ne s’exécute pas dans ChangementDate_Click). Je ne peux lancer que l'une ou l'autre séparément.

En second lieu, j'ai testé le second exemple et lorsque je lance le tout, un message m'indique que la variable oFile n'a pas été définie (ce qui est vrai dans ChangementDate_Click). Je l'ai donc défini comme variant (ça ne marche pas) puis comme Word.Field et j'obtiens cette erreur: "incompatibilité de type".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
'première procédure
Sub GestionFormation_Click()
...
Dim oDoc As Word.Field
...
Do Until MonFichier = ""
    Set oDoc = Documents.Open(MonFichier)
...
'procedure de traitement des fichiers
Public Sub DateAChanger(ByVal oDoc As Word.Document)
Dim oField As Word.Field
...
Que faut-il en penser? En te remerciant de ta patience et de ton investissement.
Pick
pickanier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 20h20   #4
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonsoir.

Il serait plus clair que tu donnes dans chaque cas le code que tu as modifié et les pb rencontrés.

Cordialement,
¨
PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 09h45   #5
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : avril 2011
Messages : 4
Points : 1
Points : 1
Bonjour,

désolé de ne répondre que maintenant et merci encore de te pencher sur mon problème.
Alors je vais essayer d'être plus clair. Il me semble que ton second exemple correspondrait mieux à ce que je cherche à obtenir.

Donc voici le code que j'ai adapté:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
Option Explicit
 
Sub GestionFormation()
'compteur de fichiers traites
Dim nb As Integer
Dim MonFichier As String
Dim Odoc As Word.Document
 
'chemin du dossier contenant les fichiers
Const RepATraiter = "C:\test\"
'chemin du dossier ou déplasser les fichiers
Const RepTraité = "C:\traite\"
 
'desactiver le mise a jour ecran
Application.ScreenUpdating = False
 
'changer le dossier courant
ChDir RepATraiter
 
'donner le type de fichiers a traiter
MonFichier = Dir("*.doc")
 
'ourvrir chaque docuement tour à tour
Do Until MonFichier = ""
    Set Odoc = Documents.Open(MonFichier)
 
    'Appeler la procedure de traitement
    Call DateAChanger(Odoc)
 
    'Fermer le document
    Documents(MonFichier).Close savechanges:=False
 
    'copier le fichier dans le dossier de destination
    FileCopy RepATraiter & MonFichier, RepTraité & MonFichier
 
    'Passer au fichier suivant
    MonFichier = Dir
 
    'compter le nombre de documents traites
    nb = nb + 1
Loop
 
'message si aucun fichier a traiter
If nb = 0 Then
    MsgBox "Aucun fichier ne répond aux critères"
End If
End Sub
 
'procedure de traitement des fichiers
Sub DateAChanger(ByVal Odoc)
Dim oField As Word.Field
    For Each oField In Odoc.Fields
    If oField.Type = wdFieldTime Then
    oField.Unlink
End If
Next
Set oField = Nothing
End Sub
La macro se lance, ouvre un à un mes fichiers .doc, les enregistre dans le dossier de destination et puis c'est tout. Je voudrais que les champs TIME soient supprimés s'ils existent puis remplacés par des SaveDate.

Je continue à chercher de toute façon. Je me demande si ce n'est pas mon FileCopy qui pose problème. C'est-à-dire que cette fonction (c'en est bien une?) copie les fichiers en empêchant le traitement sur les dates de s'effectuer.

Bien cordialement.
Pick

edit:
Ca y est, c'est résolu! En fait, j'ai modifié le savechanges en "True" et de ce fait, les modifications sont conservées.

Maintenant, j'aurais une dernière petite question. Comment faire pour que la nouvelle date s'insère au même emplacement que l'ancienne, dans le document? Par exemple, l'ancienne date automatique se trouvait en haut à droite. Et là maintenant, avec ma macro, la nouvelle date se trouve en début de document, à gauche.

Merci encore à toi.
pickanier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 14h53   #6
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : avril 2011
Messages : 4
Points : 1
Points : 1
Par défaut Suite et Fin

Bonjour,

Bon finalement, j'ai aussi trouvé comment "remplacer" mon code de champ TIME par un SAVEDATE en respectant la disposition du document initial.

Je donne mon code en entier si ça peut aider à décoincer certaines personnes peu spécialistes du vba Word.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
Option Explicit
 
Sub ChangementEnDateFixe_Click()
'compteur de fichiers traites
Dim nb As Integer
Dim MonFichier As String
Dim Odoc As Word.Document
Dim oField As Word.Field
 
 
'chemin du dossier contenant les fichiers
Const RepATraiter = "C:\test\"
'chemin du dossier ou déplasser les fichiers
Const RepTraite = "C:\traite\"
 
'desactiver le mise a jour ecran
Application.ScreenUpdating = False
 
'changer le dossier courant
ChDir RepATraiter
 
'donner le type de fichiers a traiter
MonFichier = Dir("*.doc")
 
'ourvrir chaque docuement tour à tour
Do Until MonFichier = ""
    Set Odoc = Documents.Open(MonFichier)
 
'Trouver positionnement dans le document
 Dim myRange As Word.Range
 
 For Each oField In ActiveDocument.Fields
     Select Case oField.Type
       Case 32 'correspondance a TIME
         Set myRange = oField.Code
         oField.Delete
         myRange.Collapse wdCollapseStart
         myRange.Fields.Add myRange, Type:=wdFieldSaveDate
     End Select
 Next
 'pour rompre le lien de mise à jour automatique
 For Each oField In Odoc.Fields
    If oField.Type = wdFieldSaveDate Then
    oField.Unlink
End If
Next
Set oField = Nothing
 
 
    'Fermer le document
    Documents(Odoc).Close savechanges:=True
 
    'copier le fichier dans le dossier de destination
    'FileCopy RepATraiter & MonFichier, RepTraite & MonFichier
 
    'Passer au fichier suivant
    MonFichier = Dir
 
    'compter le nombre de documents traites
    nb = nb + 1
 
 
Loop
 
'message si aucun fichier a traiter
If nb = 0 Then
    MsgBox "Aucun fichier ne répond aux critères"
End If
End Sub
Merci encore pour les réponses
Bien à vous
pickanier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h11.


 
 
 
 
Partenaires

Hébergement Web