Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

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

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 Donner une note à l'article (5)

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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

Image non disponible

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.

Image non disponible

Sélectionnez le type de conversion dans la boîte de dialogue.

Image non disponible

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
Sélectionnez

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

Image non disponible


Vous pouvez ensuite vous déplacer entre les différents modules en cliquant sur les onglet, en bas de l'écran.

Image non disponible


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
Sélectionnez
			
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


Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

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.