VBA : Problèmes de format de fichier

Bonsoir,

Banzai m'a fourni un code sur un autre fil - que j'ai repris dans le fichier ci-joint "Création macro V2" - qui permet de créer un nouveau fichier et de joindre un code dans ThisWorkbook de ce nouveau fichier.

Sur Excel 2003, tout fonctionne parfaitement après que j'ai coché dans Visual Basic, sous Outils/Référence, l'option "Microsoft Visual Basic For Applications Extensibility 5.3" et après avoir coché dans le menu Outils/ Macro/Sécurité "Faire confiance au projet Visual Basic".

Sur Excel 2007, j'ai tenté de placer les options de sécurité des macros selon l'image 1, j'ai coché "Microsoft Visual Basic For Applications Extensibility 5.3" comme sur l'image 2 et l'on voit sur l'image 3 que le code dans ThisWorkbook du fichier nouvellement créé "Fichier X" est bien en place avant d'être refermé par la ligne .close (en janue).

Par contre, lors de la réouverture de ce "Fichier X", j'ai tout d'abord un message indiquant "Le format du fichier que vous tentez d'ouvrir, "Référence", est différent de celui spécifié par l'extension du fichier. Assurez-vous que le fichier n'est pas endommagé et qu'il provient d'une source fiable avant de l'ouvrir. Souhaitez-vous ouvrir le fichier maintenant ?" et lorsque je clique sur "Oui", le code placé sous ThisWorkbook a disparu.

Savez-vous alors comment 1) éviter d'avoir ce message sur l'extension du fichier à l'ouverture (j'ai ce message à d'autres occasions et c'est très embêtant) et 2) comment faire pour que le code reste en place ?

Il est bien entendu que le but serait de pouvoir utiliser le fichier "Création macro V2" avec n'importe quelle version Excel et que les fichiers ainsi créés s'ouvrent sans problème sur n'importe quelle version aussi.

J'ai également tenté de créer des fichiers .xlsm sur Excel 2007, mais ça ne passe pas, la macro bloque sur

 .SaveAs Filename:=Chemin & "\" & "Fichier X" & ".xlsm"

A vous relire.

capture 1 capture 2 capture 3

Bonsoir Yvouille,

Normal tu es sur 2007, mais tu enregistres un fichier contenant des macros avec l'extensions ".xls"

Il faut enregistrer le fichier au format ".xlsm" ou n'utiliser que 2003

A+

Bonsoir

En fouinant un peu une autre méthode

Fonctionne sous 2003

Salut Bruno,

C'est rageant, j'espérais vraiment qu'il soit possible de créer depuis Excel 2007 un fichier Excel 2003 avec macro utilisable sur toutes les versions, à l'instar d'un fichier sans macro.

Salut Banzai,

Je n'ai testé ta nouvelle proposition que sur Excel 2010, mais ça ne passe pas non plus ; ça bloque sur la ligne With .VBProject.VBComponents("ThisWorkbook").CodeModule

J'espère encore que quelqu'un me propose une (autre) solution.

Cordialement

Bonjour tous,

Pour que le classeur soit compatible toutes versions je crois qu'il faut ajouter...

Dim V
Dim Chemin As String
    V = Val(Application.Version)
    Chemin = "C:\Fichiers Liens\fichier X.xls"
    With ActiveWorkbook
        If V < 12 Then
            .SaveAs Filename:=Chemin
        Else
            .SaveAs Filename:=Chemin, FileFormat:=56
        End If

    End With

J'ai testé dans les deux sens et ça semble fonctionner.

Tu dis.

Cordialement.

Salut Lermite,

Très bien vue je pense effectivement que c'est LA solution

Pour info, cela peut s'écrire aussi :

.SaveAs Filename:=Chemin, FileFormat:=xlExcel8

d'après l'aide d'Excel

Référence du développeur Excel

Workbook.SaveAs, méthode

Afficher tout

Masquer tout

Cette méthode enregistre dans un autre fichier les modifications effectuées dans le classeur.

Syntaxe

expression.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)

expression Variable qui représente un objet Workbook.

Paramètres

Nom Obligatoire/Facultatif Type de données Description

Filename Facultatif Variant Chaîne qui indique le nom du fichier à enregistrer. Vous pouvez inclure un chemin complet ; si vous ne le faites pas, Microsoft Excel enregistre le fichier dans le dossier actif.

