ACCESS 2007 : Conversion fichier via Word plante avec Office 2007

Résolu
LargoWinch38 Messages postés 9 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 novembre 2012 - 27 nov. 2012 à 17:02
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 29 nov. 2012 à 01:01
Bonjour,

je suis passé, contraint et forcé, de Office 2003 à Office 2007. Je passe à coté des joyeusetés du ruban (quelle hérésie ce truc !) et demande de l'aide sur un problème sur lequel je m'arrache les cheveux. Je me suis déjà bien pris la tête avec des déclarations de recordset et de field auxquels il faut, en 2007, parfois ajouter "DAO." pour que ca tombe en marche, mais là, je cale.

J'ai developpé une appli sous Access qui recupère des tonnes de fichiers textes, les charge en base, et restitue un rapport au format XLS.
Ces fichiers étant crées sous un système Unix, je dois passer par une convertion pour remplacer les LF par des CR/LF et surtout virer certains caractères spéciaux qui trainent çà et là.
J'ai trouvé une fonction ConvertFileFormat sur je ne sais plus quel forum, qui répondait à mes besoins et fonctionnait parfaitement sous Office 2003.
Là, las, l'appel à la .find fait planter Access (avec envoi du rapport et réparation de la base).

J'ai d'abord tenté de passer mes bases au format Access 2007 (.accdb), idem.

J'ai tenté de remplacer le ".execute" par une ".execute2007" (trouvé au hasard d'une lecture sur un forum, mais absolument pas documenté par Ms, encore une belle conceté), mais ca ne change rien.
J'ai essayé diverses façon de déclarer mes objets,... nada, Access plante.

J'ai aussi, bien évidemment, testé ca sur au moins 2 postes différents, avec le même plantage au même endroit.

Le rapport d'erreur est assez peu bavard :
Exception Information
Code: 0xc0000005    Flags: 0x0000000
Record: 0x000000000000000000...
/CODE

Le code de la fonction :
Public Function ConvertFileFormat(ByVal Src As String, _
                                  ByVal Dest As String, _
                                  ByRef errCode As Integer, _
                                  ByRef errString As String) As Boolean
