Récupérer les données dans un classeur Excel endommagé

SilkyRoad

Dans ce tutoriel, vous allez apprendre quelques solutions pour récupérer les données dans des classeurs endommagés.

Les exemples proposés ont été testés avec Excel2002 et WindowsXP.

Commentez

- Titre : Récupérer les données dans un classeur Excel endommagé

- Auteur : SilkyRoad

- Parution : 1 septembre 2006

- Mise à jour : 28 avril 2007

- Licence : Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- I. Introduction

- II. Les outils disponibles sur le poste de travail

- II-A. La fonction de récupération automatique (A partir d'Excel2002)

- II-B. Le bouton "Ouvrir et Réparer" (A partir d'Excel2000)

- II-C. Ouvrir le classeur dans Microsoft Word

- II-D. La visionneuse Microsoft Excel

- II-E. Les formules de liaison

- II-F. Les Requêtes ADO

- II-G. Utiliser Open Office pour récupérer les données

- II-G-1. Récupérer le contenu des feuilles de calcul

- II-G-2. Récupérer les macros

- II-H. Excel2007

- III. Les logiciels du commerce

- III-A. Les fichiers endommagés

- III-B. Les fichiers supprimés

- IV. Conclusion

- V. Téléchargement

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)

Vba

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.

Vba

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

Vba

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