Bonjour,
J'ai un probl=E8me d'=E9criture dans une cellule.
Je souhaite =E9crire une chaine de caract=E8re dans une cellule, mais
cette chaine fait plus de 1024 caract=E8res.
Je ne peux pas car j'ai une erreur "m=E9moire insuffisante".
Pourtant, quand je me sers de microsoft queries
(donn=E9es->donn=E9es externes->cr=E9er une requ=EAte)
J'arrive =E0 importer des cellules de plus de 1600 caract=E8res.
Il doit donc y avoir un moyen de d=E9passer cette limitation.
Es-ce que quelqu'un la connait?
Tu as droit à plus de 32 000 caractères dans une cellule Tu double-cliques dessus pour passer en mode édition et tu devrais pouvoir saisir ton texte... en cas d'impossibilité je suppose que ton problème doit être ailleurs !
Salutations!
"Bowen" a écrit dans le message de news:
Bonjour, J'ai un problème d'écriture dans une cellule. Je souhaite écrire une chaine de caractère dans une cellule, mais cette chaine fait plus de 1024 caractères. Je ne peux pas car j'ai une erreur "mémoire insuffisante". Pourtant, quand je me sers de microsoft queries (données->données externes->créer une requête) J'arrive à importer des cellules de plus de 1600 caractères. Il doit donc y avoir un moyen de dépasser cette limitation. Es-ce que quelqu'un la connait?
Bonjour Bowen,
Tu as droit à plus de 32 000 caractères dans une cellule
Tu double-cliques dessus pour passer en mode édition et tu devrais
pouvoir saisir ton texte... en cas d'impossibilité je suppose que ton
problème doit être ailleurs !
Salutations!
"Bowen" <joel.cocandeau.mailings@gmail.com> a écrit dans le message de news:
1136902744.251507.120010@g47g2000cwa.googlegroups.com...
Bonjour,
J'ai un problème d'écriture dans une cellule.
Je souhaite écrire une chaine de caractère dans une cellule, mais
cette chaine fait plus de 1024 caractères.
Je ne peux pas car j'ai une erreur "mémoire insuffisante".
Pourtant, quand je me sers de microsoft queries
(données->données externes->créer une requête)
J'arrive à importer des cellules de plus de 1600 caractères.
Il doit donc y avoir un moyen de dépasser cette limitation.
Es-ce que quelqu'un la connait?
Tu as droit à plus de 32 000 caractères dans une cellule Tu double-cliques dessus pour passer en mode édition et tu devrais pouvoir saisir ton texte... en cas d'impossibilité je suppose que ton problème doit être ailleurs !
Salutations!
"Bowen" a écrit dans le message de news:
Bonjour, J'ai un problème d'écriture dans une cellule. Je souhaite écrire une chaine de caractère dans une cellule, mais cette chaine fait plus de 1024 caractères. Je ne peux pas car j'ai une erreur "mémoire insuffisante". Pourtant, quand je me sers de microsoft queries (données->données externes->créer une requête) J'arrive à importer des cellules de plus de 1600 caractères. Il doit donc y avoir un moyen de dépasser cette limitation. Es-ce que quelqu'un la connait?
Bowen
Apparement non, en fait la longueur n'est pas limitée à 1024 en saisie, mais le problème est que c'est limité sur l'accès par code: cells(2,3) = maVariable ' variable >1024 Il doit bien exister un moyen de contourner ce problème?
Apparement non,
en fait la longueur n'est pas limitée à 1024 en saisie,
mais le problème est que c'est limité sur l'accès par code:
cells(2,3) = maVariable ' variable >1024
Il doit bien exister un moyen de contourner ce problème?
Apparement non, en fait la longueur n'est pas limitée à 1024 en saisie, mais le problème est que c'est limité sur l'accès par code: cells(2,3) = maVariable ' variable >1024 Il doit bien exister un moyen de contourner ce problème?
michdenis
Bonjour Bowen,
Sous excel 2003,
J'ai testé ceci et cela fonctionne parfaitement
A8 contient un texte de plus de 29,000 caractères a = Range("A8")
Range("A20") = a En A20, j'ai obtenu le même nombre de caractères qu'en A8
Quelle version as-tu ?
Comment manipules-tu ta variable pour transmettre son contenu à une cellule ?
Salutations!
"Bowen" a écrit dans le message de news:
Apparement non, en fait la longueur n'est pas limitée à 1024 en saisie, mais le problème est que c'est limité sur l'accès par code: cells(2,3) = maVariable ' variable >1024 Il doit bien exister un moyen de contourner ce problème?
Bonjour Bowen,
Sous excel 2003,
J'ai testé ceci et cela fonctionne parfaitement
A8 contient un texte de plus de 29,000 caractères
a = Range("A8")
Range("A20") = a
En A20, j'ai obtenu le même nombre de caractères qu'en A8
Quelle version as-tu ?
Comment manipules-tu ta variable pour transmettre son contenu à une cellule ?
Salutations!
"Bowen" <joel.cocandeau.mailings@gmail.com> a écrit dans le message de news:
1136966900.892695.196590@f14g2000cwb.googlegroups.com...
Apparement non,
en fait la longueur n'est pas limitée à 1024 en saisie,
mais le problème est que c'est limité sur l'accès par code:
cells(2,3) = maVariable ' variable >1024
Il doit bien exister un moyen de contourner ce problème?
A8 contient un texte de plus de 29,000 caractères a = Range("A8")
Range("A20") = a En A20, j'ai obtenu le même nombre de caractères qu'en A8
Quelle version as-tu ?
Comment manipules-tu ta variable pour transmettre son contenu à une cellule ?
Salutations!
"Bowen" a écrit dans le message de news:
Apparement non, en fait la longueur n'est pas limitée à 1024 en saisie, mais le problème est que c'est limité sur l'accès par code: cells(2,3) = maVariable ' variable >1024 Il doit bien exister un moyen de contourner ce problème?
Bowen
C'est une version 2000, mais surtout la méthode d'acces n'est pas la même. Je charge mes données à partir d'accès (en passant par ADO) Je cherche à insrire le contenu d'une variable de type string, dans une cellule. Peux-tu me dire si sur la version 2003 ça fonctionne en typant ta variable en string? exemple de code:
dim maChaine as string maChaine = rs.fields("commentaires") ' le champ commentaire contient plus de 1024 lignes cells(2,3) = maChaine ' les coordonnées de la cellule étant dynamiques, je pense que je suis obligé de conserver l'accès par cette methode, je ne peux pas la remplacer par range("B3")
Merci
C'est une version 2000, mais surtout la méthode d'acces n'est pas la
même.
Je charge mes données à partir d'accès (en passant par ADO)
Je cherche à insrire le contenu d'une variable de type string, dans
une cellule.
Peux-tu me dire si sur la version 2003 ça fonctionne en typant ta
variable en string?
exemple de code:
dim maChaine as string
maChaine = rs.fields("commentaires") ' le champ commentaire contient
plus de 1024 lignes
cells(2,3) = maChaine ' les coordonnées de la cellule étant
dynamiques, je pense que je suis obligé de conserver l'accès par
cette methode, je ne peux pas la remplacer par range("B3")
C'est une version 2000, mais surtout la méthode d'acces n'est pas la même. Je charge mes données à partir d'accès (en passant par ADO) Je cherche à insrire le contenu d'une variable de type string, dans une cellule. Peux-tu me dire si sur la version 2003 ça fonctionne en typant ta variable en string? exemple de code:
dim maChaine as string maChaine = rs.fields("commentaires") ' le champ commentaire contient plus de 1024 lignes cells(2,3) = maChaine ' les coordonnées de la cellule étant dynamiques, je pense que je suis obligé de conserver l'accès par cette methode, je ne peux pas la remplacer par range("B3")
Merci
michdenis
Bonjour Bowen,
EXEMPLE 1 - AVEC ADO '================================== '--------------------------------------- Sub ImporterAccessVersExcel()
Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim MyRange As Range, Requete As String With Worksheets("Feuil4") Set MyRange = Range("A1") End With
End Sub '------------------------------------------------- Function TransposeSpecial2(ByRef Arr As Variant) As Variant Dim A As Integer, B As Integer, Arr1() As Variant Dim C As Integer, D As Integer A = UBound(Arr, 1): B = UBound(Arr, 2) ReDim Arr1(B, A) For C = 0 To A For D = 0 To B Arr1(D, C) = Arr(C, D) Next Next
TransposeSpecial2 = (Arr1)
End Function '------------------------------------------------- '==================================
EXEMPLE 2 - AVEC ADO
'---------------------------------------- Avec DAO -> supporte 32765 caractères
Sub ImporterUnChampMémo() DAOFromAccessToExcel "C:excelcomptoir.mdb", _ "Employés", "Notes", Range("B1") End Sub '---------------------------------------- Sub DAOFromAccessToExcel(DBFullName As String, TableName As String, _ FieldName As String, TargetRange As Range) Application.ScreenUpdating = False Dim db As DAO.Database, rs As DAO.Recordset Dim lngRowIndex As Long Set TargetRange = TargetRange.Cells(1, 1) Set db = OpenDatabase(DBFullName) Set rs = db.OpenRecordset(TableName, dbOpenTable) lngRowIndex = 0 With rs If Not .BOF Then .MoveFirst While Not .EOF ' boucle sur la plage excel For i = 5 To Range("e65536").End(xlUp).Row If Range("E" & i) = .Fields("Formulaire") Then Range("I" & i) = Left(.Fields(FieldName), 32765) End If Next .MoveNext lngRowIndex = lngRowIndex + 1 Wend End With Set rs = Nothing db.Close Set db = Nothing Application.ScreenUpdating = True End Sub '----------------------------------------
P.S. Cela fonctionne aussi de mémoire en utilisant un ODBC.
Salutations!
"Bowen" a écrit dans le message de news:
C'est une version 2000, mais surtout la méthode d'acces n'est pas la même. Je charge mes données à partir d'accès (en passant par ADO) Je cherche à insrire le contenu d'une variable de type string, dans une cellule. Peux-tu me dire si sur la version 2003 ça fonctionne en typant ta variable en string? exemple de code:
dim maChaine as string maChaine = rs.fields("commentaires") ' le champ commentaire contient plus de 1024 lignes cells(2,3) = maChaine ' les coordonnées de la cellule étant dynamiques, je pense que je suis obligé de conserver l'accès par cette methode, je ne peux pas la remplacer par range("B3")
Merci
Bonjour Bowen,
EXEMPLE 1 - AVEC ADO
'================================== '---------------------------------------
Sub ImporterAccessVersExcel()
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim MyRange As Range, Requete As String
With Worksheets("Feuil4")
Set MyRange = Range("A1")
End With
End Sub
'-------------------------------------------------
Function TransposeSpecial2(ByRef Arr As Variant) As Variant
Dim A As Integer, B As Integer, Arr1() As Variant
Dim C As Integer, D As Integer
A = UBound(Arr, 1): B = UBound(Arr, 2)
ReDim Arr1(B, A)
For C = 0 To A
For D = 0 To B
Arr1(D, C) = Arr(C, D)
Next
Next
TransposeSpecial2 = (Arr1)
End Function
'-------------------------------------------------
'==================================
EXEMPLE 2 - AVEC ADO
'----------------------------------------
Avec DAO -> supporte 32765 caractères
Sub ImporterUnChampMémo()
DAOFromAccessToExcel "C:excelcomptoir.mdb", _
"Employés", "Notes", Range("B1")
End Sub
'----------------------------------------
Sub DAOFromAccessToExcel(DBFullName As String, TableName As String, _
FieldName As String, TargetRange As Range)
Application.ScreenUpdating = False
Dim db As DAO.Database, rs As DAO.Recordset
Dim lngRowIndex As Long
Set TargetRange = TargetRange.Cells(1, 1)
Set db = OpenDatabase(DBFullName)
Set rs = db.OpenRecordset(TableName, dbOpenTable)
lngRowIndex = 0
With rs
If Not .BOF Then .MoveFirst
While Not .EOF
' boucle sur la plage excel
For i = 5 To Range("e65536").End(xlUp).Row
If Range("E" & i) = .Fields("Formulaire") Then
Range("I" & i) = Left(.Fields(FieldName), 32765)
End If
Next
.MoveNext
lngRowIndex = lngRowIndex + 1
Wend
End With
Set rs = Nothing
db.Close
Set db = Nothing
Application.ScreenUpdating = True
End Sub
'----------------------------------------
P.S. Cela fonctionne aussi de mémoire en utilisant un ODBC.
Salutations!
"Bowen" <joel.cocandeau.mailings@gmail.com> a écrit dans le message de news:
1137000008.988616.117180@g44g2000cwa.googlegroups.com...
C'est une version 2000, mais surtout la méthode d'acces n'est pas la
même.
Je charge mes données à partir d'accès (en passant par ADO)
Je cherche à insrire le contenu d'une variable de type string, dans
une cellule.
Peux-tu me dire si sur la version 2003 ça fonctionne en typant ta
variable en string?
exemple de code:
dim maChaine as string
maChaine = rs.fields("commentaires") ' le champ commentaire contient
plus de 1024 lignes
cells(2,3) = maChaine ' les coordonnées de la cellule étant
dynamiques, je pense que je suis obligé de conserver l'accès par
cette methode, je ne peux pas la remplacer par range("B3")
EXEMPLE 1 - AVEC ADO '================================== '--------------------------------------- Sub ImporterAccessVersExcel()
Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim MyRange As Range, Requete As String With Worksheets("Feuil4") Set MyRange = Range("A1") End With
End Sub '------------------------------------------------- Function TransposeSpecial2(ByRef Arr As Variant) As Variant Dim A As Integer, B As Integer, Arr1() As Variant Dim C As Integer, D As Integer A = UBound(Arr, 1): B = UBound(Arr, 2) ReDim Arr1(B, A) For C = 0 To A For D = 0 To B Arr1(D, C) = Arr(C, D) Next Next
TransposeSpecial2 = (Arr1)
End Function '------------------------------------------------- '==================================
EXEMPLE 2 - AVEC ADO
'---------------------------------------- Avec DAO -> supporte 32765 caractères
Sub ImporterUnChampMémo() DAOFromAccessToExcel "C:excelcomptoir.mdb", _ "Employés", "Notes", Range("B1") End Sub '---------------------------------------- Sub DAOFromAccessToExcel(DBFullName As String, TableName As String, _ FieldName As String, TargetRange As Range) Application.ScreenUpdating = False Dim db As DAO.Database, rs As DAO.Recordset Dim lngRowIndex As Long Set TargetRange = TargetRange.Cells(1, 1) Set db = OpenDatabase(DBFullName) Set rs = db.OpenRecordset(TableName, dbOpenTable) lngRowIndex = 0 With rs If Not .BOF Then .MoveFirst While Not .EOF ' boucle sur la plage excel For i = 5 To Range("e65536").End(xlUp).Row If Range("E" & i) = .Fields("Formulaire") Then Range("I" & i) = Left(.Fields(FieldName), 32765) End If Next .MoveNext lngRowIndex = lngRowIndex + 1 Wend End With Set rs = Nothing db.Close Set db = Nothing Application.ScreenUpdating = True End Sub '----------------------------------------
P.S. Cela fonctionne aussi de mémoire en utilisant un ODBC.
Salutations!
"Bowen" a écrit dans le message de news:
C'est une version 2000, mais surtout la méthode d'acces n'est pas la même. Je charge mes données à partir d'accès (en passant par ADO) Je cherche à insrire le contenu d'une variable de type string, dans une cellule. Peux-tu me dire si sur la version 2003 ça fonctionne en typant ta variable en string? exemple de code:
dim maChaine as string maChaine = rs.fields("commentaires") ' le champ commentaire contient plus de 1024 lignes cells(2,3) = maChaine ' les coordonnées de la cellule étant dynamiques, je pense que je suis obligé de conserver l'accès par cette methode, je ne peux pas la remplacer par range("B3")
Merci
Bowen
Bon, je crois donc que ça vient d'une limitation de excel 2000, car ton code fonctionne très bien s'il n'y a pas de champ de plus de 1024 caractères, mais pas du tout dans le cas contraire. J'ai alors la même erreur de mémoire que lors de l'ajout par les methodes que j'utilisais avant. Je pense que je vais arriver à tester ça sur un poste en office 2003 pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où l'attaquer: En sachant que le remplissage par microsoft query fonctionne, il faudrait que j'arrive à piloter msquery et que je mettes une source de données à un endroit bien particulier de la feuille.
Pour info: Le but du programme (je te raconte un peu ma vie là, mais bon...): - un programme VB, indépendant de tout excel ou access - le programme se connecte sur une base au choix - permet de sélectionner une ou plusieurs tables ou requêtes - permet de réaliser un extract de n'importe quelle table ou requête, juste avec un clic. une multi-sélection donne plusieurs onglets excel. (un onglet par table/requête à extraire) - permet d'extraire des requêtes avec paramêtres, les paramêtres étant relevés dynamiquement dans les requêtes et demandés à l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la requête contient un champ de plus de 1024 caractères (je suis vert!). Le problème suivant serait: comment fournir des parametres aux requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as consacré, il tourne nickel sur une table qui as des champs courts.
Bon, je crois donc que ça vient d'une limitation de excel 2000,
car ton code fonctionne très bien s'il n'y a pas de champ de plus de
1024 caractères,
mais pas du tout dans le cas contraire.
J'ai alors la même erreur de mémoire que lors de l'ajout par les
methodes que j'utilisais avant.
Je pense que je vais arriver à tester ça sur un poste en office 2003
pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où
l'attaquer:
En sachant que le remplissage par microsoft query fonctionne,
il faudrait que j'arrive à piloter msquery et que je mettes une source
de données à un endroit bien particulier de la feuille.
Pour info:
Le but du programme (je te raconte un peu ma vie là, mais bon...):
- un programme VB, indépendant de tout excel ou access
- le programme se connecte sur une base au choix
- permet de sélectionner une ou plusieurs tables ou requêtes
- permet de réaliser un extract de n'importe quelle table ou
requête, juste avec un clic. une multi-sélection donne plusieurs
onglets excel. (un onglet par table/requête à extraire)
- permet d'extraire des requêtes avec paramêtres, les paramêtres
étant relevés dynamiquement dans les requêtes et demandés à
l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la
requête contient un champ de plus de 1024 caractères (je suis vert!).
Le problème suivant serait: comment fournir des parametres aux
requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as
consacré, il tourne nickel sur une table qui as des champs courts.
Bon, je crois donc que ça vient d'une limitation de excel 2000, car ton code fonctionne très bien s'il n'y a pas de champ de plus de 1024 caractères, mais pas du tout dans le cas contraire. J'ai alors la même erreur de mémoire que lors de l'ajout par les methodes que j'utilisais avant. Je pense que je vais arriver à tester ça sur un poste en office 2003 pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où l'attaquer: En sachant que le remplissage par microsoft query fonctionne, il faudrait que j'arrive à piloter msquery et que je mettes une source de données à un endroit bien particulier de la feuille.
Pour info: Le but du programme (je te raconte un peu ma vie là, mais bon...): - un programme VB, indépendant de tout excel ou access - le programme se connecte sur une base au choix - permet de sélectionner une ou plusieurs tables ou requêtes - permet de réaliser un extract de n'importe quelle table ou requête, juste avec un clic. une multi-sélection donne plusieurs onglets excel. (un onglet par table/requête à extraire) - permet d'extraire des requêtes avec paramêtres, les paramêtres étant relevés dynamiquement dans les requêtes et demandés à l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la requête contient un champ de plus de 1024 caractères (je suis vert!). Le problème suivant serait: comment fournir des parametres aux requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as consacré, il tourne nickel sur une table qui as des champs courts.
Bowen
En fait, je viens de faire un test, et c'est encore pire que je croyais: dim tempStr as String cells(1,1) = string(50000,"A") ' ce code fonctionne
tempStr = string(50000,"A") cells(1,1) = tempStr 'ce code fonctionne aussi parfaitement que le premier
tempStr = champ.value 'champ est récupéré dans le recordset, type access: mémo longueur = 1600 environ cells(1,1) = tempStr 'et ici... plantage Le message d'erreur précis est: Erreur d'exécution '7': Mémoire insufisante L'erreur est très simple à reproduire sur ton poste, il suffit de faire: cells(1,1) = string(500000,"A")
Voila, là je pense que je suis définitivement bloqué...
En fait, je viens de faire un test, et c'est encore pire que je
croyais:
dim tempStr as String
cells(1,1) = string(50000,"A") ' ce code fonctionne
tempStr = string(50000,"A")
cells(1,1) = tempStr 'ce code fonctionne aussi parfaitement que le
premier
tempStr = champ.value 'champ est récupéré dans le recordset, type
access: mémo longueur = 1600 environ
cells(1,1) = tempStr 'et ici... plantage
Le message d'erreur précis est:
Erreur d'exécution '7':
Mémoire insufisante
L'erreur est très simple à reproduire sur ton poste, il suffit de
faire:
cells(1,1) = string(500000,"A")
Voila, là je pense que je suis définitivement bloqué...
En fait, je viens de faire un test, et c'est encore pire que je croyais: dim tempStr as String cells(1,1) = string(50000,"A") ' ce code fonctionne
tempStr = string(50000,"A") cells(1,1) = tempStr 'ce code fonctionne aussi parfaitement que le premier
tempStr = champ.value 'champ est récupéré dans le recordset, type access: mémo longueur = 1600 environ cells(1,1) = tempStr 'et ici... plantage Le message d'erreur précis est: Erreur d'exécution '7': Mémoire insufisante L'erreur est très simple à reproduire sur ton poste, il suffit de faire: cells(1,1) = string(500000,"A")
Voila, là je pense que je suis définitivement bloqué...
michdenis
Bonjour,
J'ai modifié un peu la procédure avec ADO - Testée, elle fonctionne..
Pour extraire les données du recordset, il faut jouer un peu de finesse !!! '------------------------------------- Sub ImporterAccessVersExcel() Dim Tblo As Variant Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim RG As Range, Requete As String With Worksheets("Feuil3") Set RG = .Range("A5") End With
rst.Open Requete, cnt, adOpenKeyset nb = rst.RecordCount
'Copie le nom des champs dans la première ligne Do RG.Offset(, C) = rst.Fields(C).Name C = C + 1 x = x + 1 Loop Until x = rst.Fields.Count
Tblo = TransposeSpecial2(rst.GetRows) Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count) For A = 0 To UBound(Tblo, 1) For B = 0 To UBound(Tblo, 2) RG.Offset(A, B) = Tblo(A, B) Next Next
End Sub '------------------------------------- Function TransposeSpecial2(ByRef Arr As Variant) As Variant Dim A As Integer, B As Integer, Arr1() As Variant Dim C As Integer, D As Integer A = UBound(Arr, 1): B = UBound(Arr, 2) ReDim Arr1(B, A) For C = 0 To A For D = 0 To B Arr1(D, C) = Arr(C, D) A = Len(Arr1(D, C)) Next Next
TransposeSpecial2 = (Arr1)
End Function '-------------------------------------
Salutations!
"Bowen" a écrit dans le message de news: Bon, je crois donc que ça vient d'une limitation de excel 2000, car ton code fonctionne très bien s'il n'y a pas de champ de plus de 1024 caractères, mais pas du tout dans le cas contraire. J'ai alors la même erreur de mémoire que lors de l'ajout par les methodes que j'utilisais avant. Je pense que je vais arriver à tester ça sur un poste en office 2003 pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où l'attaquer: En sachant que le remplissage par microsoft query fonctionne, il faudrait que j'arrive à piloter msquery et que je mettes une source de données à un endroit bien particulier de la feuille.
Pour info: Le but du programme (je te raconte un peu ma vie là, mais bon...): - un programme VB, indépendant de tout excel ou access - le programme se connecte sur une base au choix - permet de sélectionner une ou plusieurs tables ou requêtes - permet de réaliser un extract de n'importe quelle table ou requête, juste avec un clic. une multi-sélection donne plusieurs onglets excel. (un onglet par table/requête à extraire) - permet d'extraire des requêtes avec paramêtres, les paramêtres étant relevés dynamiquement dans les requêtes et demandés à l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la requête contient un champ de plus de 1024 caractères (je suis vert!). Le problème suivant serait: comment fournir des parametres aux requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as consacré, il tourne nickel sur une table qui as des champs courts.
Bonjour,
J'ai modifié un peu la procédure avec ADO - Testée, elle fonctionne..
Pour extraire les données du recordset, il faut jouer un peu de finesse !!!
'-------------------------------------
Sub ImporterAccessVersExcel()
Dim Tblo As Variant
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim RG As Range, Requete As String
With Worksheets("Feuil3")
Set RG = .Range("A5")
End With
rst.Open Requete, cnt, adOpenKeyset
nb = rst.RecordCount
'Copie le nom des champs dans la première ligne
Do
RG.Offset(, C) = rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = rst.Fields.Count
Tblo = TransposeSpecial2(rst.GetRows)
Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count)
For A = 0 To UBound(Tblo, 1)
For B = 0 To UBound(Tblo, 2)
RG.Offset(A, B) = Tblo(A, B)
Next
Next
End Sub
'-------------------------------------
Function TransposeSpecial2(ByRef Arr As Variant) As Variant
Dim A As Integer, B As Integer, Arr1() As Variant
Dim C As Integer, D As Integer
A = UBound(Arr, 1): B = UBound(Arr, 2)
ReDim Arr1(B, A)
For C = 0 To A
For D = 0 To B
Arr1(D, C) = Arr(C, D)
A = Len(Arr1(D, C))
Next
Next
TransposeSpecial2 = (Arr1)
End Function
'-------------------------------------
Salutations!
"Bowen" <joel.cocandeau.mailings@gmail.com> a écrit dans le message de news: 1137059101.371211.71930@o13g2000cwo.googlegroups.com...
Bon, je crois donc que ça vient d'une limitation de excel 2000,
car ton code fonctionne très bien s'il n'y a pas de champ de plus de
1024 caractères,
mais pas du tout dans le cas contraire.
J'ai alors la même erreur de mémoire que lors de l'ajout par les
methodes que j'utilisais avant.
Je pense que je vais arriver à tester ça sur un poste en office 2003
pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où
l'attaquer:
En sachant que le remplissage par microsoft query fonctionne,
il faudrait que j'arrive à piloter msquery et que je mettes une source
de données à un endroit bien particulier de la feuille.
Pour info:
Le but du programme (je te raconte un peu ma vie là, mais bon...):
- un programme VB, indépendant de tout excel ou access
- le programme se connecte sur une base au choix
- permet de sélectionner une ou plusieurs tables ou requêtes
- permet de réaliser un extract de n'importe quelle table ou
requête, juste avec un clic. une multi-sélection donne plusieurs
onglets excel. (un onglet par table/requête à extraire)
- permet d'extraire des requêtes avec paramêtres, les paramêtres
étant relevés dynamiquement dans les requêtes et demandés à
l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la
requête contient un champ de plus de 1024 caractères (je suis vert!).
Le problème suivant serait: comment fournir des parametres aux
requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as
consacré, il tourne nickel sur une table qui as des champs courts.
J'ai modifié un peu la procédure avec ADO - Testée, elle fonctionne..
Pour extraire les données du recordset, il faut jouer un peu de finesse !!! '------------------------------------- Sub ImporterAccessVersExcel() Dim Tblo As Variant Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim RG As Range, Requete As String With Worksheets("Feuil3") Set RG = .Range("A5") End With
rst.Open Requete, cnt, adOpenKeyset nb = rst.RecordCount
'Copie le nom des champs dans la première ligne Do RG.Offset(, C) = rst.Fields(C).Name C = C + 1 x = x + 1 Loop Until x = rst.Fields.Count
Tblo = TransposeSpecial2(rst.GetRows) Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count) For A = 0 To UBound(Tblo, 1) For B = 0 To UBound(Tblo, 2) RG.Offset(A, B) = Tblo(A, B) Next Next
End Sub '------------------------------------- Function TransposeSpecial2(ByRef Arr As Variant) As Variant Dim A As Integer, B As Integer, Arr1() As Variant Dim C As Integer, D As Integer A = UBound(Arr, 1): B = UBound(Arr, 2) ReDim Arr1(B, A) For C = 0 To A For D = 0 To B Arr1(D, C) = Arr(C, D) A = Len(Arr1(D, C)) Next Next
TransposeSpecial2 = (Arr1)
End Function '-------------------------------------
Salutations!
"Bowen" a écrit dans le message de news: Bon, je crois donc que ça vient d'une limitation de excel 2000, car ton code fonctionne très bien s'il n'y a pas de champ de plus de 1024 caractères, mais pas du tout dans le cas contraire. J'ai alors la même erreur de mémoire que lors de l'ajout par les methodes que j'utilisais avant. Je pense que je vais arriver à tester ça sur un poste en office 2003 pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où l'attaquer: En sachant que le remplissage par microsoft query fonctionne, il faudrait que j'arrive à piloter msquery et que je mettes une source de données à un endroit bien particulier de la feuille.
Pour info: Le but du programme (je te raconte un peu ma vie là, mais bon...): - un programme VB, indépendant de tout excel ou access - le programme se connecte sur une base au choix - permet de sélectionner une ou plusieurs tables ou requêtes - permet de réaliser un extract de n'importe quelle table ou requête, juste avec un clic. une multi-sélection donne plusieurs onglets excel. (un onglet par table/requête à extraire) - permet d'extraire des requêtes avec paramêtres, les paramêtres étant relevés dynamiquement dans les requêtes et demandés à l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la requête contient un champ de plus de 1024 caractères (je suis vert!). Le problème suivant serait: comment fournir des parametres aux requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as consacré, il tourne nickel sur une table qui as des champs courts.
michdenis
Bonjour Bowen,
Le problème c'est dans excel, au delà d'un certain nombre de caractères contenu dans les cellules, on ne peut plus utiliser cette syntaxe et façon de faire :
Dim Tblo as variant Tblo = Feuil1.Range("A1:A10") 'le code bloque sur la ligne suivante. 'et je ne sais pas pourquoi ....! Feuil3.Range("A1:A10") = Tblo
Mais si on boucle sur chacun des éléments du tableau, alors là, aucun problème quant à la longueur des chaînes de caractères.... une cellule contenant un maximum de 32768 caractères.
Ado fait le travail au niveau du recordset, c'est la recopie dans la feuille de calcul qui cause problème !
J'avais oublié la méthode GetRows... on obtient un peu plus court et se départir de la fonction devenue inutile !
.------------------------------------ Sub ImporterAccessVersExcel() Dim Tblo As Variant Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim RG As Range, Requete As String With Worksheets("Feuil3") Set RG = .Range("A5") End With
rst.Open Requete, cnt, adOpenKeyset nb = rst.RecordCount
'Copie le nom des champs dans la première ligne Do RG.Offset(, C) = rst.Fields(C).Name C = C + 1 x = x + 1 Loop Until x = rst.Fields.Count
Tblo = rst.GetRows Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count) For A = 0 To UBound(Tblo, 1) For B = 0 To UBound(Tblo, 2) RG.Offset(B, A) = Tblo(A, B) Next Next End Sub .------------------------------------
Salutations!
"michdenis" a écrit dans le message de news: Bonjour,
J'ai modifié un peu la procédure avec ADO - Testée, elle fonctionne..
Pour extraire les données du recordset, il faut jouer un peu de finesse !!! '------------------------------------- Sub ImporterAccessVersExcel() Dim Tblo As Variant Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim RG As Range, Requete As String With Worksheets("Feuil3") Set RG = .Range("A5") End With
rst.Open Requete, cnt, adOpenKeyset nb = rst.RecordCount
'Copie le nom des champs dans la première ligne Do RG.Offset(, C) = rst.Fields(C).Name C = C + 1 x = x + 1 Loop Until x = rst.Fields.Count
Tblo = TransposeSpecial2(rst.GetRows) Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count) For A = 0 To UBound(Tblo, 1) For B = 0 To UBound(Tblo, 2) RG.Offset(A, B) = Tblo(A, B) Next Next
End Sub '------------------------------------- Function TransposeSpecial2(ByRef Arr As Variant) As Variant Dim A As Integer, B As Integer, Arr1() As Variant Dim C As Integer, D As Integer A = UBound(Arr, 1): B = UBound(Arr, 2) ReDim Arr1(B, A) For C = 0 To A For D = 0 To B Arr1(D, C) = Arr(C, D) A = Len(Arr1(D, C)) Next Next
TransposeSpecial2 = (Arr1)
End Function '-------------------------------------
Salutations!
"Bowen" a écrit dans le message de news: Bon, je crois donc que ça vient d'une limitation de excel 2000, car ton code fonctionne très bien s'il n'y a pas de champ de plus de 1024 caractères, mais pas du tout dans le cas contraire. J'ai alors la même erreur de mémoire que lors de l'ajout par les methodes que j'utilisais avant. Je pense que je vais arriver à tester ça sur un poste en office 2003 pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où l'attaquer: En sachant que le remplissage par microsoft query fonctionne, il faudrait que j'arrive à piloter msquery et que je mettes une source de données à un endroit bien particulier de la feuille.
Pour info: Le but du programme (je te raconte un peu ma vie là, mais bon...): - un programme VB, indépendant de tout excel ou access - le programme se connecte sur une base au choix - permet de sélectionner une ou plusieurs tables ou requêtes - permet de réaliser un extract de n'importe quelle table ou requête, juste avec un clic. une multi-sélection donne plusieurs onglets excel. (un onglet par table/requête à extraire) - permet d'extraire des requêtes avec paramêtres, les paramêtres étant relevés dynamiquement dans les requêtes et demandés à l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la requête contient un champ de plus de 1024 caractères (je suis vert!). Le problème suivant serait: comment fournir des parametres aux requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as consacré, il tourne nickel sur une table qui as des champs courts.
Bonjour Bowen,
Le problème c'est dans excel, au delà d'un certain nombre de caractères contenu
dans les cellules, on ne peut plus utiliser cette syntaxe et façon de faire :
Dim Tblo as variant
Tblo = Feuil1.Range("A1:A10")
'le code bloque sur la ligne suivante.
'et je ne sais pas pourquoi ....!
Feuil3.Range("A1:A10") = Tblo
Mais si on boucle sur chacun des éléments du tableau,
alors là, aucun problème quant à la longueur des chaînes
de caractères.... une cellule contenant un maximum de 32768 caractères.
Ado fait le travail au niveau du recordset, c'est la recopie dans la feuille
de calcul qui cause problème !
J'avais oublié la méthode GetRows... on obtient un peu plus court
et se départir de la fonction devenue inutile !
.------------------------------------
Sub ImporterAccessVersExcel()
Dim Tblo As Variant
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim RG As Range, Requete As String
With Worksheets("Feuil3")
Set RG = .Range("A5")
End With
rst.Open Requete, cnt, adOpenKeyset
nb = rst.RecordCount
'Copie le nom des champs dans la première ligne
Do
RG.Offset(, C) = rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = rst.Fields.Count
Tblo = rst.GetRows
Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count)
For A = 0 To UBound(Tblo, 1)
For B = 0 To UBound(Tblo, 2)
RG.Offset(B, A) = Tblo(A, B)
Next
Next
End Sub
.------------------------------------
Salutations!
"michdenis" <michdenis@hotmail.com> a écrit dans le message de news: uPx9af4FGHA.3892@TK2MSFTNGP12.phx.gbl...
Bonjour,
J'ai modifié un peu la procédure avec ADO - Testée, elle fonctionne..
Pour extraire les données du recordset, il faut jouer un peu de finesse !!!
'-------------------------------------
Sub ImporterAccessVersExcel()
Dim Tblo As Variant
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim RG As Range, Requete As String
With Worksheets("Feuil3")
Set RG = .Range("A5")
End With
rst.Open Requete, cnt, adOpenKeyset
nb = rst.RecordCount
'Copie le nom des champs dans la première ligne
Do
RG.Offset(, C) = rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = rst.Fields.Count
Tblo = TransposeSpecial2(rst.GetRows)
Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count)
For A = 0 To UBound(Tblo, 1)
For B = 0 To UBound(Tblo, 2)
RG.Offset(A, B) = Tblo(A, B)
Next
Next
End Sub
'-------------------------------------
Function TransposeSpecial2(ByRef Arr As Variant) As Variant
Dim A As Integer, B As Integer, Arr1() As Variant
Dim C As Integer, D As Integer
A = UBound(Arr, 1): B = UBound(Arr, 2)
ReDim Arr1(B, A)
For C = 0 To A
For D = 0 To B
Arr1(D, C) = Arr(C, D)
A = Len(Arr1(D, C))
Next
Next
TransposeSpecial2 = (Arr1)
End Function
'-------------------------------------
Salutations!
"Bowen" <joel.cocandeau.mailings@gmail.com> a écrit dans le message de news: 1137059101.371211.71930@o13g2000cwo.googlegroups.com...
Bon, je crois donc que ça vient d'une limitation de excel 2000,
car ton code fonctionne très bien s'il n'y a pas de champ de plus de
1024 caractères,
mais pas du tout dans le cas contraire.
J'ai alors la même erreur de mémoire que lors de l'ajout par les
methodes que j'utilisais avant.
Je pense que je vais arriver à tester ça sur un poste en office 2003
pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où
l'attaquer:
En sachant que le remplissage par microsoft query fonctionne,
il faudrait que j'arrive à piloter msquery et que je mettes une source
de données à un endroit bien particulier de la feuille.
Pour info:
Le but du programme (je te raconte un peu ma vie là, mais bon...):
- un programme VB, indépendant de tout excel ou access
- le programme se connecte sur une base au choix
- permet de sélectionner une ou plusieurs tables ou requêtes
- permet de réaliser un extract de n'importe quelle table ou
requête, juste avec un clic. une multi-sélection donne plusieurs
onglets excel. (un onglet par table/requête à extraire)
- permet d'extraire des requêtes avec paramêtres, les paramêtres
étant relevés dynamiquement dans les requêtes et demandés à
l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la
requête contient un champ de plus de 1024 caractères (je suis vert!).
Le problème suivant serait: comment fournir des parametres aux
requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as
consacré, il tourne nickel sur une table qui as des champs courts.
Le problème c'est dans excel, au delà d'un certain nombre de caractères contenu dans les cellules, on ne peut plus utiliser cette syntaxe et façon de faire :
Dim Tblo as variant Tblo = Feuil1.Range("A1:A10") 'le code bloque sur la ligne suivante. 'et je ne sais pas pourquoi ....! Feuil3.Range("A1:A10") = Tblo
Mais si on boucle sur chacun des éléments du tableau, alors là, aucun problème quant à la longueur des chaînes de caractères.... une cellule contenant un maximum de 32768 caractères.
Ado fait le travail au niveau du recordset, c'est la recopie dans la feuille de calcul qui cause problème !
J'avais oublié la méthode GetRows... on obtient un peu plus court et se départir de la fonction devenue inutile !
.------------------------------------ Sub ImporterAccessVersExcel() Dim Tblo As Variant Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim RG As Range, Requete As String With Worksheets("Feuil3") Set RG = .Range("A5") End With
rst.Open Requete, cnt, adOpenKeyset nb = rst.RecordCount
'Copie le nom des champs dans la première ligne Do RG.Offset(, C) = rst.Fields(C).Name C = C + 1 x = x + 1 Loop Until x = rst.Fields.Count
Tblo = rst.GetRows Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count) For A = 0 To UBound(Tblo, 1) For B = 0 To UBound(Tblo, 2) RG.Offset(B, A) = Tblo(A, B) Next Next End Sub .------------------------------------
Salutations!
"michdenis" a écrit dans le message de news: Bonjour,
J'ai modifié un peu la procédure avec ADO - Testée, elle fonctionne..
Pour extraire les données du recordset, il faut jouer un peu de finesse !!! '------------------------------------- Sub ImporterAccessVersExcel() Dim Tblo As Variant Dim C As Integer Dim cnt As New ADODB.Connection Dim rst As New ADODB.Recordset Dim RG As Range, Requete As String With Worksheets("Feuil3") Set RG = .Range("A5") End With
rst.Open Requete, cnt, adOpenKeyset nb = rst.RecordCount
'Copie le nom des champs dans la première ligne Do RG.Offset(, C) = rst.Fields(C).Name C = C + 1 x = x + 1 Loop Until x = rst.Fields.Count
Tblo = TransposeSpecial2(rst.GetRows) Set RG = RG.Offset(1).Resize(nb, rst.Fields.Count) For A = 0 To UBound(Tblo, 1) For B = 0 To UBound(Tblo, 2) RG.Offset(A, B) = Tblo(A, B) Next Next
End Sub '------------------------------------- Function TransposeSpecial2(ByRef Arr As Variant) As Variant Dim A As Integer, B As Integer, Arr1() As Variant Dim C As Integer, D As Integer A = UBound(Arr, 1): B = UBound(Arr, 2) ReDim Arr1(B, A) For C = 0 To A For D = 0 To B Arr1(D, C) = Arr(C, D) A = Len(Arr1(D, C)) Next Next
TransposeSpecial2 = (Arr1)
End Function '-------------------------------------
Salutations!
"Bowen" a écrit dans le message de news: Bon, je crois donc que ça vient d'une limitation de excel 2000, car ton code fonctionne très bien s'il n'y a pas de champ de plus de 1024 caractères, mais pas du tout dans le cas contraire. J'ai alors la même erreur de mémoire que lors de l'ajout par les methodes que j'utilisais avant. Je pense que je vais arriver à tester ça sur un poste en office 2003 pour être sur, mais je n'ai pas trop de doutes sur la question...
Je ne vois plus qu'une solution, mais je ne sais pas par où l'attaquer: En sachant que le remplissage par microsoft query fonctionne, il faudrait que j'arrive à piloter msquery et que je mettes une source de données à un endroit bien particulier de la feuille.
Pour info: Le but du programme (je te raconte un peu ma vie là, mais bon...): - un programme VB, indépendant de tout excel ou access - le programme se connecte sur une base au choix - permet de sélectionner une ou plusieurs tables ou requêtes - permet de réaliser un extract de n'importe quelle table ou requête, juste avec un clic. une multi-sélection donne plusieurs onglets excel. (un onglet par table/requête à extraire) - permet d'extraire des requêtes avec paramêtres, les paramêtres étant relevés dynamiquement dans les requêtes et demandés à l'opérateur au fur et à mesure des executions de requêtes.
Voila, tout ça fonctionne très bien, mais ne fonctionne pas si la requête contient un champ de plus de 1024 caractères (je suis vert!). Le problème suivant serait: comment fournir des parametres aux requêtes msquery (des parametres access, pas des parametres msquery)
Voila, et merci beaucoup pour ton code et le temps que tu y as consacré, il tourne nickel sur une table qui as des champs courts.
Bowen
Bonjour,
J'ai pu tester sur un poste avec office 2003, et le problème persiste. Je n'ai plus d'autre choix que celui de tronquer le champ en avertissant l'utilisateur.
Merci encore à Michdenis pour ton aide précieuse.
Bowen.
Bonjour,
J'ai pu tester sur un poste avec office 2003, et le problème persiste.
Je n'ai plus d'autre choix que celui de tronquer le champ en
avertissant l'utilisateur.
J'ai pu tester sur un poste avec office 2003, et le problème persiste. Je n'ai plus d'autre choix que celui de tronquer le champ en avertissant l'utilisateur.