FileFormat Facultatif Variant Format de fichier à utiliser lorsque vous enregistrez le fichier. Voir la propriété XlFileFormat pour connaître la liste des choix possibles. Pour un fichier existant, le format par défaut est le dernier qui a été spécifié ; pour un nouveau fichier, le format par défaut est celui de la version d’Excel actuellement utilisée.

Password Facultatif Variant Chaîne qui respecte la casse (maximum 15 caractères) et indique le mot de passe de protection à donner au fichier.

WriteResPassword Facultatif Variant Chaîne qui indique le mot de passe de protection en écriture pour ce fichier. Si un fichier est enregistré avec un mot de passe et que ce mot de passe n’est pas fourni lors de l’ouverture du fichier, celui-ci s’ouvre en lecture seule.

ReadOnlyRecommended Facultatif Variant True pour afficher un message au moment de l’ouverture du fichier, conseillant de l’ouvrir en lecture seule.

CreateBackup Facultatif Variant True pour créer un fichier de sauvegarde.

AccessMode Facultatif XlSaveAsAccessMode Mode d’accès pour le classeur.

ConflictResolution Facultatif XlSaveConflictResolution Valeur XlSaveConflictResolution qui détermine comment la méthode résout un conflit lors de l’enregistrement du classeur. Avec xlUserResolution, la boîte de dialogue de résolution des conflits s’affiche. Avec xlLocalSessionChanges, les modifications effectuées par l’utilisateur local sont automatiquement acceptées. Avec xlOtherSessionChanges, les modifications provenant des autres sessions sont automatiquement acceptées à la place de celles de l’utilisateur local. Si cet argument est omis, la boîte de dialogue de résolution des conflits s’affiche.

AddToMru Facultatif Variant True pour ajouter ce classeur à la liste des derniers fichiers utilisés. La valeur par défaut est False.

TextCodepage Facultatif Variant Ignoré pour toutes les langues dans Microsoft Excel.

Remarque

Quand Excel enregistre un classeur sur l’un des formats CSV ou texte, qui sont spécifiés à l’aide du paramètre FormatFichier, Excel utilise la page de codes correspondant à la langue des paramètres régionaux utilisée sur l’ordinateur actuel. Ce paramètre système est disponible dans le Panneau de configuration, en cliquant sur Région et langue, puis sur l’onglet Emplacement sous Emplacement actuel.

TextVisualLayout Facultatif Variant Ignoré pour toutes les langues dans Microsoft Excel.

Remarque

Quand Excel enregistre un classeur sur l’un des formats CSV ou texte, qui sont spécifiés à l’aide du paramètre FormatFichier, ces formats sont enregistrés en disposition logique. Si du texte de gauche à droite (LTR) est imbriqué avec du texte de droite à gauche (RTL) dans le fichier, ou inversement, la disposition logique enregistre le contenu du fichier dans l’ordre de lecture correct pour toutes les langues du fichier sans tenir compte du sens. Lorsqu’une application ouvre le fichier, chaque passage de caractères LTR ou RTL est rendu dans le bon sens en fonction des plages de valeurs de caractères dans la page de codes (à moins qu’une application conçue pour afficher la disposition exacte de la mémoire du fichier ne soit utilisée pour l’ouvrir, telle qu’un débogueur ou un éditeur).

Local Facultatif Variant True enregistre les fichiers en fonction de la langue de Microsoft Excel (y compris les paramètres du Panneau de configuration). False (valeur par défaut) enregistre les fichiers en fonction de la langue de Visual Basic pour Applications (VBA) (qui est généralement l’anglais des États-Unis, sauf si le projet VBA où Workbooks.Open est exécuté est un ancien projet VBA XL5/95 de niveau international).

Remarques

Utilisez des mots de passe forts combinant des lettres majuscules et minuscules, des chiffres et des symboles. Les mots de passe faibles ne combinent pas ces éléments. Mot de passe fort : Y6dh!et5. Mot de passe faible : House27. Utilisez un mot de passe fort facile à retenir, ainsi vous n’aurez pas besoin de le noter sur un papier.

Énumération XlFileFormat

Indique le format de fichier à utiliser pour l'enregistrement de la feuille de calcul.

Informations sur la version

Version ajoutée : Excel 2007

Nom Valeur Description

