Bonjour,
Je cherche à analyser par une requête SQL une liste d'enregistrements contenus dans un onglet (données sources) et d'obtenir le résultat de cette analyse dans un autre onglet (données cibles). l'analyse se déroule correctement lorsque le nombre d'enregistrements à analyser se situe entre 1 et 60 000. Mais lorsque ce nombre est supérieur, une erreur d'execution apparait : '-2147217865 (80040e37)'.
Suivant les cas que j'ai à traiter, il peut arriver que ce nombre d'enregistrement à traiter soit de 500 000.
J'ai déjà essayé de définir, sans succès, des propriétés telles que :Rst.PageSize, Rst.MaxRecords, Rst.MaxRecords
Savez-vous s'il existe une limite par défaut au nombre d'enregistrements dans un RecordSet ?
Si oui, cette limite peut-elle être augmenter et comment ?
Si non, auriez-vous une idée pour exécuter une requête SQL sur des enregistrements contenus dans une feuille Excel en utilisant une autre méthode ou un autre type de code ?
Vous remerciant par avance de votre aide.
Cordialement
Voici le code que j'ai simplifié pour en faciliter la compréhension:
Sub creertableau()
Dim Cnn As Object, Rst As Object
Dim Requete As String, Nb As Long
Dim SourceSheet As String, SourceRange, Plage_source As String
Dim StConnect As String, SourceFile As String
Dim Derniere_ligne_données As Long
'
' identification de la plage des enregistrement à analyser qui se trouvent dans l'onglet "Données", qui se situent
' dans les colonne de C à N mais dont, a priori, je ne connait pas le nombre (à partir de la ligne 6)
'
Worksheets("Données").Select
Range("C6:N6").Select
Range(Selection, Selection.End(xlDown)).Select
Derniere_ligne_données = Selection.Rows.Count + 5
Plage_source = "C6:N" & Derniere_ligne_données
' Exécution d'un Recorset pour en extraire les enregistrements dont le champ "CLE" commence pas "AT"
' (NDLR : j'ai choisi cet exemple de requête simpliste uniquement pour exposer mon problème et non pour trouver des solutions alternatives du type filtres, TCD, etc...), dans mon besoin réel, la requête SQL est beaucoup plus complexe
SourceSheet = "Données$"
'adresse RELATIVE de la plage
SourceRange = Plage_source
'Chemin & nom du fichier
SourceFile = ThisWorkbook.Path & "\" & ActiveWorkbook.Name
StConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
Requete = "SELECT * FROM [" & SourceSheet & SourceRange & "] WHERE CLE Like ""AT%"";"
Set Cnn = CreateObject("ADODB.Connection")
Set Rst = CreateObject("ADODB.Recordset")
Cnn.Open StConnect
Rst.Open Requete, Cnn, 1, 1, 1
' c'est sur cette ligne ci-dessus que le message d'erreur apparait lorsque le nombre d'enregistrements est trop important.
Rst.Close: Set Rst = Nothing
Cnn.Close: Set Cnn = Nothing
End Sub
Je cherche à analyser par une requête SQL une liste d'enregistrements contenus dans un onglet (données sources) et d'obtenir le résultat de cette analyse dans un autre onglet (données cibles). l'analyse se déroule correctement lorsque le nombre d'enregistrements à analyser se situe entre 1 et 60 000. Mais lorsque ce nombre est supérieur, une erreur d'execution apparait : '-2147217865 (80040e37)'.
Suivant les cas que j'ai à traiter, il peut arriver que ce nombre d'enregistrement à traiter soit de 500 000.
J'ai déjà essayé de définir, sans succès, des propriétés telles que :Rst.PageSize, Rst.MaxRecords, Rst.MaxRecords
Savez-vous s'il existe une limite par défaut au nombre d'enregistrements dans un RecordSet ?
Si oui, cette limite peut-elle être augmenter et comment ?
Si non, auriez-vous une idée pour exécuter une requête SQL sur des enregistrements contenus dans une feuille Excel en utilisant une autre méthode ou un autre type de code ?
Vous remerciant par avance de votre aide.
Cordialement
Voici le code que j'ai simplifié pour en faciliter la compréhension:
Sub creertableau()
Dim Cnn As Object, Rst As Object
Dim Requete As String, Nb As Long
Dim SourceSheet As String, SourceRange, Plage_source As String
Dim StConnect As String, SourceFile As String
Dim Derniere_ligne_données As Long
'
' identification de la plage des enregistrement à analyser qui se trouvent dans l'onglet "Données", qui se situent
' dans les colonne de C à N mais dont, a priori, je ne connait pas le nombre (à partir de la ligne 6)
'
Worksheets("Données").Select
Range("C6:N6").Select
Range(Selection, Selection.End(xlDown)).Select
Derniere_ligne_données = Selection.Rows.Count + 5
Plage_source = "C6:N" & Derniere_ligne_données
' Exécution d'un Recorset pour en extraire les enregistrements dont le champ "CLE" commence pas "AT"
' (NDLR : j'ai choisi cet exemple de requête simpliste uniquement pour exposer mon problème et non pour trouver des solutions alternatives du type filtres, TCD, etc...), dans mon besoin réel, la requête SQL est beaucoup plus complexe
SourceSheet = "Données$"
'adresse RELATIVE de la plage
SourceRange = Plage_source
'Chemin & nom du fichier
SourceFile = ThisWorkbook.Path & "\" & ActiveWorkbook.Name
StConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
Requete = "SELECT * FROM [" & SourceSheet & SourceRange & "] WHERE CLE Like ""AT%"";"
Set Cnn = CreateObject("ADODB.Connection")
Set Rst = CreateObject("ADODB.Recordset")
Cnn.Open StConnect
Rst.Open Requete, Cnn, 1, 1, 1
' c'est sur cette ligne ci-dessus que le message d'erreur apparait lorsque le nombre d'enregistrements est trop important.
Rst.Close: Set Rst = Nothing
Cnn.Close: Set Cnn = Nothing
End Sub