Vous cherchez à faire sélectionner
un ou plusieurs fichiers à l'utilisateur dans une boîte de dialogue,
puis à les ouvrir, les copier, les modifier, les renommer, les sauvegarder
en fonction de valeurs de cellules, les supprimer ? Vous voulez lister des fichiers,
changer leurs propriétés, ouvrir des fichiers textes, des fichiers
en réseaux, des répertoires, etc.
Eh bien cherchez dans cette page, il y a de fortes chances que vous trouviez
!
Si une chose mériterait d'être dans cette page, dites-le moi.
Méthodes d'ouverture de fichiers
Ouvrir un classeur excel
tout de suite des exemples très courts pour les impatients :
workbooks.open "c:\mes documents\classeur1.xls"
workbooks.open workbooks(activeworkbook.name).sheets("feuil1").range("A1").value
workbooks.open "bilan" & format(date,"ddmmyyyy") & ".xls"
pour ceux qui veulent en savoir un peu plus sur les paramètres de la fonction OPEN, voilà la syntaxe proposée par l'aide :
expression.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU)
La méthode Open permet d'ouvrir des classeurs, elle s'applique aux collections d'objets RecentFiles (fichiers récents) & Workbooks (classeurs excel). L'exemple ci-contre permet d'ouvrir le deuxième fichier des fichiers dernièrement ouverts : application.recentfiles(2).open
Paramètre FileName : c'est le chemin d'accès au fichier, il est le seul paramètre obligatoire.
Le chemin doit être indiqué entre parenthèses mais vous pouvez à la place mettre une variable chaîne (string).
=> workbooks.open filename:="c:\mes documents\classeur1.xls", ou,
=> dim str_fichier_chemin="c:\mes documents\classeur1.xls" : workbooks.open str_fichier_chemin
Paramètre UpdateLinks : permet de mettre ou ne pas mettre à jour les liaisons avec d'autres classeurs.
Les classeurs dont dépendent les données de votre classeur seront automatiquement ouverts et fermés pour la mise à jour. Facultatif.
Si cet argument n'est pas spécifié, un message invite l'utilisateur à indiquer comment les liens seront mis à jour.
Ce paramètre accepte les valeurs suivantes :
0 Ne met à jour aucune référence
1 Met à jour des références externes mais pas des références distantes
2 Met à jour des références distantes mais pas des références externes
3 Met à jour des références distantes et des références externes=> workbooks.open filename:="c:\mes documents\classeur1.xls", updatelinks:=0 Paramètre ReadOnly : le fichier sera en lecture seule si sa valeur est fixée à true.
Aucune modification ne pourront être apportées au classeur, l'utilisateur devra enregistrer le classeur sous un autre nom. Facultatif.
=> workbooks.open filename:="c:\mes documents\classeur1.xls", readonly:=0Paramètre Format : ce paramètre, à employer en cas d'ouverture d'un fichier texte, spécifie le séparateur employé
S'il n'est pas spécifé, c'est le séparateur dernièrement choisi qui sera pris en compte ( info à vérifier). Facultatif.
=> workbooks.open filename:="c:\mes documents\unfichiertexte.txt", format:=4
Ce paramètre accepte les valeurs suivantes :Valeur Séparateur
1 Tabulations
2 Virgules
3 Espaces
4 Points-virgules
5 Rien
6 Caractère personnalisé (voir argument Delimiter)
=> Si le paramètre a la valeur 6, il faudra alors définir le paramètre Delimiter, voire plus basParamètre Password : mot de passe nécessaire à l'ouverture d'un classeur.
S'il n'est pas renseigné et que le mot de passe est requis, Excel demandera de le saisir. Facultatif.Paramètre WriteResPassword : mot de passe nécessaire à l'accès en écriture à un classeur.
S'il n'est pas renseigné et que le mot de passe est requis, Excel demandera de le saisir. Facultatif.Paramètre IgnoreReadOnlyRecommended : si fixé à true, Excel n'affichera pas le message recommandant l'ouverture en lecture seule (si le classeur a été enregistré avec l'option Read-Only Recommended). Facultatif.
Paramètre Origin : spécifie l'origine du classeur Excel pour que les pages de code et le Retour chariot/Retour à la ligne (CR/LF)
Il peut s'agir de l'une des constantes XlPlatform suivantes : xlMacintosh, xlWindows ou xlMSDOS.
Si cet argument n'est pas spécifié, le système d'exploitation en cours est utilisé.Facultatif.Paramètre Delimiter : si le fichier est un fichier texte et si l'argument Format est 6, cet argument est une chaîne (d'un caractère) qui spécifie le caractère à utiliser comme séparateur. Par exemple, utilisez Chr(9) pour tabulations, « , » pour virgules, « ; » pour points-virgules ou un caractère personnalisé. Facultatif.
Paramètre Editable :
fixé à true & si le fichier est une macro complémentaire Microsoft Excel 4.0 crée dans Microsoft Excel 4.0, le fichier sera ouvert dans une fenêtre visible, fixé à false, le fichier sera ouvert dans une fenêtre masquée et "inaffichable".
fixé à true & si le fichier est un modèle Excel, le modèle sera ouvert pour modification, fixé à false, un nouveau classeur sera crée l'aide de ce modèle. Facultatif.Paramètre Notify : fixé à true, permet d'être averti quand un fichier sera accessible en mode lecture-écriture.
fixé à false, les tentatives d'accès à un fichier déjà ouvert par un autre utilisateur échoueront. Facultatif.Paramètre : Converter : index du premier convertisseur de fichier à tester à l'ouverture du fichier, si ce dernier ne reconnaît pas le fichier, tous les autres convertisseurs sont testés. L'index du convertisseur est composé des numéros de ligne des convertisseurs renvoyés par la propriété FileConverters. Facultatif.
Paramètre AddToMru : fixé à true, le fichier est ajouté dans la liste des fichiers récemment utilisés (que vous pouvez voir en-bas du menu fichier). Facultatif.
afficher la boîte de dialogue Fichier Ouvrir pour ouvrir un fichier
Première méthode avec l'instruction suivante :
mavariable=Application.Dialogs(xlDialogOpen).Show
=> attention, une fois un fichier choisi et la boîte de dialogue validée, le fichier est directement ouvert, aucun autre contrôle est possible avant l'ouverture du fichier.
=> la valeur retournée dans la variable "mavariable" est vrai si un fichier a bien été sélectionné, faux sinon.
=> les paramètres de la boîte de dialogue sont les suivants : file_text, update_links, read_only, format, prot_pwd, write_res_pwd, ignore_rorec, file_origin, custom_delimit, add_logical, editable, file_access, notify_logical, converter.
=> le répertoire que vous verrez lors de l'ouverture de la boîte est le répertoire courant ou par défaut d'Excel.
(la notion de répertoire courant sera évoqué à nouveau dans cette page).
L'exemple ci-dessous permet l'ouverture d'un fichier sans mise à jour, grâce à la spécification de la valeur 0 (false) du second argument "update". En prime, si l'utilisateur indique qu'il veut continuer, la feuille active est imprimée.If Application.Dialogs(xlDialogOpen).Show(, 0) Then
conti = MsgBox("Vous avez choisi le fichier " & ActiveWorkbook.Name & Chr(13) & Chr(13) & "Souhaitez-vous continuer ?." & Chr(13), vbYesNo + vbExclamation)
if conti=vbyes then activesheet.printout
End If
Deuxième méthode, avec l'instruction suivante :
fileToOpen = Application.GetOpenFilename()
=> cette instruction affiche la boîte Fichier Ouvrir et montre les fichiers de tout type. Si un fichier est sélectionnée, il est ouvert et le chemin complet d'accès à celui-ci est stocké dans la variable, sinon la variable prend la valeur false.
Mais cette méthode permet aussi de ne pas ouvrir directement le fichier, pour cela il suffit de contrôler la valeur de la variable fileToOpen et d'agir en conséquence. L'exemple ci-dessous vous montrer comment faire ce contrôle et montre aussi comment ne faire afficher à la boîte de dialogue Ouvrir que des fichiers textes.fileToOpen = ApplicationGetOpenFilename("Text Files (*.txt), *.txt")
If fileToOpen <> False Then
MsgBox "Open " & fileToOpen
End If
Afficher une boîte pour sélectionner un répertoire news (méthode peaufinée par F. Sigonneau) news (méthode plus ancienne)
Ouvrir un certain type de fichier
Ces exemples utilisent également les méthodes citées ci-dessus, d'affichage de boîtes d'ouverture préparamétrées.
1°) affichage des fichiers nommées exercice*.prn, soit exercice1.prn, exercice25.prn .....
application.dialogs.Item(xlDialogOpen).show arg1:="c:\Mesdocuments\exercice*.prn"
2°) autre méthode
ChDir "d:\excel\test" 'changement du répertoire courant
FilestoDisplay = "exercice*.txt"
SendKeys FilestoDisplay & "~"
FiletoOpen = application.getopenfilename
3°) application.dialogs(xlDialogOpen).show "c:\document\xls\*.*" 'pour tout afficher
4°) Autre exemple : news
5°) Les fichiers AAA*.log : SendKeys "AAA*.log~" : NomFic = Application.getopenfilename
Ouvrir et agir sur plusieurs fichiers en même temps
Ouverture multiple de fichiers : news
Ouverture multiple (noms de fichiers dans une liste (variable tableau)
: news Autre méthode :
Filename = application.getopenfilename(Multiselect:=true)
for i = 0 to ubound(Filename)-1
workbooks.Open Filename(i)
next i
Récupérer une valeur d'un fichier fermé
: news , astuce
issue de cette page : web.
Depuis, d'autres méthodes ont été trouvées sur les forums, de bons exemples sur le site de Frédéric : Site
de Frédéric S.
Vous trouverez une méthode pour lister les feuilles dans la page xl_feuille.htm
Ouvrir tous les fichiers d'un répertoire : news,
news
Ouvrir des fichiers situés dans des répertoires systèmes
: fichier écrit par Frédéric S., inspiré par les interventions de Laurent
L. En s'inspirant de la fonction dans ce fichier, le code ci-dessous ouvre
un claseur figurant dans le répertoire "Mes Documents" :
Workbooks.Open Filename:=DSpec(5) & "\" & "classeur2.xls"
'ps : vous pouvez aussi récupérer le nom de certains répertoires en fouillant
les variables d'environnement, pour plus d'infos, regarder la page suivante
: actionuser.htm
Ouvrir n'importe quel fichier à partir de vba : il y a plusieurs
méthodes qui laisse au système lancer le logiciel associé
à l'extension du fichier en question, en voilà quelques unes
:
shell "dir c:\temp > " & MyFilename
Ouvrir l'explorateur
sub explorateur_ouvrir()
returnvalue = shell("C:\WINDOWS\RUNDLL32.EXE shell,shellexecute", 2) 'win98 et infra
end subsub explorateur_ouvrir_repertoire()
shell "C:\WINDOWS\EXPLORER.EXE /n,/e,c:\mes documents\monfichier.xls", vbNormalFocus 'win98 et infra
end sub
Ouvrir un fichier sur un lecteur réseau : news , voir aussi plus bas
Ouvrir un fichier nommé semaine i, la semaine étant
la semaine en cours (par Eplucheur, le 13/04/2000, "Re: Question semaine
?")
Sub TuVasLOuvrirTonFichier()
Dim d, WkNum As long
d = Int(Now())
WkNum = DateSerial(Year(d + (8 - WeekDay(d)) Mod 7 - 3), 1, 1)
WkNum = ((d - WkNum - 3 + (WeekDay(WkNum) + 1) Mod 7)) \ 7 + 1
Workbooks.Open "c:\le bon dossier\" & "semaine" & WkNum & ".xls"
End Sub
Ouvrir/Insérer une image
Sub TestImage()
screenupdating = false
filetoOpen = application.getopenfilename("Fichiers JPG (*.jpg), *.jpg")
if filetoOpen <> false then activesheet.Pictures.Insert(filetoOpen).select
'msgbox "Ouvrir " & filetoOpen
end Subautre sujet : insérer au mieux une image dans une cellule : news, news
Ouvrir des fichiers SYLK : http://support.microsoft.com/support/kb/articles/Q215/5/91.ASP?community=0&L
N=FR-FR&SD=SO&ss=frkb&FR=0
Eviter le message "Fichier déjà ouvert"
Exécuter REGEDIT, et modifier la clé : HKEY_CLASSES_ROOT\Excel.Sheet.8\shell\Open\Command.
Si la valeur par défaut se termine par %1, essayer d'enlever ces caractères (voire enlever tout => A vérifier)
Ouvrir un fichier sans que sa macro auto_open / workbook_open ne s'exécute :
Sub macros_désactivation()
application.enableevents = false : workbooks.open "C:\Temp\Test.xls" : application.enableevents = True
end sub
Ouverture d'après un raccourci clavier
cf ma page raccourci
Procédures auto-open
Vous voulez créer une procédure qu'Excel exécutera au démarrage et qui pourra en appeler d'autres ?
Sous Excel 97 et supra, la procédure auto_open héritée d'Excel 95 fonctionne toujours.
Cependant, vous pouvez maintenant créer de nombreuses procédures énènementielles, c'est-à-dire des macros qui se déclencheront à l'avènement de différentes évènements pouvant se produire au sein d'une application Excel, d'un classeur Excel ou au sein d'autres objets d'excel. Ainsi, depuis Excel 97, vous pouvez utiliser la procédure évènementielle Workbook_Open
'à créer dans la feuille de code Workbook_Open
Private Sub Workbook_Open()End Sub
Pour plus d'infos sur les procédures évènementielles, lisez la section Procédures évènementielles de la page suivante : xl_vba_2.htm.
Pour des infos d'ordre général sur VBA, lisez donc xl_vba_1.htm, xl_vba_2.htm & xl_vbe_menus.htm.
Commandes d'ouverture de Microsoft Excel
Article de la Knowledge Base / Base de connaissances n° 211481
XL2000: Startup Switches for Microsoft Excel 2000
http://support.microsoft.com/default.aspx?scid=KB;EN-US;211481
A l'ouverture d'un fichier, Excel plante ou génère une erreur, quelquechose semble intervenir
Il est possible qu'une procédure se déclenche automatiquement à l'ouverture du classeur.
Pour essayer de rentrer dans ce classeur, soit vous l'ouvrez en appuyant sur la touche Shift, ceci désactivera les macros (ou vous donnera la possiblité de le faire), soit vous utilisez la petite macro dans la partie au-dessus qui indique à Excel de ne pas appliquer les procédures évènementielles.
Méthodes de récupération d'un fichier endommagé ou corrompu
Il y a des outils sur le web pour tenter de réparer ou visualiser ces fichiers. Vous pouvez obtenir des infos et un outil ici chez Microsoft : web, ou encore là : http://www.sosrestauration.com (service payant). Voir aussi ma page de ressources Excel.
Article en anglais de la Knowledge Base de Microsoft / Base de connaissances n° 291057
http://support.microsoft.com/default.aspx?scid=KB;EN-US;291057
XL2002: Methods for Recovering Data from Damaged Workbooks
Article en anglais de la Knowledge Base de Microsoft / Base de connaissances n°142117
XL: Summary of Methods to Recover Data from Corrupted Files
http://support.microsoft.com/default.aspx?scid=KB;EN-US;142117
Aide sur les problèmes de démarrage en général par Microsoft
Article en anglais de la Knowledge Base de Microsoft / Base de connaissances n°280504
XL: How to Troubleshoot Startup Problems in Microsoft Excel
http://support.microsoft.com/default.aspx?scid=KB;EN-US;280504
Sur le site de de Chip Pearson, une bonne page vous permettra de diagnostiquer et résoudre ces problèmes, elle s'appelle "Startup Errors In Excel".
Problème lors de l'ouverture à partir de l'explorateur windows
Premier problème
Le fichier se trouve dans le répertoire "Mes documents", quand l'on clique dessus, un message d'erreur indique qu Excel n'arrive pas à trouver le fichier "c:\Mes.xls", puis un autre qu'Excel ne trouve pas le fichier "\documents\fichier.xls", et enfin il trouve le fichier : news.Des conseils en suivant les liens suivants : http://support.microsoft.com/support/kb/articles/q296/0/55.asp http://support.microsoft.com/support/kb/articles/q211/4/94.asp
Second problèmeLe message suivant peut également apparaître : "le fichier c:\toto.xls ou un de ses composants est introuvable. Vérifier que le chemin et le nom de fichier sont corrects et que toutes les bibliotheques requises sont disponibles."
Troisième problème
Excel ouvre tous les fichiers du répertoire, quel que soit leur format !
Selon Laurent L, dans la conversation "Re: gros problème" du Mardi 19 Septembre 2000 1=à 18h44, vous pouvez essayer de supprimer le contenu éventuel du champ suivant : menu Outils -> Options -> Général -> "Autre dossier de démarrage".
Problème de fichiers à nom long à l'ouverture !!??
De: Laurent M., sujet: Re: nom de fichier long, Date : mardi 5 décembre 2000 19:24
J'ai déjà ce genre de problème. J'ignore pourquoi il s'est produit. Sans doute après l'installation d'un logiciel mal fait. Mais j'avais réparé le problème en allant dans l'Explorateur :Affichage/Options/onglet "Types de fichiers", choisir le type "Feuille Microsoft Excel", cliquer sur le bouton "Modifier", Sélectionner l'action "Open",
Cliquer sur "Modifier" et vérifier les options suivantes:
"Application utilisée..." : C:\MsOffice\Excel\excel.exe /e
"Utiliser DDE" : cochée
"Message DDE" : [open("%1")]
"Application" : Excel
"Application DDE inactive" : (rien)
"Rubrique" : system
Un évènement semble se produire à l'ouverture, et Excel "plante", que faire ?
Il est possible que ceci soit entraîné par une erreur d'éxécution dans une macro auto_open ou workbook_open. Je vous conseille d'ouvrir votre fichier en désactivant les macros (dans l'explorateur, ouvrez votre fichier en tenant la touche enfoncée. Si aucune macro automatique ne semble être la cause de votre problème, tenter la récupération d'un fichier corrompu. Voir en haut de la page pour les méthodes de récupération.
Ouverture lente
lisez l'article suivant : http://support.microsoft.com/support/kb/articles/Q167/0/81.ASP "OFF97: Opening and Closing Programs or Files May Be Slow", puis essayez un outil comme celui de Rob Bovey's, un code cleaner http://www.appspro.com/utilities/utilities.asp
Document non enregistré
après une session de travail, lorsque les élèves veulent enregistrer leurs travaux, il arrive d'obtenir le message suivant : DOCUMENT NON ENREGISTRE. Le micro n'est pas planté, mais impossible de l'enregistrer à partir de là. [Office est installé en local sur les disques]
de Manuel D., sujet "Re: excel, doc non enregistré", le jeudi 5 octobre 2000 15:14 Si les utilisateurs ont tous des droits "contrôle total" sur le répertoire où ils enregistrent, il s'agit peut-être d'un problème d'anti-virus. En effet, parfois les anti-virus possèdent une option qui est le scannage des fichiers temporaires, il vaut mieux désactiver cette option, elle peut provoquer ce type de message.
Chaque fois que je lance Excel, j'ai le message ...a effectué une opération non conforme.... module MSO9.DLL.
J'ai essayé de réparer office, de relancer l'install, de tout désinstaller et de réinstaller dans un nouveau dossier mais ça ne change rien. Que faire : essayer de supprimer le fichier des barres d'outils *.xlb correspondant à l'utilisateur situé dans un sous dossier de windows (par Jacky)
quand j'ouvre Word ou Excel le programme se ferme automatiquement apres quelques secondes :
regarder si vous n'êtes pas dans le cas de la fiche technique française Q18449 sur http://www.microsoft.com/france/support/menu/kb
Ouverture d'un fichier à mot de passe et message d'erreur "Méthode de chiffrement pas disponible dans le pays"
Auparavant je n'avais pas ce probleme, j'ai commencé a recevoir ce message après avoir changer le language de windows et d'office.
'Ce message apparaît lorsque, par exemple, on ouvre un fichier enregistré sur une version US avec une version Française. 'Il faut essayer de changer les paramètres régionaux de votre machine (à travers le panneau de configuration), comparer vos paramètres à ceux d'un poste où il n'y a pas de problèmes.
Pour excel 2000, il y a un fix semble-t-il (fix = outil de réparation) : ftp://ftppss.microsoft.com/outgoing/premier/nicolas.zip
Si vous avez XL 2000 & 97 et des fichiers qui vont sur les deux versions, enregistrez le mot de passe sous la version XL97, cela passera mieux.
Peut-être d'autres infos ici : http://disciplus.simplex.free.fr/xl/erreurs.htm#chiffrementindisponible
Ouverture d'un fichier en réseau systématiquement lente ou en lecture-seule
Files on Network Shares Open Slowly or Read-Only or You Receive an Error
Article en anglais de la Knowledge Base de Microsoft / Base de connaissances n° 814112
http://support.microsoft.com/default.aspx?scid=KB;EN-US;814112
Collection RecentFiles
Plus haut, nous avons indiqué que la méthode Open s'appliquait aussi aux objets Recentfiles.
Cela donne : application.recentfiles(2).open.Ci-contre, un code listant ces fichiers récents : news
Ci-dessous, des codes soucieux de contrôler l'ancienneté d'un fichier
ou de trouver le fichier le plus récent d'un répertoire
un fichier est-il en lecture seule : if GetAttr("C:\Temp\Test.xls")
AND 1 then ... , explication
distinguer la première ouverture d'un fichier des suivantes
: news
quel est le type du fichier : news
connaître la version du fichier sans l'ouvrir : news
le fichier existe-t-il ?
Dim FSO As New Scripting.FileSystemObject
On Error Resume Next
If FSO.GetFile(filepath:="C:\Temp\Book1.xls") Is Nothing Then Debug.Print "Does Not Exist" Else Debug.Print "Exists"if dir("c:\mes documents\monfichier.xls") <> "" then .............
Voir ma page web suivante, qui présente de NOMBREUX TEST d'EXISTENCE
ouvrir un fichier s'il n'est pas déjà ouvert (mercredi 29 septembre 1999 20:49, microsoft.public.fr.excel)
vérifier si un seul fichier est ouvert dans l'occurence en cours d'Excel : newsDim Wbk As Workbook
On Error Resume Next
Set Wbk = Workbooks("Test.xls")
On Error GoTo 0
If Wbk Is Nothing Then Workbooks.Open "C:\Temp\Test.xls" Else Set Wbk = NothingVoir ma page web suivante, qui présente de NOMBREUX TEST d'EXISTENCE
Créer un classeur classique : workbooks.add Créer un fichier sur la base d'un modèle
workbooks.add(MonModèle.xlt)
' l'instruction ci-dessous crée un classeur sur le modèle facture.xlt
' tout en exécutant une des macros automatiques héritées du modèle, à savoir la macro xlAutoOpen
workbooks.add(Template:="C:\Program Files\Microsoft Office\Modèles\Solutions - Tableur\FACTURE.XLT").runAutoMacros Which:=xlAutoOpen
Créer une macro complémentaire : voir xl_vba_1.htm L'Assistant Modèle
L'assistant modèle
Créer un raccourci sur le bureau : http://longre.free.fr => version la plus récente sur ce site, il y a bien de nombreuses méthodes, certaines sont chez Fréd. S.Fichier (macro complémentaire) de l'assistant modèle : wztamplt.xls (AssisMod.xla)
L'assitant modèle sert à lier un fichier avec une liste de données Excel à un autre fichier dans lequel on saisit les infos. C'est pour éviter de programmer en VBA un UserForm qui alimente une liste de données. Comment procéder ?
*Créer manuellement un "formulaire" de saisie, cad des cellules mises en forme, la commande Données validation pour limiter les saisies et liste déroulante, et des contrôles de catégorie formulaire (inutile ceux de VBA).
*utiliser la protection
*lancer Données Assistant modèle qui va
-créer le modèle basé sur ton classeur
-créer la liste Excel qui va avec dans un nouveau classeur
-établit la relation entre les deux
*utiliser cette structure (inutile d'ouvrir la base) en faisant
-Fichier Nouveau Formulaire
-Saisir les données d'une fiche
-Enregistrer (ou sous) : un boite de dialogue demande si on doit créer un enregistrement dans la baseAttention
*si fermer sans enregistrer, pas de ligne dans BDD
*inutile d'écrire des macros, c'est le boulot de l'assistant
*la liste est augmentée, mais un TCD ne suit pas les nouveaux enregistrements...
Exemples d'attribution d'un nom à la sauvegarde
sauvegarde en insérant une date dans le nom du fichier
myFilename="document du " & format(date,"YYmmdd")& ".XLS"
activeworkbook.saveas Filename:=myFilename
sauvegarde en insérant la valeur d'une cellule dans le nom du fichier
myFilename = "C:\Excel\" & range("A1").value & ".xls" : activeworkbook.saveas Filename:=myFilename
sauvegarde en insérant le nom d'une feuille dans le nom du fichier
workbooks("runReport.xls").saveas "C:\Files\" & activesheet.name
sauvegarde combinant la date et le nom qui ont pour valeur celles des cellules nommées "laDate" et "leNom"
Sub EnregPerso()
Const Rep = "C:\Mes documents\test\"
On Error Resume Next
If [leNom] <> "" And [laDate] <> "" Then ActiveWorkbook.saveas Rep & [leNom] & Format([laDate], "yyyymmdd")
End Sub
enregistrer automatiquement chaque jour sous un nom différent (ex: "Essai 27 /10/1999")
insérer la macro suivantedans la feuille de code de "thisworkbook"
Private Sub Workbook_BeforeSave(ByVal saveasUI As Boolean, Cancel As Boolean)
thisworkbook.saveas "Essai " & format(Date, "dd mm yy")
end Sub
affichage de la boîte de protection/déprotection d'un fichier
application.dialogs(xlDialogProtectdocument).show
sauvegarder tous les classeurs
Public Sub SaveAll()
Dim WB As Workbook
For Each WB In Workbooks
WB.Save
Next WB
Application.StatusBar = "All Workbooks Saved."End Sub
Concaténation de fichiers : basé sur une méthode DOS, ceci ne marchera que très bien pour les fichiers à plat.
'cet exemple concatène tous les fichiers textes quels qu'ils soient (tous les fichiers de type*.txt) dans un seul fichier appelé monfichier.txt
'les originaux sont conservés, la concaténation se fait je pense par ordre alphabétique du nom de fichier.
Shell ("command.com /C copy c:\*.txt c:\monfichier.txt")
Fusion de classeurs :
* définisser un classeur cible où seront copier les feuilles des classeurs sources
* utiliser une méthode d'ouverture de fichiers multiples, comme celle que vous trouvez au début de cette page, pour ouvrir chaque classeur chacun leur tour
* utiliser une boucle "for each" pour boucler sur toutes pour boucler sur les feuilles d'un classeur source et copier les dans le classeur cible.
Exercer un certain contrôle sur la sauvegarde
comment empêcher la sauvegarde : newssi vous voulez écraser ou ne pas écraser un fichier : news le fichier a été sauvé ou pas ? If Not MonClasseur.Saved Then MonClasseur.Savesauvegarde sans macros : newsdemander à l'utilisateur s'il souhaite enregistrer son travail et sous quel nom de fichier
if msgbox("Voulez-vous enregistrer le classeur ?", vbYesNo) = vbYes then application.dialogs(xldialogsaveas).show
détecter l'emploi de la commande Enregistrer Sous (saveas event)Private Sub Workbook_BeforeSave(ByVal saveasUI As Boolean, Cancel As Boolean)
If saveasUI Then MsgBox "Save As" Else Exit Sub
End Sub
Sauvegarde automatique : Voir AutoBackUp sur http://www.rb-ad.dircon.co.uk/rob/excelvba/utils/index.htm (n'écrase pas la version précédente) Correctif au bug de l'enregistrement automatique : ce patch se trouve ici, du moins pour la version US : http://support.microsoft.com/support/downloads/LNP577.asp
Exemples d'attribution d'un format à la sauvegarde
sauvegarde sous un un autre nom et autre format
activeworkbook.saveas filename:="C:\Conversion\" & Left$(activeworkbook.name, Len(activeworkbook.name) - 4) & "5.xls", Fileformat :=xlExcel5
enregistrement au format texte : activeworkbook.saveas fileName:="c:\temptexte.txt", _ FileFormat:=xlTextMSDOS enregistrement au format HTML
De: Patrick F., objet: "Re: macro pour HTML", date : jeudi 22 juin 2000 15:34
Fic_Htm = " C:\TEMP\ZAZA.HTM" ' nom du fichier en sortie
Feuille_Htm = "toutou" 'nom de la feuille à publier
ActiveWorkbook.PublishObjects.Add(xlSourceSheet, Fic_Htm,Feuille_Htm , "", xlHtmlStatic, "Làjesaisplus", "").Publish(True)excel.xlsaveaction=xlDoNotSaveChanges/xlSaveChanges
Fermer un classeur
activeworkbook.close
Fermer l'application excel
application.quit
Fermer l'application excel sans les alertes d'Excel
Excel se ferme sans contrôler si un classeur est ouvert ou non. Pensez-donc à sauvegarder au préalable les classeurs ouverts dans la session d'excel, sinon vous perdrez les modifications.
application.displayalerts=false
application.quit
Fermer un classeur en enregistrant ou non les modifications
activeworkbook.close savechanges:=true 'ou bien false
activewindow.close savechanges:=true 'ou bien false
Fermer le classeur actif sans sauver les modifcations
cette méthode trompe Excel en lui faisant considéré que
le classeur a déjà été sauvegardé.
pour cela, la propriété Saved est fixée à vrai
Sub FermerSansDiscuter()
with ActiveWorkbook
.Saved = True
.Close
End with
End Sub
Fermer un classeur en activant sa macro automatique Auto_Close
activeworkbook.runautomacros Which:=xlAutoClose
Empêcher/Autoriser la fermeture du fichier si la cellule A1 à une valeur donnée, ici 1
Private Sub Workbook_BeforeClose(Cancel As Boolean)
if range("A1") = 1 then Cancel = true
end Sub
Confirmer ou non la fermeture: news (confirm closing) Comment empêcher la sauvegarde à la fermeture: news Interdire la fermeture : news Annuler la fermeture automatique : news (Cancel Autoclose)
Fermer tous les classeurs inactifs (différent du classeur actif )
Public Sub CloseAllInactive()
Dim Wb As Workbook
Dim AWb As String
AWb = ActiveWorkbook.Name'SaveAll 'vous pouvez là appeler une procédure qui sauvegarde d'abord les classeurs
For Each Wb In Workbooks
If Wb.Name <> AWb Then
Wb.Close savechanges:=True
End If
Next Wb
Application.StatusBar = "All Workbooks Closed."End Sub
Fermer tous les classeurs actifs à l'ouverture d'un classeur
Cet exemple ferme tous les classeurs inactifs, mais s'ils n'ont pas été
sauvés, Excel vous demandera si vous voulez enregistrer les modifications
Sub Auto_Open()
Dim Wbk As Workbook
Application.screenupdating = False
For each Wbk In Workbooks
If Not Wbk Is thisworkbook Then Wbk.Close True
Next Wbk
End Sub
Fermer tous les classeurs sans exception en sauvegardant les dernières modifications
Public Sub CloseAll()
Dim Wb As Workbook
SaveAll
For Each Wb In Workbooks
If Wb.Name <> thisworkbook.Name Then
Wb.Close savechanges:=True
End If
Next Wb
thisworkbook.Close savechanges:=TrueEnd Sub
J'obtiens systématiquement la question "voulez vous sauvegarder?"
à la fermeture de mon classeur, or je ne l'ai en aucune manière
modifié, je l'ai simplement lu. Télécharger cette explication
: news
Cela peut être dû aux fonctions volatiles qui se trouvent dans votre classeur, comme ALEA, DECALER ou INDIRECT, MAINTENANT. Ces fonctions sont automatiquement recalculées à l'ouverture du classeur, Excel considère alors ce classeur comme modifié. Il existe une solution par une simple macro, à placer dans le module thisworkbook du classeur:
Private Sub Workbook_Open()
Me.Saved = True
End Sub
En effet, les fonctions volatiles éventuellement contenues dans le classeur sont recalculées avant le déclenchement de Workbook_Open. Il suffit donc de marquer le classeur comme Saved dans cette procédure pour éviter le problème. Pour généraliser cette parade à tous les classeurs ouverts, on peut placer cette macro dans le module thisworkbook d'une macro complémentaire XLA à laisser installée en permanence:
Dim WithEvents App As Application
Private Sub App_WorkbookOpen(ByVal Wb As Excel.Workbook)
Wb.Saved = True
End SubPrivate Sub Workbook_AddinInstall()
Set App = Application
End Sub
Methodes de suppression
afficher une boîte de suppression de fichiers
Application.Dialogs(xlDialogFileDelete).Show
Application.Dialogs(Excel.xlBuiltInDialog.xlDialogFileDelete).Show
supprimer le fichier s'il n'est pas en lecture seule
if Not GetAttr("C:\Temp\Zaza.xls") And 1 then kill "C:\Temp\Zaza.xls"
Si pour n'importe quelle raison (lecture seule, fichier déjà ouvert, fichier inexistant...),
la suppression est impossible, le fichier ne sera pas supprimé et VBA continuera l'exécution de la macro,
dans ce cas, utiliser un 'On Error Resume next' avant les instructions kill,
Attention, la méthode kill entraîne une suppression définitive du fichier
suppression avec possibilité d'annulation/envoi à la corbeille : news (appel à librairie), efficacité douteuse, à vérifier autre exemple de suppression
Public Sub killFile()
Dim wkbOtherWorkbook As Workbook
Dim strFilename As String
For each wkbOtherWorkbook In Application.Workbooks
If Not wkbOtherWorkbook Is thisworkbook Then
strFilename = wkbOtherWorkbook.FullName
kill strFilename
End If
Next wkbOtherWorkbook
End Sub
Comment faire pour supprimer les fichiers temporaires de Windows à la fermeture de l'application ?
Dim Fichier
with Application.FileSearch
.FileName = "*.*"
.LookIn = "C:\Windows\Temp"
.Execute
On Error Resume Next
For each Fichier In .FoundFiles
kill Fichier
Next
On Error Goto 0
End with
Nom de fichier & Renommage
Nom complet d'un fichier inscrit en A1
[A1] =activeworkbook.fullname 'il faut que le fichier soit sauvé pour avoir le chemin d'accès
Nom sans le chemin d'accès d'un fichier inscrit en A1
[A1] =activeworkbook.name
Nom du chemin d'accès
[A1]=activeworkbook.path 'il faut que le fichier soit sauvé pour avoir le chemin d'accès
Nom des fichiers ouverts
Dim Wkb As Workbook: For Each Wkb In Workbooks: MsgBox Wkb.Name: Next Wkb
Renommer un fichier, cette méthode permet aussi de déplacer ce fichier dans un autre répertoire
dim Oldname, Newname
Oldname = "G:\xltext\file2.txt" : Newname = "G:\xltext\file2.htm"
name Oldname as Newname 'renomme le fichier oldname en newname
debug.print dir(Oldname)
debug.print dir(Newname)
Extractions du nom d'un fichier
Extraction du nom de fichier par formule
{=DROITE(A1;EQUIV("\";STXT(A1;NBCAR(A1)-LIGNE(INDIRECT("1:"&NBCAR(A1)))+1;1);0)-1)}
Extaction du chemin et du nom du fichier par VBA - Excel 2000
Pos = InStrRev(FullName, "\") : Path = Left(FullName, Pos) : FName = Mid(FullName, Pos + 1)
MsgBox "Full name: " & FullName & Chr(13) & "Path: " & Path & Chr(13) & "File: " & FName
Extraire de l'adresse complète d'un fichier l'extension de ce
fichier : news
Extaction du chemin et du nom du fichier - Excel 1997
Pos = 1
Do Until Pos = 0
SavePos = Pos : Pos = InStr(Pos + 1, FullName, "\")
Loop
Path = Left(FullName, SavePos) : FName = Mid(FullName, SavePos + 1)
MsgBox "Full name: " & FullName & Chr(13) & "Path: " & Path & Chr(13) & "File: " & FName
Extraction du nom de fichier n° 2 par L.L
Declare Function GetFileTitleA Lib "Comdlg32" (ByVal lpszFile As String, ByVal lpszTitle As String, ByVal cbBuf As Long) As Long
Function NomFichier(Chemin As String) As String
Dim cbBuf As Long
cbBuf = GetFileTitleA(Chemin, vbNullString, 0) : NomFichier = Space$(cbBuf)
GetFileTitleA Chemin, NomFichier, cbBuf
End FunctionSub Test()
MsgBox NomFichier("C:\Temp\Test.xls")
End Sub
' Le nom donné en argument de la fonction NomFichier n'a pas à correspondre forcément à un fichier réellement existant, et l'exécution est très rapide.
Nom au format Windows 3.1, par L.L. pour SCAN, message : "Re: convertir Nom de fichier Windows en 8.3 ??" du samedi 5 août 2000 15:08
Private Declare Function GetShortPathNameA Lib "Kernel32" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Function NomCourt(NomLong As String) As String
NomCourt = Space$(GetShortPathNameA(NomLong, NomCourt, 0) - 1) : GetShortPathNameA NomLong, NomCourt, Len(NomCourt) + 1
End FunctionSub Test()
Dim NomDOS As String : NomDOS = NomCourt("C:\Nouveau Document Texte.txt")
If NomDOS = "" Then MsgBox "Fichier non trouvé" Else MsgBox "Nom court (8.3) : " & NomDOS
End Sub
Nom du répertoire du classeur
Set wb = ActiveWorkbook
ActivePath = Left(wb.FullName, Len(wb.FullName) - Len(ActiveWorkbook.Name))
Date de dernière modification d'un fichier : FileDateTime("C:\Mesdocuments\Test.xls")
Date de création d'un fichier : news
Auteur de la dernière modification du fichier : msgbox BuiltindocumentProperties("Last
Author").value
Fonction pour lire les propriétés dans une formule
: news
Connaître la version du fichier sans l'ouvrir : news
Lister les propriétés d'un fichier & leur valeur
Sub Macro1()
dim rw As Integer, str As String, p, MyCreateDate As String
On Error Goto ErrTrap
rw = 1 : worksheets(1).Activate
for each p In activeworkbook.BuiltindocumentProperties
cells(rw, 1).value = p.name : str = p.name
cells(rw, 2).value = activeworkbook.BuiltindocumentProperties(str)
nextProp:
rw = rw + 1
next
Exit Sub
ErrTrap:
cells(rw, 3).value = "Error"
Resume nextProp
end Sub
Lire les propriétés d'un fichier sans l'ouvrir
Dll de David Foster : http://www.panix.com/~dfoster/prog/office/fpropset/FPropSet.html
Dll de Microsoft : http://support.microsoft.com/support/kb/articles/Q224/3/51.asp (prendre le fichier DSOFILE.EXE (?))
Créer une copie du fichier ouvert
dim strNewname As String
strNewname = "Newname"
activeworkbook.savecopyas strNewname
Copier un fichier
FileCopy "test.xls", "essai.xls"
ou encore : filecopy "c:\mes documents\classeur1.xls" "c:\test.xls" voir aussi dans macros diverses www.mvps.org/vbnet/code/shell/shdirectorycopy.htm
www.mvps.org/vbnet/code/shell/shfileopadv.htm
Copier un répertoire, cf ci-dessous
Répertoire et chemin d'accès
à un fichier
Connaître le répertoire d'accès du fichier actif
Set wb = ActiveWorkbook
ActivePath = Left(wb.FullName, Len(wb.FullName) - Len(ActiveWorkbook.Name))
Tester l'existence d'un répertoire
'permet aussi de tester l'existence d'un lecteur réseau
PathExists = Len(VBA.Dir(PathName:="M:\", Attributes:=vbDirectory))
' autres infos sur les répertoires réseaux, plus bastester la présence d'un lecteur de CD-Rom : xl_et_multimedia.html
Création d'un répertoire (directory en anglais)
'cette problématique vous amènera à connaître les méthodes mkdir, dir, chdir ...
'certaines d'entre elles sont reprises des commandes du système d'exploitation MS-DOS, tels mkdir (make directory) et rmdir (remove directory).
'Exemple sur le modèle des commandes DOS
'il contrôle avec la méthode Dir si le répertoire n'existe pas,
'le crée avec la commande mkdir si c'est le cas, et,
'le définit enfin comme répertoire courant avec la méthode ChDir.
'la méthode dir permet sur le même principe de contrôler l'existence de fichier selon leur type. L'aide excel vous fournira les compléments.
NomDossier = "C:\Bonne Année 2003"
If Dir(NomDossier, vbDirectory) = "" Then MkDir NomDossier
ChDir NomDossier 'changer de répertoire courant
'autre exemple, donnant la possibilité de donner le nom (complet éventuellement) du répertoire
Sub MakeDir()
dim NewFolder As String : NewFolder = curdir()
NewFolder = inputbox("Enter New Directory", "Make Directory", NewFolder)
if Dir(NewFolder, 16) = "" then MkDir NewFolder
ChDir NewFolder
end Sub
'Autre méthode, autre exemple'il est nécessaire ici de rajouter une référence à Windows Script Host Object Model (WSH)
'cela se fait à travers la commande Référence du menu Outils de Visual Basic Editor.
l'exemple crée un objet FileSystemObject grâce à cette référence puis,
'il efface et recrée le répertoire dont le chemin est contenu dans la variable FoldName
Sub creer_repertoire()
Dim FSO, FS, FoldName As String
FoldName = "C:\Windows\Temp"
Set FSO = CreateObject("Scripting.FileSystemObject")
FS = FSO.DeleteFolder(FoldName, True) 'supprime le répertoire
FS = FSO.CreateFolder(FoldName) 'efface le répertoire
End Sub
Copier la structure entière d'un répertoire
Premier exemple
'il est nécessaire ici de rajouter une référence à Windows Script Host Object Model (WSH)
'cela se fait à travers la commande Référence du menu Outils de Visual Basic Editor.'ceci copie le contenu du répertoire C:\Temp (y compris ses sous-répertoires) dans le répertoire C:\Temp\2 (préexistant).
'vous pouvez stocker les chemins dans des variables folder.Dim FSO As New FileSystemObject
FSO.CopyFolder "C:\Temp", "C:\Temp2"Autre exemple : news (dites-moi si vous avez su faire fonctionner ce code)
Suppression d'un répertoire
Utilisation de la commande DOS : rmdir "lerépertoire"
ou bien de la méthode DeleteFolder évoquée un peu plus haut
Connaître le chemin d'accès à des répertoires spécifiques
fichier écrit par Frédéric S., inspiré par les interventions de Laurent L.
en s'inspirant de ce fichier vous pouvez retrouver ou connaître le chemin exact du bureau ou d'autres répertoires, par exemple : msgbox DSpec(16)Voir aussi la page actionuser.htm pour accéder aux informations relatives aux répertoires applicatifs et à l'utilisateur
Nombre de fichier d'un répertoire
Autrement dit, le répertoire est-il vide ?
Avec la fonction Dir()
Sub FileNumber()
Filename = Dir(Path, 0) : fn = 1
Do While Filename <> ""
Filename = Dir()
fn = fn + 1
Loop
MsgBox fn
End SubA l'aide de la méthode FileSearch
With Application.FileSearch
.NewSearch: .LookIn = curdir: .FileType = msoFileTypeAllFiles
If .Execute Then MsgBox .FoundFiles.Count
End WithEgalement faisable à l'aide de l'objet FileSystemObject (référence Microsoft Scripting Runtime (scrrun.dll)
Egalement faisable à l'aide des APIS Windows FindFirstFile, FindNextFile, FindClose, voir là sur le web
Nombre de sous-répertoires : news
changer de répertoire sur un réseau => utiliser
la fonction API SetCurrentDirectoryA à la place de ChDir
Message de L.L., objet: "Re: Pointer sur le bon dossier pour ouvrir
le bon fichier", date : mercredi 22 mars 2000 11:13
Private Declare function SetCurrentDirectoryA Lib "Kernel32" (ByVal lpPathName As String) As long
Sub Test()
SetCurrentDirectoryA Workbooks("FichierRef.xls").Path
FicAOuvrir = Application.getopenfilename(...)
End Sub
tester l'existence d'un lecteur réseau : PathExists = Len(VBA.Dir(PathName:="M:\",
Attributes:=vbDirectory))
connecter un lecteur réseau : news
voir aussi les méthodes d'ouverture
Contenu d'un répertoire
!!! Méthode avec Api Windows de recherche récursive : news
Méthode Dir, lister les fichiers d'un certain type
Nous appelons à travers une procédure classique la fonction GetFileList en lui passant en paramètre le ype de fichier souhaité.La fonction retourne dans une variable tableau les noms de fichiers qui correspondent au critère FileSpec.
Sub test() 'with range("A1").resize(.Count) |
function GetFileList(FileSpec As String) As Variant |
Méthode FileSearch=> lister tous les fichiers d'un répertoire ou de tout une arborescence, code paru dans le message "List of files in folder" paru dans microsoft.public.excel.misc, aux environs du 07/10/99
Sub findFiles2()
with application.FileSearch
.NewSearch : .LookIn = "C:\Excel\xlstart" : .SearchSubFolders = true : .MatchTextExactly = false : .Filetype = msoFiletypeAllFiles
if .Execute(msoSortOrderDescending) > 0 then
msgbox "There were " & .FoundFiles.count & " file(s) found."
for i = 1 to .FoundFiles.count
cells(i, 1).value = .FoundFiles(i)
cells(i, 2).value = FileDateTime(.FoundFiles(i))
cells(i, 3).value = FileLen(.FoundFiles(i))
next i
else
msgbox "There were no files found."
end if
end with
end SubLa méthode FileSearch est puissante, consultez l'aide VBA pour connaître les valeurs que vous pouvez donner à ses différents paramètres.
Voici tout de même une méthode FileSearch personnalisée par Chris Rae : news
Boucler sur les fichiers XLS d'un répertoire, et leur appliquer une macro
News du 27/10/99 intitulé "loop thru files & exec Macro" dans microsoft.public.excel.programming
Cet exemple fait appel à deux procéduresSub loopThroughFilesExample()XL97: How to Convert All Files on a Server to Microsoft Excel Article ID: Q170431 Last Reviewed: May 18, 1999 http://support.microsoft.com/support/kb/articles/Q170/4/31.ASPapplication.DisplayAlerts = falseend Sub Sub doSomething(inBook As Workbook)
myFile = activeworkbook.name
myPath = "C:\Excel\deleteThese\" 'Change this to your directory
workfile = Dir(myPath & "*.xls")
do While workfile <> ""application.StatusBar = "Now working on " & workfile workbooks.Open Filename:=myPath & workfileloop
doSomething activeworkbook
activeworkbook.save : Windows(workfile).Close
Windows(myFile).Activate workfile = Dir()
application.StatusBar = false
'indiquez ce que vous voulez faire pour un classeur & utilisez les instruction suivantes pour boucler sur ses feuilles
for each wksht In inBook.worksheets
'do whatever you want here to each worksheet....
next wksht
end Sub
Lister les sous-répertoires d'un cheminRemplir une listbox de noms de fichierSub Get_Dirs()
dim dStr As String; tArr() As String
redim tArr(1)
dStr = Dir("C:\"; 16) '' Initilize path to scan
While dStr <> ""
if GetAttr("C:\" & dStr) = 16 then '' Check if it is a directory
tArr(ubound(tArr)) = dStr '' Save it to a variable(array)
redim preserve tArr(ubound(tArr) + 1)
end if
dStr = Dir() 'Get next item in specified directory.
Wend
redim preserve tArr(ubound(tArr) - 1) 'You don't want the last, empty item of the array.
worksheets(1).ListBoxes(1).List = tArr '' Fill a listbox with the array that contains the directories.
end SubAutre exemple qui colle la liste de fichiers sur une feuille par Tom Ogilvy, le mercredi 7 juillet 1999 : news Voir également les méthodes folder, folders et subfolders de la bibliothèque Microsoft Scripting RuntimeSub FillListBox()
dim List1 As ListBox
dim DirVar As String
Set List1 = dialogsheets(1).ListBoxes(1)
List1.RemoveAllItems
DirVar = Dir("c:\document\xls\*.*")
do While DirVar <> ""
List1.addItem Text:=DirVar
DirVar = Dir()
loop
end Sub
Import & Lecture de Fichiers Texte ou autre
Une bonne page web en la matière, celle du MVP Chip Pearson : http://www.cpearson.com/excel/imptext.htm Page de Microsoft sur la lecture et l'écriture des fichiers textes : Controlling File Access with Visual Basic for Applications
Activer l'assistant import : application.dialogs(xlDialogImportTextFile).show
Importer un fichier, dont les champs sont délimités par des virgules
Private Sub OpenMyTextFile()
Dim MyTextFile As String
MyTextFile = range("rangeName").Value 'cette cellule nommée doit contenir le chemin d'accès au fichier à importer
Workbooks.OpenText FileName:=MyTextFile , Comma:=True
End Sub
Importer un fichier CSV en collant les champs dans un ordre différent de celui du fichier
La méthode (une parmi d'autre) implique de lire les champs mais ils peuvent ne pas être importés.
Sub GetCSV()
Dim LName As String, FName As String, Region As String, Product As String, Sales As Integer, Ro As Integer
Ro = 2
Open "PIVOT.CSV" For Input As #1
While Not EOF(1)
Input #1, LName, FName, Region, Product, Sales
Cells(Ro, 1) = LName : Cells(Ro, 2) = Region : Cells(Ro, 3) = Sales : Ro = Ro + 1
Wend
Close #1
End Sub
Importer un fichier texte
Option Explicit
Sub ProcInsérerFichierTexte()
Dim StrNomFichier As String
On Error GoTo GestErreur
StrNomFichier = Application.GetOpenFilename(filefilter:="Tous,*.*,Fichiers Textes,*.txt", Title:="Insérer un fichier")
If StrNomFichier = "Faux" Then
Exit Sub
End If
Open StrNomFichier For Input As 1
ActiveCell.Value = Input$(LOF(1), 1)
Close 1
Exit Sub
GestErreur:
If Err.Number = 7 Then
MsgBox "Fichier trop grand : " & LOF(1) & " caractères"
Close 1
End If
End Sub
Ouvrir un fichier (au format texte ou prn) et dispatcher par ligne chaque caractère dans une cellule différente
filetoOpen = application.getopenfilename("Fichiers texte (*.txt),*.txt,Fichiers au format prn (*.prn),*.prn")
if filetoOpen <> false then
lg = 1 : col = 1
Open filetoOpen for Input As #1
do While Not EOF(1)
Line Input #1, tt
nb = Len(tt)
'StatusBar = nb
for I = 1 to nb
cells(lg, col).value = Mid(tt, I, 1)
col = col + 1
next I
col = 1
lg = lg + 1
loop
Close #1
cells.Columnwidth = 3.14
'voir ceci en action dans le fichier EDI ici : fichiers.html
Exemple de problématique d'importation de fichiers
Un fichier principal appelé "header.txt" contient une liste de fichiers et leur extension, il faut d'abord importer le premier fichier, puis tous les autres.
Cet exemple fait notamment appel à une requête dynamique :news
Message "Re: Ma macro d'importation d'un fichier texte ne reconnait pas les valeurs numériques", date : samedi 8 avril 2000 15:15 (fr.excel)
"Lorsque j'importe "manuellement" sous Excel 95 un fichier texte contenant des nombres, ces nombres sont reconnus comme des valeurs numériques.
Si j'automatise cette importation par une macro, les nombres ne sont plus reconnus comme des valeurs numériques mais comme du texte....
Est ce normal, ou peut on faire en sorte que ces nombres soient automatiquement reconnus comme des valeurs numériques ? ""Solution VBA : SAPtxt = Selection : Let Selection.Formula = SAPtxt
=> Formula redonne le format numérique: ex: (3.45= selection) et après on obtient selection.Formula= 3,45Solution manuelle 1, solution Microsoft trouvée ici , étonnant !
Cliquer sur cellule vidé non formatée en texte & saisissez-y la valeur 1. Copier cette cellule puis sélectionner la plage de cellules à convertir. Choisissez ensuite la commande Collage Spécial dans le menu Edition, choisissez l'opération de Multiplication, puis cliquez sur OK, et voilà !
Solution manuelle 2, solution également Microsoft
Après avoir sélectionné la plage de cellules à convertir, lancer l'assistant d'importation de fichiers texte en choisissant la commande "Convertir texte en tableau", cliquez deux fois sur Suivant pour passer à l'étape 2, dans le groupe d'informations Format des données, choisissez Général, pusi cliquer sur Terminer.Comment savoir si les valeurs ont été converties
si vous êtes en format standard et que les valeurs sont alignés à droite, alors elles sont bien considérées comme numériques (les valeurs textes sont alignées à gauche). Précaution à prendre : faites des essais sur des échantillons copiés de vos données.
Importer un fichier texte délimité : news
Exporter, enregistrement des fichiers ou écrire dans des fichiers au format texte ou autre
Utilisation de la méthode Open
Export en utilisant le point-virgule comme séparateur : news
(Export CSV)
Export CSV avec encapsulation des champs dans des guillemets : news
Export et lecture d'un fichier avec la méthode Scripting FileSystemObject
(WSH) : news
Ajout de données dans un fichier texte sans écraser son contenu - Méthode Append
a = FreeFile
Txt = " Bonjour"
Open "Fichier.txt" for Append As num
Print #a, Txt
Close (num)
Export d'enregistrements avec champs en longueur fixe : news
Export sans délimiteur
J'avais moi-même posé cette requête sur le groupe de discussion microsoft.public.fr.excel, sujet : "Re: enregistrer unfichier texte (txt)", le lundi 26 Juillet 1999 à 15:34. Le lecteur CDI PGT m'a alors fait part de ses découvertes :
Il semblerait qu'il n'y ait point d'export sous Excel de fichier texte sans délimiteur.
Ce qu'il faut faire c'est concaténer les cellules en une cellule unique (une cellule par ligne) sur une autre feuille, puis enregistrer cette feuille au format texte.
Reprenez par exemple l'astuce ci-haut d'exportation en longueur fixe, pour que cela fonctionne, il faut enlever la spécification de la taille des variables string.
Imprimer une feuille dans un fichier
A) in Excel97
Sub Printtofile()
dim filename As String
filename = "MyPrintFile.prn"
ChDrive "C" : ChDir "C:\Abcédaire"
if Dir(curdir & "\" & filename) <> "" then kill curdir & "\" & filename
SendKeys filename & "{enter}"
thisworkbook.worksheets("Sheet1").printout PrinttoFile:=true
end SubB) in Excel 2000 :
thisworkbook.worksheets("Sheet1").printout printtofile:=true, Prtofilename:="C:\MyPrintFile.prn"
Utilisation de la méthode SaveAs
Sauvegarde au format texte
'Cette macro créé un classeur supplémentaire et le sauvera au format Texte MS-DOS après y avoir copié la première colonne de la feuille Sheet1 du classeur appelant la macro.
Sub Saveas_textfile()
Set wkbk = workbooks.add
with thisworkbook.worksheets("Sheet1")
.range(.cells(1, 1), .cells(1, 1).end(xldown)).Copy destination:=wkbk.worksheets("sheet1").range("A1")
end with
application.displayalerts = false
wkbk.saveas filename:="g:\monfichier.txt", fileformat:=xlTextMSDOS
wkbk.close
end Sub
Lister les fichiers Texte avec la méthode FileSearch
Le type texte ne fait effectivement pas partie des constantes MsoFiletype. La recherche doit donc être effctuée sur tous les types de fichiers (msoFiletypeAllFiles) en spécifiant "*.txt" comme nom des fichiers à rechercher.
Sub RecupNomsFichiers()
dim Classeurs() As String, I As long
with application.FileSearch
.NewSearch
.Filetype = msoFiletypeAllFiles
.Filename = "*.txt"
.LookIn = "C:\Excel\VBA"
.SearchSubFolders = true
.Execute
with .FoundFiles
redim Classeurs(1 to .count, 1 to 1)
for I = 1 to .count
Classeurs(I, 1) = .Item(I)
next I
application.screenupdating = false
with range("A1").resize(.count)
.value = Classeurs
.Sort [A1]
end with
end with
end with
end Sub