xlAddIn 18 Complément Microsoft Excel 97-2003

xlAddIn8 18 Complément Microsoft Excel 97-2003

xlCSV 6 CSV

xlCSVMac 22 Macintosh CSV

xlCSVMSDOS 24 MSDOS CSV

xlCSVWindows 23 Windows CSV

xlCurrentPlatformText -4158 Texte de la plate-forme actuelle

xlDBF2 7 DBF2

xlDBF3 8 DBF3

xlDBF4 11 DBF4

xlDIF 9 DIF

xlExcel12 50 Excel12

xlExcel2 16 Excel2

xlExcel2FarEast 27 Excel2 FarEast

xlExcel3 29 Excel3

xlExcel4 33 Excel4

xlExcel4Workbook 35 Classeur Excel4

xlExcel5 39 Excel5

xlExcel7 39 Excel7

xlExcel8 56 Excel8

xlExcel9795 43 Excel9795

xlHtml 44 Format HTML

xlIntlAddIn 26 Complément international

xlIntlMacro 25 Macro internationale

xlOpenDocumentSpreadsheet 60 Feuille de calcul OpenDocument

xlOpenXMLAddIn 55 Complément Open XML

xlOpenXMLTemplate 54 Modèle Open XML

xlOpenXMLTemplateMacroEnabled 53 Modèle Open XML avec macros

xlOpenXMLWorkbook 51 Classeur Open XML

xlOpenXMLWorkbookMacroEnabled 52 Classeur Open XML avec macros

xlSYLK 2 SYLK

xlTemplate 17 Modèle

xlTemplate8 17 Template 8

xlTextMac 19 Texte Macintosh

xlTextMSDOS 21 Texte MSDOS

xlTextPrinter 36 Texte imprimante

xlTextWindows 20 Texte Windows

xlUnicodeText 42 Texte Unicode

xlWebArchive 45 Archive Web

xlWJ2WD1 14 WJ2WD1

xlWJ3 40 WJ3

xlWJ3FJ3 41 WJ3FJ3

xlWK1 5 WK1

xlWK1ALL 31 WK1ALL

xlWK1FMT 30 WK1FMT

xlWK3 15 WK3

xlWK3FM3 32 WK3FM3

xlWK4 38 WK4

xlWKS 4 Feuille de calcul

xlWorkbookDefault 51 Classeur par défaut

xlWorkbookNormal -4143 Classeur normal

xlWorks2FarEast 28 Works2 FarEast

xlWQ1 34 WQ1

xlXMLSpreadsheet 46 Feuille de calcul XML

A+

Re,

Mais oui, ça fonctionne aussi avec la constante...

FileFormat:=xlExcel8

Sauf.... sur excel 2003

A+

Wow,

Après avoir effectué quelques essais, je suis enchanté des réponses reçues. Ca fontionne à merveille

Un merci tout particulier à Lermite et aux autres intervenants. Vous me tirez une sacrée épine du pied.

Cordialement.

Aie, c'est à nouveau moi

J'ai effectué ce matin des essais sur Excel 2010, et ça bloque sur la ligne With .VBProject.VBComponents("ThisWorkbook").CodeModule et ceci malgré que j'ai enclenché les deux options décrites dans mon tout premier message ("Paramètres des macros" et "Références - VBAProject").

Savez-vous si je dois faire quelque chose de plus avec cette version Excel afin que ça passe également ?

Cordialement.

[ligne]

Re,

J'ai DÉCOCHÉ "Références - VBAProject" appariement il n'est pas nécessaire, semblerait qu'il pause des problèmes de compatibilités d'une version à l'autre.

J'ai créé le classeur avec le 2000 et 2007, tout fonctionne dans les deux sens.

Je n'ai pas le 2010 mais je sais qu'il y à des différences notables dans la syntaxe, j'en sais quelque chose..

Faudrait voir la syntaxe dans l'aide du 2010 et peut-être faire une différence avec le code comme pour le SaveAs.

Note : la version 2010 à le N° 14 (pas 13 par superstition)

A+

EDIT : Quel est le N° ou texte de l'erreur ?

Salut et merci pour ta réponse.

J'ai essayé de décoché "Microsoft Visual Basic For Applications Extensibility 5.3" sous "Références VBAProject", mais ça ne change rien, ça bloque toujours au même endroit.

