I. Introduction▲
Qui n'a jamais subi le désagrément d'un fichier devenu impossible à ouvrir,
et perdu ainsi des heures (voir des jours) de travail?
Malheureusement, personne n'est à l'abri de ce type de soucis. Les chapitres suivants
présentent quelques solutions de dépannage afin de récupérer les données dans des classeurs
Excel endommagés ou corrompus.
Les informations fournies n'ont pas la prétention de remplacer les outils professionnels.
L'objectif consiste à décrire quelques pistes de dépannage, que vous
pourrez facilement mettre en oeuvre par vos propres moyens.
II. Les outils disponibles sur le poste de travail▲
II-A. La fonction de récupération automatique (A partir d'Excel2002)▲
La fonction de récupération automatique enregistre une copie de tous les classeurs
ouverts, à la fréquence définie par l'utilisateur. Il est ainsi possible de
récupérer les classeurs si Excel se ferme inopinément.
Ces fichiers portent l'extension .xar et sont
généralement stockés dans le répertoire:
C:\Documents and Settings\Nom_Ordinateur\Application Data\Microsoft\Excel\
Les fichiers sont nommés de façon aléatoires, dans le style ~ar2796.xar.
Si vous avez paramétré l'option de récupération (ce qui est conseillé), Vous pouvez ouvrir
ces fichiers afin de vérifier si un d'entre eux correspond à une sauvegarde récente du classeur
endommagé.
XL2002: Présentation des fonctions de récupération automatique
II-B. Le bouton "Ouvrir et Réparer" (A partir d'Excel2000)▲
Un outil de réparation existe dans la boîte de dialogue "Ouvrir".
Utilisez le Menu Fichier
Ouvrir
Sélectionnez le classeur qui pose problème dans la boite de dialogue.
Cliquez sur la droite du bouton "Ouvrir", en bas dans la boîte de dialogue.
Sélectionnez l'option "Ouvrir et réparer".
II-C. Ouvrir le classeur dans Microsoft Word▲
Vous pouvez ouvrir un classeur dans Word à condition d'avoir préalablement installé le
convertisseur Excel.
(Le convertisseur est disponible sur le CDRom d'installation du pack Office)
Dans Word,
Utilisez le menu Fichier
Ouvrir
Sélectionnez "Feuille de calcul Microsoft Excel" dans la liste des types de fichiers.
Sélectionnez le type de conversion dans la boîte de dialogue.
Le résultat des cellules sera récupérable mais pas les formules, ni les
graphiques et les macros.
II-D. La visionneuse Microsoft Excel▲
Cet outil permet de visionner des classeurs sans qu'Excel ne soit
obligatoirement installé sur le poste de travail.
Il est ainsi possible de:
Visualiser les feuilles
Imprimer
Copier le contenu de feuilles.
Manipuler quelques données (Sélection, Filtre, Recherche)
Excel Viewer 2003
Il est parfois possible d'ouvrir les classeurs endommagés grâce à la visionneuse.
Remarque:
Vous ne pourrez pas récupérer les graphiques et les macros. Vous pourrez copier
le résultat des cellules mais pas les formules.
II-E. Les formules de liaison▲
Vous pouvez aussi utiliser des formules de liaison afin d'extraire les données d'un
fichier corrompu.
Ouvrez un classeur vierge
Dans la cellule A1, saisissez la formule ci dessous, en adaptant:
Le chemin du classeur bloqué
Le nom du classeur
Le nom de la feuille qui contient les informations à récupérer.
='C:\Documents and Settings\michel\[monClasseur.xls]Feuil1'!A1
Le contenu de la cellule A1 de 'monClasseur.xls' va
s'afficher dans la cellule A1 du nouveau classeur.
Ensuite, utilisez les poignées de recopie pour étirer la formule sur les autres
cellules.
Le résultat des cellules sera récupéré mais pas les formules, ni les mises en forme.
L'inconvénient de cette solution: il faut se souvenir du nom des onglets pour mettre en place la
fonction.
Si vous ne vous souvenez pas du nom des onglets, utilisez la macro ci dessous. La procédure
permet de lister le nom des feuilles d'un classeur fermé, en utilisant
la méthode ADO.
Remarque: La procédure liste aussi les plages nommées contenues dans le classeur.
(Ne fonctionne pas si le classeur est protégé par un mot de passe)
Sub
boucleFeuillesClasseurFerme
(
)
Dim
XlConnect As
Object, XlCat As
Object
Dim
Fichier As
String
, Resultat As
String
Dim
Feuille As
Object
'Le chemin complet vers le claseur endommagé
Fichier =
"C:\leRepertoire\nomClasseur.xls"
Set
XlConnect =
CreateObject
(
"ADODB.Connection"
)
Set
XlCat =
CreateObject
(
"ADOX.Catalog"
)
XlConnect.Open
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
&
Fichier &
_
";Extended Properties=Excel 8.0;"
Set
XlCat.ActiveConnection
=
XlConnect
'Boucle sur les tables (onglets et plages nommées)
For
Each
Feuille In
XlCat.Tables
Resultat =
Replace
(
Feuille.Name
, "$"
, ""
)
Resultat =
Replace
(
Resultat, "'"
, ""
)
MsgBox
Resultat
Next
End
Sub
II-F. Les Requêtes ADO▲
Dans l'exemple précédent nous avons vu qu'il est possible de boucler sur les onglets
d'un classeur fermé.
De la même manière, vous pouvez créer des requêtes afin d'extraire le contenu des feuilles
de calcul.
Cet exemple boucle sur les feuilles du classeur fermé, et importe le
contenu de chaque onglet dans un fichier texte différent.
Cette méthode ne permet pas la récupération des formules et des mises en forme.
Sub
FeuillesExcelVersFichierTexte
(
)
'
'Nécessite d'activer la référence Microsoft ActiveX Data Objects 2.x Library
'Nécessite d 'activer la référence Microsoft ADO Ext 2.7 for DLL and Security
'
Dim
Cn As
ADODB.Connection
Dim
Rs As
New
ADODB.Recordset
Dim
Feuille As
ADOX.Table
Dim
Cat As
ADOX.Catalog
Dim
xConnect As
String
, xSql As
String
, Fichier As
String
'Le chemin complet vers le claseur endommagé
Fichier =
"C:\leRepertoire\nomClasseur.xls"
xConnect =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
&
Fichier &
";"
&
_
"extended properties=""Excel 8.0;HDR=NO;IMEX=1"""
Set
Cat =
CreateObject
(
"ADOX.Catalog"
)
Set
Cn =
CreateObject
(
"ADODB.Connection"
)
'Connexion au classeur fermé
Cn.Open
xConnect
Set
Cat.ActiveConnection
=
Cn
'Boucle sur les feuilles du classeur fermé
For
Each
Feuille In
Cat.tables
Set
Rs =
New
ADODB.Recordset
'Création de la requête pour récupérer le contenu des cellules
xSql =
"SELECT * FROM ["
&
Feuille.Name
&
"];"
Rs.Open
xSql, xConnect, adOpenForwardOnly
, adLockReadOnly
, adCmdText
'Les données vont être importées dans des fichiers txt à la racine C:\
Open "C:\"
&
Left
(
Feuille.Name
, Len
(
Feuille.Name
) -
1
) &
".txt"
For
Output As
#1
Do
Until
Rs.EOF
'ColumnDelimiter: ";"
'RowDelimiter: vbCrLf
'NullExpr: ""
Print #1
, Rs.GetString
(
, , ";"
, vbCrLf
, ""
);
Loop
Close #1
Rs.Close
Next
Feuille
Cn.Close
End
Sub
II-G. Utiliser Open Office pour récupérer les données▲
Il est possible d'ouvrir les fichiers Microsoft Office en utilisant la suite
bureautique Open Office.
Les mises en forme de base et 95% des formules sont compatibles entre
les 2 applications.
Dans de nombreux cas, un classeur bloqué dans Excel s'ouvrira sans problème
depuis OOo.
II-G-1. Récupérer le contenu des feuilles de calcul▲
Démarrez OpenOffice:
Utilisez le Menu Fichier
Ouvrir
Sélectionnez le classeur corrompu.
Cliquez sur le bouton 'Ouvrir'.
Le classeur s'ouvre dans l'application OOo.
Il vous suffira de faire un Copier/Coller dans un classeur Excel vierge afin
de récupérer vos données.
Vous pouvez aussi faire un essai en ré-enregistrant le fichier au
format .xls
Menu Fichier
Enregistre sous
Sélectionnez (.xls) dans la liste des filtres de conversion.
II-G-2. Récupérer les macros▲
Les macros d'un classeur Excel ne sont pas utilisables directement lorsque
le fichier est ouvert dans Open Office.
Néanmoins les procédures ne sont pas supprimées et vous pouvez les
visualiser dans l'éditeur de macros OOo.
Open office stocke tous les modules (standards, classes et objets) mais
chaque ligne est précédée de l'instruction REM.
Quand le classeur est ouvert dans OOo,
Utilisez le Menu Outils
Macros
Gérer les macros
Open Office.org Basic
Une boîte de dialogue s'affiche
Le nom du classeur est visible dans la ListBox de gauche
Sélectionnez le nom du classeur (double clic)
L'arborescence des modules et des macros évènementielles Excel s'affiche.
Sélectionnez un des modules.
Cliquez sur le bouton 'Editer' (sur la droite de la fenêtre)
afin d'accéder aux macros.
Vous pouvez ensuite vous déplacer entre les différents modules en cliquant sur
les onglet, en bas de l'écran.
Les procédures des UserForm sont aussi récupérées mais pas l'objet en
lui même. Ce n'est qu'un moindre mal s'il ne vous reste que les contrôles
à repositionner dans la forme.
La procédure Excel ci dessous automatise le processus de récupération et
de remise en forme des macros contenues dans un classeur bloqué. La macro
va ouvrir le classeur endommagé dans OpenOffice et extraire le contenu des
modules.
1.Placez la procédure dans un classeur Excel vierge.
2. Lancez la macro.
3. Sélectionnez le classeur qui vous pose problème (ou un classeur de test)
dans la boîte de dialogue.
4. Le classeur sélectionné va être ouvert dans Open Office.
5. La procédure crée un nouveau classeur Excel.
6. Ensuite la macro boucle sur tous les modules du document endommagé et importe
leur contenu dans le nouveau classeur Excel.
Chaque module est importé en fonction de son type:
module standard , module de classe , modules objets Feuille et ThisWorkbook.
8. La procédure supprime toutes les instructions REM et remet en forme les modules.
9. Open Office est ensuite refermé.
Option
Explicit
Option
Compare Text
Sub
MacrosRecovery_Excel_OOo
(
)
'
'SilkyRoad mise à jour le 24.09.2006
'macro testée avec Excel2002, OOo 2.0.3 et OOo 2.1
'
'
'------------ Nota /!\ ------------------
'pour une utilisation avec OOo 2.0.1, remplacez:
'
' Mid(TypeMod(2), 5)
' par
' Mid(TypeMod(1), 5)
'-----------------------------------------
Dim
serviceManager As
Object, Desktop As
Object
Dim
Document As
Object
Dim
Fichier As
Variant
Dim
Cible As
String
, TypeMod
(
) As
String
Dim
Args
(
)
Dim
Tableau
(
)
Dim
I As
Integer
, x As
Integer
, J As
Integer
Dim
Wb As
Workbook
Dim
Ws As
Worksheet
Dim
VBComp As
Object
Dim
v As
Integer
, y As
Integer
'Boîte de dialogue pour sélectionner un classeur sur le disque
Fichier =
_
Application.GetOpenFilename
(
"Classeurs Excel (*.xls), *.xls"
)
If
Fichier =
False
Then
Exit
Sub
'Transforme le chemin du classeur au format URL
Fichier =
ConvertToURL
(
Fichier)
'Création d'une instance Open Office
Set
serviceManager =
CreateObject
(
"com.sun.star.serviceManager"
)
Set
Desktop =
_
serviceManager.createInstance
(
"com.sun.star.frame.Desktop"
)
'Ouverture du fichier
Set
Document =
_
Desktop.loadComponentFromURL
(
Fichier, "_blank"
, 0
, Args)
'Récupère la liste des noms de modules dans un tableau.
Tableau
(
) =
_
Document.BasicLibraries.getByName
(
"Standard"
).ElementNames
'Création d'un nouveau classeur pour stocker les macros importées.
Set
Wb =
Workbooks.Add
(
1
)
'------------------------
'Boucle sur les noms de module pour en extraire le contenu
For
I =
0
To
UBound
(
Tableau
(
))
TypeMod
(
) =
Split
(
Document.BasicLibraries.getByName
(
"Standard"
).
_
getByName
(
Tableau
(
I)), vbCrLf
)
TypeMod
(
) =
Split
(
TypeMod
(
0
), Chr
(
10
))
Select
Case
Mid
(
TypeMod
(
0
), 30
)
Case
"VBAClassModule"
'Module de classe
Set
VBComp =
Wb.VBProject.VBComponents.Add
(
2
)
'Renomme le module de classe
VBComp.Name
=
Mid
(
TypeMod
(
2
), 5
)
Case
"VBADocumentModule"
'ThisWorkbook & les feuilles
If
Mid
(
TypeMod
(
2
), 5
) =
"ThisWorkbook"
Then
Set
VBComp =
Wb.VBProject.VBComponents
(
"ThisWorkbook"
)
Else
Set
Ws =
Nothing
On
Error
Resume
Next
Set
Ws =
Wb.Worksheets
(
Mid
(
TypeMod
(
2
), 5
))
On
Error
GoTo
0
If
Ws Is
Nothing
Then
'Creation nouvelle feuille
Set
Ws =
Wb.Worksheets.Add
'Renomme la feuille et le CodeName
Ws.Name
=
Mid
(
TypeMod
(
2
), 5
)
Wb.VBProject.VBComponents
(
Ws.CodeName
).Name
=
_
Mid
(
TypeMod
(
2
), 5
)
Set
VBComp =
_
Wb.VBProject.VBComponents
(
Mid
(
TypeMod
(
2
), 5
))
Else
Set
VBComp =
_
Wb.VBProject.VBComponents
(
Mid
(
TypeMod
(
2
), 5
))
End
If
End
If
Case
"VBAModule"
'Module standard
Set
VBComp =
Wb.VBProject.VBComponents.Add
(
1
)
'Renomme le module standard
VBComp.Name
=
Mid
(
TypeMod
(
2
), 5
)
Case
"VBAFormModule"
'UserForm
Set
VBComp =
Wb.VBProject.VBComponents.Add
(
3
)
'Renomme l'UserForm
VBComp.Name
=
Mid
(
TypeMod
(
2
), 5
)
End
Select
'Insertion des procédures dans les modules
With
Wb.VBProject.VBComponents
(
VBComp.Name
).CodeModule
'Fait le ménage: Suppression d'"Option Explicit"
.DeleteLines
1
, .CountOfLines
'Import de la procédure et remise en forme dans le module
.AddFromString
_
Document.BasicLibraries.getByName
(
"Standard"
).
_
getByName
(
Tableau
(
I))
For
J =
.CountOfLines
To
1
Step
-
1
Cible =
.Lines
(
J, 1
)
If
Left
(
Cible, 17
) =
"Rem Attribute VBA"
Then
.DeleteLines
J, 1
Else
If
Left
(
Cible, 3
) =
"Rem"
Then
Cible =
Mid
(
Cible, 4
)
.ReplaceLine
J, Cible
Else
.DeleteLines
J, 1
End
If
End
If
Next
J
End
With
'Suppression des modules vides
If
VBComp.Type
=
1
Then
v =
VBComp.CodeModule.CountOfDeclarationLines
+
1
y =
VBComp.CodeModule.CountOfLines
If
y <
v Then
Wb.VBProject.VBComponents.Remove
VBComp
End
If
Next
I
DoEvents
'Fermeture du document OOo
Document.Close
(
False
)
End
Sub
Function
ConvertToURL
(
Fichier As
Variant
)
'fonction de conversion au format URL
Dim
Cible As
String
Cible =
Fichier
Cible =
Replace
(
Cible, "\"
, "/"
)
ConvertToURL =
"file:///"
&
Cible
End
Function
II-H. Excel2007▲
Les nouveaux types de fichiers Office2007 prennent en charge le format
OpenXML.
* Classeur binaire Excel 2007 (*.xlsb)
* Classeur Excel 2007 (*.xlsx)
* Classeur Excel 2007 prenant en charge les macros (*.xlsm)
* Modèle Excel 2007 (*.xltx)
* Modèle Excel 2007 prenant en charge les macros (* .xltm)
* Complément Excel 2007 (* .xlam)
Si vous ne pouvez plus ouvrir le classeur:
Renommez l'extension en .zip.
Dézippez le fichier.
Recherchez les fichiers nommés Sheets: Ils contiennent les données de vos
feuilles de calcul.
Vous pourrez aussi récupérer vos images dans le fichier zip.
III. Les logiciels du commerce▲
III-A. Les fichiers endommagés▲
Si vous n'avez pas trouvé votre bonheur dans les chapitres précédents, la situation
devient grave mais n'est pas encore totalement désespérée.
Il existe dans le commerce et en téléchargement sur internet, de nombreux outils de
récupération de données (souvent payants).
L'objectif n'est pas de faire de la publicité pour tel ou tel produit, mais
simplement d'indiquer quelques liens afin de vous
dépanner. Il en existe beaucoup d'autres: n'hésitez pas à faire des recherches
sur Internet.
Premier lien
Deuxième lien
Troisième lien
III-B. Les fichiers supprimés▲
Si vous supprimez un fichier par erreur, et que vous ne le retrouvez pas dans
la corbeille, le premier réflexe est de ne plus rien écrire sur votre disque.
Lorsque le fichier est supprimé, le système d'exploitation spécifie l'espace
comme disponible en écriture mais les données sont toujours présentes sur le
disque jusqu'à ce que des nouvelles données soient allouées à cet espace.
Voici quelques exemples de programmes permettant de récupérer les fichiers supprimés.
Premier lien
Deuxième lien
Troisième lien
IV. Conclusion▲
Les exemples décrits dans ce document sont plus ou moins efficaces en
fonction du type de problème rencontré dans les fichiers.
Il faut donc, avant tout, chercher à prévenir ces situations en créant
des sauvegardes régulières de vos données.
Il est essentiel de mettre en place une stratégie permettant de sauvegarder
les fichiers. Vous disposerez ainsi de copies récentes en cas de problème sur le fichier
original.
V. Téléchargement▲