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:=0

Paramè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 bas

Paramè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 sub

sub 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 Sub

autre 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 planifiée

cf ma page windows pour savoir comment planifier l'ouverture d'un fichier ou d'une application sous Windows. & également la page sur les raccourcis clavier.

 


Ouverture d'après un raccourci clavier

cf ma page raccourci

 


Actions à l'ouverture

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

 


Problèmes à l'ouverture

 

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ème

Le 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

 


 

Fichiers récents

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

vérifier si le fichier n'a pas été mis à jour depuis longtemps : news ouvrir le fichier le plus récent d'un répertoire : news (ne fait pas appel à la collection RecentFiles)

 


 

Vérifications en tout genre

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)

Dim 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 = Nothing

Voir ma page web suivante, qui présente de NOMBREUX TEST d'EXISTENCE

vérifier si un seul fichier est ouvert dans l'occurence en cours d'Excel : news

 


Création de fichiers

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

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 base

Attention
*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...

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.

Installer des macros complémentaires : visitez le site de Fréd. S. Voir aussi les méthodes de sauvegarde

 


 


Méthodes de sauvegarde

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 : news
si vous voulez écraser ou ne pas écraser un fichier : news le fichier a été sauvé ou pas ? If Not MonClasseur.Saved Then MonClasseur.Save
sauvegarde sans macros : news
demander à 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

 


 

Méthodes de fermeture

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:=True

End Sub

 



Problèmes à la fermeture

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 Sub

Private 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 d'un classeur excel


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 Function

Sub 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 Function

Sub 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))

 


 

Propriétés d'un fichier

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 (?))

Copie de fichier

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 bas

tester 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 Sub

A l'aide de la méthode FileSearch
With Application.FileSearch
.NewSearch: .LookIn = curdir: .FileType = msoFileTypeAllFiles
If .Execute Then MsgBox .FoundFiles.Count
End With

Egalement 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

 


 

Répertoire & Réseau

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

Comment faire une liste de fichiers et boucler sur chacun d'eux ?
C'est à cette question que vont répondre les quelques macros ci-dessous.
!!! 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()
dim p As String, x As Variant
p = "c:/*txt"
x = GetFileList(p)
select Case Isarray(x)
Case true 'files found
msgbox ubound(x)
sheets("feuil1").range("A:A").Clear
for i = LBound(x) to ubound(x)
sheets("feuil1").cells(i, 1).value = x(i)
next i
Case false 'no files found
msgbox "No matching files"
end select
end Sub

'with range("A1").resize(.Count)
'.Value = Classeurs
'.Sort [A1]
'End with

function GetFileList(FileSpec As String) As Variant
' Returns an array of filenames that match FileSpec. ' if no matching files are found, it returns false
dim Filearray() As Variant, Filecount As Integer
dim Filename As String

On Error Goto NoFilesFound Filecount = 0
Filename = Dir(FileSpec)
if Filename = "" then Goto NoFilesFound

' loop until no more matching files are found
do While Filename <> ""
    Filecount = Filecount + 1
    redim preserve Filearray(1 to Filecount)
    Filearray(Filecount) = Filename
    Filename = Dir()
loop
GetFileList = Filearray
Exit function' Error handler
NoFilesFound:
GetFileList = false
end function

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 Sub

La 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édures
Sub loopThroughFilesExample()
application.DisplayAlerts = false
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 & workfile
doSomething activeworkbook
activeworkbook.save : Windows(workfile).Close
Windows(myFile).Activate workfile = Dir()
loop
application.StatusBar = false
end Sub Sub doSomething(inBook As Workbook)
'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

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.ASP

Lister les sous-répertoires d'un chemin

Sub 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 Sub

Remplir une listbox de noms de fichier

Sub 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

Autre 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 Runtime

 


 

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,45

Solution 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 Sub

B) 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