Comme je suis sur un PC allemand, ça ne sert à rien que je te donne le texte inscrit dans le message d'erreur, mais il s'agit de l'erreur 9 et l'information complémentaire dit à peu près ceci : Index en dehors du domaine valable".

Ce que je trouve bizarre, c'est que ça bloque avant le passge où l'on traite de la version Excel par les lignes

        If V < 12 Then
            .SaveAs Filename:=Chemin
        Else
            .SaveAs Filename:=Chemin, FileFormat:=56
        End If

A te relire

Bonjour à tous,

J'ai vérifié l'exécution du code sur Excel 2010, avec la méthode de Lermite, aucun problème

En revanche il ne faut pas oublier d'autoriser l'accès au Projet VBA (voir image dans le fichier)

A+

Salut Bruno et merci pour ton intervention.

Comme indiqué dans mes messages précédents, j'avais bien coché l'option indiquée, mais ça ne passe quand même pas.

Je ne compreds pas que ça fonctionne chez toi et pas chez moi

Encore une autre idée ?

Re,

J'emploi aussi une autre façon de faire ! essaye là.. ont sait jamais.

J'ai aussi remarquer que les références Microsoft Visual Basic For Applications Extensibility 5.3 ne sont pas les mêmes pour le 2000 et 2007 ? c'est peut-être là que le bas blesse ?

A la limite tu la coche MAIS uniquement dans Excel 2010

Sub Nouveau()
'nécessite une référence à :
'Microsoft Visual Basic For Applications Extensibility 5.3
' ??? Avec le 2000 et 2007 fonctionne sans et avec cette référence
Dim Chemin As String, V
Dim S As String, ProjVB
    S = "Private Sub Workbook_Open()" & vbLf
    S = S & "If Range(""A1"").Value=40 Then" & vbLf
    S = S & "Msgbox ""40 an A1 !""" & vbLf
    S = S & "End If" & vbLf
    S = S & "End Sub" & vbLf
    Chemin = "C:\Fichiers Liens"
    Sheets("Feuil1").Copy
    Application.DisplayAlerts = False
    Set ProjVB = ActiveWorkbook.VBProject.VBComponents("ThisWorkBook").CodeModule
    ProjVB.AddFromString S
    With ActiveWorkbook
        V = Val(Application.Version)
        If V < 12 Then
            .SaveAs Filename:=Chemin & "\" & "Fichier X" & ".xls"
        Else
            .SaveAs Filename:=Chemin & "\" & "Fichier X" & ".xls", FileFormat:=56
        End If
        .Close
    End With
    Application.DisplayAlerts = True
End Sub

Oublie pas d'adapter le chemin.

Autre remarque..

Si le classeur avec la macro est dans un répertoire personnel, par exemple "document" ou "téléchargement" si le fichier existe déjà il est impossible de l'écraser avec le jeton normal.

Tu dis,.

A+

EDIT : Encore une autre idée ?

Ouvre Excel en tant qu'administrateur, ensuite charger le fichier et tester.

EDIT 2 : Sorry, le temps de mettre ce code au point je n'ai pas vu vos dernier message.


Re,

C'est bizarre que tu ai les librairy 12.0, en principe c'est pour le 2007

Peut-être que Bruno pourras vérifier si ce ne devrait pas être 14.0 ?

Salut Lermite,

J'ai testé ton nouveau code, il passe bien sur Excel 2007, mais pas non plus sur "mon" Excel 2010 ; ça bloque sur la ligne Set ProjVB = ActiveWorkbook.VBProject.VBComponents("ThisWorkBook").CodeModule. Peut-être bien que ça a à voir avec le fait que je suis sur mon PC professionnel et que je n'ai pas tous les droits d'administrateur (par contre les options Excel, je les ai toutes enclenchées correctement).

Je crois que je vais laisser tomber l'idée de pouvoir utiliser ces codes sur mon PC professionnel, l'essentiel étant que je puisse les utiliser sur mon PC privé.

L'image fournie avec le texte "Microsoft Office 12.0 Objet Library" provient de mon PC privé avec Excel 2007. Sur Excel 2010 c'est effectivement la version 14.0.

Merci encore pour ta précieuse collaboration et merci à tous les autres membres qui m'ont permis d'avancer avec ce soucis.

Cordialement.

Rechercher des sujets similaires à "vba problemes format fichier"