Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Recordset => Feuille Excel.

4 réponses
Avatar
Via
Bonjour à tous !

Je cherche à recopier les données d'un Recordset ADO dont le RecordCount
est à plus de 100 000 dans un fichier Excel. Cela prend un temps hallucinant
pour en copier 100 en remplissant case par case, alors 100 000, je ne
cherche même pas !
J'ai pensé à créer un fichier texte dans lequel je rentrerais toutes les
données en mode texte avec un séparateur quelconque du genre "¤¤", puis à
faire une importation dans Excel. Je n'ai pas encore essayé, mais déjà
est-il possible de faire cette importation avec VB ? Ensuite je pense que ça
va mettre énormément de temps, non ?
Merci de vos réponses,

Via :)

4 réponses

Avatar
parci
In : ,
Via écrivissa :
Bonjour à tous !

Je cherche à recopier les données d'un Recordset ADO dont le
RecordCount est à plus de 100 000 dans un fichier Excel. Cela prend
un temps hallucinant pour en copier 100 en remplissant case par case,
alors 100 000, je ne cherche même pas !



Avec la méthode CopyFromRecordset c'est plutôt rapide (avec plus de 100
000 enregistrement il faudra l'appliquer sur au moins 2 feuilles
évidemment).
Avatar
Clive Lumb
Si tu crées ton fichier texte avec des entrées entourées de " et séparées
par des tabulations (chr$(9))et tu lui donnes un suffixe ".xls", alors tu
peut l'ouvrir directement dans Excel.
Tu pourras aussi mettre les noms des colonnes en premier ligne sans " si
sans espaces.

Ce qui donnera:
Nom TAB Prénom TAB Date_Naissance
"Dupont" TAB "Marcel" TAB "05/06/1924"

Clive


"Via" a écrit dans le message de
news:
Bonjour à tous !

Je cherche à recopier les données d'un Recordset ADO dont le RecordCount
est à plus de 100 000 dans un fichier Excel. Cela prend un temps


hallucinant
pour en copier 100 en remplissant case par case, alors 100 000, je ne
cherche même pas !
J'ai pensé à créer un fichier texte dans lequel je rentrerais toutes les
données en mode texte avec un séparateur quelconque du genre "¤¤", puis à
faire une importation dans Excel. Je n'ai pas encore essayé, mais déjà
est-il possible de faire cette importation avec VB ? Ensuite je pense que


ça
va mettre énormément de temps, non ?
Merci de vos réponses,

Via :)




Avatar
Via
Merci pour cette piste. J'ai écrit le code suivant :

Dim Rs As ADODB.Recordset
Dim FichierExcel As Workbook

Randomize
NomFichier = App.Path & "Test" & CInt(Rnd * 10000) & ".xls"
If Not FileExists(NomFichier) Then CreationFichier NomFichier
Set FichierExcel = GetObject(NomFichier)


FichierExcel.Worksheets(1).Range("A1").CopyFromRecordset Rs

Déjà, ma création de fichier ne marche pas. Comment puis-je créer un
fichier Excel correct ?
Bref, je repars avec un fichier déjà créé, que j'ouvre avec GetObject.
La méthode CopyFromRecordset renvoie l'erreur suivante :
Erreur d'exécution '-2147417851 (80010105)':
La méthode 'CopyFromRecordset' de l'objet 'Range' a échoué.

Voilà voilà. Je ne suis pas content. Grrrrr.
Merci de votre aide,

Via :)

"parci" a écrit dans le message de
news:4091171f$0$15674$
In : ,
Via écrivissa :
> Bonjour à tous !
>
> Je cherche à recopier les données d'un Recordset ADO dont le
> RecordCount est à plus de 100 000 dans un fichier Excel. Cela prend
> un temps hallucinant pour en copier 100 en remplissant case par case,
> alors 100 000, je ne cherche même pas !

Avec la méthode CopyFromRecordset c'est plutôt rapide (avec plus de 100
000 enregistrement il faudra l'appliquer sur au moins 2 feuilles
évidemment).





Avatar
parci
In : #,
Via écrivissa :
Merci pour cette piste. J'ai écrit le code suivant :

Dim Rs As ADODB.Recordset
Dim FichierExcel As Workbook

Randomize
NomFichier = App.Path & "Test" & CInt(Rnd * 10000) & ".xls"
If Not FileExists(NomFichier) Then CreationFichier NomFichier
Set FichierExcel = GetObject(NomFichier)


FichierExcel.Worksheets(1).Range("A1").CopyFromRecordset Rs

Déjà, ma création de fichier ne marche pas. Comment puis-je créer un
fichier Excel correct ?



Je ferais quelque chose comme ça :
(il faut ajouter une référence aux objets Excel à ton projet)

Sub zaza(Rs As ADODB.Recordset, sFileName As String)

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet


On Error Resume Next
Set xlApp = GetObject(, "Excel.Application")
On Error GoTo 0

If xlApp Is Nothing Then
Set xlApp = CreateObject("Excel.Application")
End If

If xlApp Is Nothing Then
Exit Sub
End If

' facultatif
xlApp.Visible = True

' création d'un nouveau classeur
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

Dim iCol As Long
' le noms des champs
For iCol = 0 To Rs.Fields.Count - 1
xlSheet .Cells(1, iCol + 1).Value = Rs.Fields(iCol).Name
Next
' les données
xlSheet.Range("A2").CopyFromRecordset Rs

' dans ton cas puisque tu as plus d'enregistrements que de lignes d'une
feuille Excel
' ça serait plutôt quelque chose comme ça (non testé):

Dim i As Long
Dim lCount As Long

lCount = rs.RecordCount

For i = 1 To lCount Step 65000
Set xlSheet = xlBook.Worksheets.Add
rs.MoveFirst
rs.Move , i
For iCol = 0 To Rs.Fields.Count - 1
xlSheet .Cells(1, iCol + 1).Value = Rs.Fields(iCol).Name
Next
xlSheet.Range("A2").CopyFromRecordset rs, 65000
Next i

' il faudrait vérifier que sFileName n'est pas actuellement ouvert par
Excel
' si on utilise une instance en cours avec GetObject

If FileExists(sFileName) Then
Kill sFileName
End If

xlBook.SaveAs sFileName

xlApp.Quit

Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

End Sub