Récupération de données dans un classeur endommagé
Solution 1
Une solution avec ADO pour récupérer les données d'une feuille entière (code Rob Bovey, mpep). Si ça ne fonctionne pas, une solution plus "classique" par établissement d'une liaison avec les cellules dont on veut récupérer les valeurs (Ron de bruin, mpep). Dans les deux cas, les données peuvent être récupérées dans un classeur fermé (erreur avec ADO si le classeur est ouvert). Le code doit être copié dans un module standard. solution 1 (ADO) 'importer le contenu d'une feuille de calcul d'un classeur fermé '(seules les données sont importées, pas les mises en forme)
sub testQuery() fich$ = "D:\ExempleTris.xls" Feuille$ = "Feuil1" QueryWorksheet fich, Feuille end sub
Public Sub QueryWorksheet(NomFichier$, Feuille$)
'Rob Bovey, mpep
'nécessite une référence à la librairie
'Microsoft ActiveX Data Object 2.x Library
Dim rsData As ADODB.Recordset
Dim szConnect As String
Dim szSQL As String
''' Crée la chaîne de connexion
szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & NomFichier & ";" & _
"Extended Properties=Excel 8.0;"
' La requête est basée sur le nom de la feuille. Ce nom
' doit se terminer par un $ et doit être entouré de crochets droits.
szSQL = "SELECT * FROM [" & Feuille & "$];"
Set rsData = New ADODB.Recordset
rsData.Open szSQL, szConnect, adOpenForwardOnly, _
adLockReadOnly, adCmdText
''' Vérifie qu'on a bien reçu des données
If Not rsData.EOF Then
Feuil1.Range("A1").CopyFromRecordset rsData
Else
MsgBox "Aucun enregistrement renvoyé.", vbCritical
End If
''' On nettoie pour finir...
rsData.Close
Set rsData = Nothing
end subsolution 2 (liaison)
'récupération de données dans un classeur fermé '(méthode "classique" par établissement d'une liaison temporaire) '(c'est aussi la technique habituellement conseillée pour essayer 'de récupérer des données d'un classeur endommagé)
sub test() GetValuesFromAClosedWorkbook "D:", "TestADO.xls", "Feuil1", "A1:H25" end sub
sub GetValuesFromAClosedWorkbook(fPath As String, _ fName As String, sName, cellRange As String) 'Ron De Bruin, mpep 'le paramètre 'cellRange' doit désigner '*une* plage de cellules *contigües* With ActiveSheet.Range(cellRange) .Formula = "='" & fPath & "\[" & fName & "]" _ & sName & "'!" & cellRange .Value = .Value End With end sub
Auteur : Frédéric Sigonneau
Mots clefs associés à cette page : plantage, endommager, abimer
- Vous devez vous identifier ou créer un compte pour écrire des commentaires
