OVH Cloud OVH Cloud

Longueur d'une cellule > 1024

12 réponses
Avatar
Bowen
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?

10 réponses

1 2
Avatar
michdenis
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" 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?
Avatar
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?
Avatar
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?
Avatar
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
Avatar
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

cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:Mes DocumentsComptoir.mdb;" & _
"Jet OLEDB:Database Password=", "admin", ""
Requete = "Select * from Employés"

rst.Open Requete, cnt, adOpenKeyset
nb = rst.RecordCount

'Copie le nom des champs dans la première ligne
Do
MyRange.Offset(, C) = rst.Fields(C).Name
C = C + 1
x = x + 1
Loop Until x = rst.Fields.Count

MyRange.Offset(1).Resize(nb, rst.Fields.Count) = TransposeSpecial2(rst.GetRows)

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
Avatar
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.
Avatar
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é...
Avatar
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

cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:denis.mdb;" & _
"Jet OLEDB:Database Password=", "admin", ""
Requete = "Select * from table1"

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

cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:denis.mdb;" & _
"Jet OLEDB:Database Password=", "admin", ""
Requete = "Select * from table1"

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

cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:denis.mdb;" & _
"Jet OLEDB:Database Password=", "admin", ""
Requete = "Select * from table1"

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.
Avatar
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.
1 2