Dim WordApp As Word.Application
Dim WordDoc As Word.Document

    Set WordApp = CreateObject("Word.Application")
    WordApp.Visible = True
    WordApp.ShowMe

    On Error GoTo ConvertFileFormat_ERR

    Set WordDoc = WordApp.Documents.Open(Filename:=Src, ConfirmConversions:=False, ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", Format:=wdOpenFormatAuto, XMLTransform:="", Encoding:=65001, DocumentDirection:=wdLeftToRight)
    

    
    With WordDoc.Content.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "^m"
        .Replacement.Text = " "
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute Replace:=wdReplaceAll 
'ou    .Execute2007 Replace:=wdReplaceAll 
    End With


    WordDoc.SaveAs Filename:=Dest, FileFormat:=wdFormatText, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:=False, Encoding:=65001, InsertLineBreaks:=False, AllowSubstitutions:=False, LineEnding:=wdCRLF
    
    WordDoc.Close False
    ConvertFileFormat = True
      
ConvertFileFormat_END:
    Exit Function

ConvertFileFormat_ERR:
    errCode = Err.Number
    errString = Err.Description
    WordDoc.Close False
    Set WordDoc = Nothing
    
    WordApp.Quit
    Set WordApp = Nothing
    
    ConvertFileFormat = False
    
End Function


En mode debug, le plantage sur produit lors de l'appel du ".ClearFormatting" ou du ".text".

Quelqu'un saurait-il m'aider ?
Merci d'avance.

12 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 nov. 2012 à 01:01
Oui, en late binding, c'est vrai qu'il n'est pas utile de faire référence aux bibliothèques (c'est même un peu le but pour s'affranchir du versioning), les objets devant alors être dimensionnés As Object.

Perso, je mets les références pour le temps de la programmation, histoire d'avoir l'intellisense (le choix qui déroule après un point) : plus pratique. Puis, au finish, je les vire.
En VB6 (pas en VBA), de toute façon, les fichiers TLB n'ont pas d'influence sur la compilation d'un EXE, donc on peut les laisser.
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 nov. 2012 à 19:50
Salut

Condoléances.
Pour les joyeusetés du ruban, voilà un outil à posséder : http://blogmotion.fr/systeme/menu-ruban-2007-office-5328
Une chose à ne pas oublier avec les versions Office 2007 et suivantes : Le clic-droit fournit la plupart des commandes liées aux objets sélectionnés - commencer par là avant de fouiner dans le ruban.

DAO : Il faut oublier, tout peut s'oublier.
DA est obsolète depuis une dizaine d'années et certaines méthodes (comme .Find) fonctionnent très mal, voire pas.
Il FAUT utiliser ADO (ADODB) = référence " Microsoft ActiveX Data Objects 2.8 Libray "
Les méthodes et propriétés sont à peu près identiques à DAO.

Où se trouve ta fonction ConvertFileFormat ?
Dans Access ou dans Word ?

A ta place, je tenterai d'ajouter une pause, un DoEvents, entre le Open du docu et ta recherche. Pour faire l'essai, fait carrément un break (F9) après le Open, histoire de laisser à Word le temps de l'ouvrir, puis F5 pour poursuivre avec ton Find : Là, tu verras si cela a une influence.

Je viens de faire l'essai du remplacement comme tu l'as fait et comme l'enregistreur de macro le préconise : chez moi, sous Office 2010, ça marche bien.
Comme c'est mon jour de bonté et que ta question était dans la bonne catégorie et bien expliquée, j'ai relancer une vieille install avec Office 2007 et .... ça marche aussi.
Alors soit c'est ce problème de délai entre l'ouverture et le remplacement, soit c'est l'install de Office qui déconne.
Désolé.

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
LargoWinch38 Messages postés 9 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 novembre 2012
27 nov. 2012 à 20:41
Merci pour cette longue et interressante réponse.

J'ai fais moults tests en mode pas à pas, à partir de l'appel de la fonction, ai ajouté la visibilité de word pour vérifier si le fichier s'ouvrait bien, n'avait pas de problème (je les télécharge via ftp depuis l'Inde juste avant). Donc, le fichier a largement eu le temps de se charger.
Access plante sur le .ClearFormatting ou sur le .txt si j'enlève les .ClearFormatting et .Replacement.ClearFormatting.

Je vais creuser cette différence DAO/ADO. Je reste autodidacte sur tout ça, j'ai surement de trèèèès mauvaises habitudes.

Quant au lien, merci, mais il était fourni lors de l'install d'Office 2007. Dommage que certaines fonctions ne soient pas montrées.

Merci. A+ sans doute ;)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 nov. 2012 à 21:16
Ah, donc tu confirmes que tu es sous Access et que manipules un objet Word ?
Quelle référence as Word as-tu ajouté dans Access ?
Es-tu sûr d'avoir choisi la bonne version de Word ?
Access/Word 2007, ça doit être Office 12 (de mémoire)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 nov. 2012 à 21:21
Oui, je viens de vérifier, c'est la référence à "Microsoft Word 12.0 Object Library" qui représente le fichier MSWORD.OLB
0
LargoWinch38 Messages postés 9 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 novembre 2012
27 nov. 2012 à 22:46
Effectivement, je manipule un objet Word depuis Access, puis des objets Excel(*). Je n'ai pas la base sous la main, mais je suis sûr à 99.99% que c'est bien la librairie Word 2012. Mais je vérifie ça demain.

(*) H.S. : Je manipule aussi des objets Powerpoint et là, c'est la grosse galère : l'enregistreur de macro n'existe plus. Plus moyen d'obtenir facilement le nom des objets manipulés... Si vous avez un truc, un tuto ou autre, je prends !!!
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 nov. 2012 à 23:12
Ne confonds pas Office 12 (2007) avec Office 2012 (15).
(11=2003,13=Apple, 14=2010)

Non, PwerPoint, jamais trop testé.
Il faut s'intéresser à l'aide qui parle des objets et des collections d'objets.
0
LargoWinch38 Messages postés 9 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 novembre 2012
27 nov. 2012 à 23:26
Ouioui, Word 12 (y'a pas de version 2012, imsemb ). L'install d'Office 2007 m'a d'ailleurs viré les librairies version 11, que j'ai du aller chercher sur mon PC perso, pour faire tourner d'autres codes vb (sous Excel cette fois).

L'aide ? Mouais . Franchement, plus les versions avancent, moins je la trouve pratique. Ou alors, je ne sais pas l'utiliser, c'est possible aussi
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 nov. 2012 à 00:37
Pas normal, ça que les librairies 2003 aient disparues.
Normalement, elles sont dans des répertoires portant le n° d'office dans le répertoire du même métal.

Pour l'aide, je suis aussi de ton avis. Pour retrouver les propriétés et méthodes d'un objet, c'est galère et perturbant.
0
LargoWinch38 Messages postés 9 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 novembre 2012
28 nov. 2012 à 09:44
Bonjour,

je viens de vérifier.

Au niveau des références, j'ai :
- Visual Basic For applications
- Microsoft Access 12.0 object library
- Microsoft Visual Basic for Application Extensibility 5.3
- OLE Automation
- Microsoft activeX Data Objects 2.5 Library
- Microsoft Excel 12.0 Objects Library
- Microsoft Office 12.0 Objects Library
- Microsoft Scripting Runtime
- Microsoft Office Web Components 11.0
- Microsoft Word 12.0 Objects Library
- Microsoft Office 12.0 Access database engine Object Library.

Je viens de remplacer "Microsoft activeX Data Objects 2.5 Library" par la 2.8 : idem.
Je vais essayer sur un 3ème poste...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 nov. 2012 à 09:58
Bonjour,
Le rhume me joue sans doute un mauvais tour, mais je ne comprends pas la nécessité de références ici ... où je trouve un curieux mélange de Early Binding (les références dont on me dit qu'elles sont cochées et ensuite le Dim WordApp As Word.Application qui utilise la référence à Word) et de Late Binding (exprimé par Set WordApp = CreateObject("Word.Application"))
Je n'utiliserais personnellement pas la référence et irais directo au Late Binding.
Lire ici pour comprendre
http://word.mvps.org/faqs/interdev/earlyvslatebinding.htm

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
LargoWinch38 Messages postés 9 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 28 novembre 2012
28 nov. 2012 à 11:12
Bonjour,

tu ne m'as pas donné directement la solution, mais j'ai trouvé grâce à la piste que tu m'as donnée (merci pour le lien, très instructif).

Comme je le disais plus haut, je reste autodidacte sur VB et n'en connais pas toutes les nuances. Je m'appuie beaucoup sur les forums, sans toujours comprendre les subtilités, d'où les incohérences que tu as pu constater.
Donc, suivant ton conseil, je suis passé en LateBinding, virant la référence à Word 12. La compil m'a alors montré que je déclarais 2 objet WordApp : un "public" en early binding et un local en late binding. En faisant le ménage dans mon code, en remplaçant toutes les constantes genre wdFindContinue par leur valeur, miracle, c'est tombé en marche.

Merci pour le coup de main !
0
Rejoignez-nous