Capacité Recordset + chaine de caracère > 256

Signaler
Messages postés
36
Date d'inscription
mardi 21 février 2012
Statut
Membre
Dernière intervention
11 juillet 2012
-
Messages postés
36
Date d'inscription
mardi 21 février 2012
Statut
Membre
Dernière intervention
11 juillet 2012
-
Bonjour,

J'ai un gros problème avec un recordset en terme de capacité.

Le contexte: je suis en train de développer une application VBA pour mon stage en entreprise. Mon application va lire un fichier excel sans l'ouvrir. Pour réaliser cela, je vais utiliser un recordset grâce à une requête.

Le problème: lorsque je récupère les informations avec mon recordset,les chaines de caractères récupérées sont tronquées à 256 caractères. Ceci m'est extrêmement embêtant.

Je vous joint mon code afin que vous compreniez mieux:

'On copie le contenue du tableau du fichier excel dans le recordset(NomFeuilleovv est le nom de l'onglet du classeur)
rec1.Open "SELECT * FROM [" & NomFeuilleovv & "$]", Cn1, adOpenKeyset, adLockOptimistic 
rec1.MoveFirst

'on cherche les comment correspondant à l'Ovv
comment = Nz(rec1![Comment and additional information])


Lorsqu'on lit un fichier excel en mode fermé à l'aide d'un recordset, le recordset va marcher comme une table de base de donnée. la première ligne du fichier et donc du recordset est considéré comme les champs de la table c'est pourquoi je peux exécuter ce genre de requête rec1![NOM CHAMP]. "Comment and additional information" est donc un des champs de mon recordset.

Et donc à ce moment là, quand j’essaie d'obtenir les informations en exécutant rec1![Comment and additional information] je n'ai que 256 caractères alors que j'en ai plus en réalité dans mon fichier excel.

Pourriez vous m'aider ? Je ne sais ABSOLUMENT plus quoi faire...

Je vous remercie d'avance.

Thomas

9 réponses

Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonjour,


256 est la limite d' un champ Texte.
Si tu veux plus, ton champ doit être de type Memo.



[] Ce qui va sans dire. va mieux en le disant.
Messages postés
36
Date d'inscription
mardi 21 février 2012
Statut
Membre
Dernière intervention
11 juillet 2012

Bonjour LIBRE_MAX !!

Tout d'abord merci d'avoir répondu

En effet mémo est le bon format pour la base de donnée mais je ne travaille pas sur la base dans mon cas.

Le recordset va fonctionner comme si c'était une table dans le sens où on peut faire des recherches dans le recordset par rapport aux noms de la première ligne tout comme on ferait avec une table de base de donnée. Mais en aucun cas il y a de lien direct avec la base de donnée.

Vois-tu ce que je veux dire ?
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonjour,

Effectivement. Et je vois ce que tu veux dire..
Mais pour l' instant je ne vois pas trop comment on peut y remèdier.
Peut être en subdiviant.
Je veux dire en extrayant des lots de 256 caractères, et en les récomposant par la suite.

Et comment ?
Je ne suis pas trop VBA, et j' avoue que je "sèche" !




[] Ce qui va sans dire. va mieux en le disant.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,
Mon application va lire un fichier excel sans l'ouvrir

Il va alors falloir changer ton fusil d'épaule.
Ouvre pour traiter le fichier dont il s'agit
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
36
Date d'inscription
mardi 21 février 2012
Statut
Membre
Dernière intervention
11 juillet 2012

C'est sûr qu'ouvrir un fichier pour travailler dessus c'est mieux
Non mais quand je dit:
Mon application va lire un fichier excel sans l'ouvrir

Je veux dire qu'aux yeux de l'utilisateur c'est transparent et que le classeur ne s'ouvre pas ni ne s'affiche à l'écran comme avec un double clic. Mais bien sûr que j'utilise une commande qui l'ouvre quelque part pour accéder à son contenu
C'est de la "lecture dans classeur fermé", c'est le nom du tutoriel que j'ai suivit pour faire ce genre d'action.

@LIBRE_MAX: l'idée de lire 256 caractères par 256 est bonne mais le problème c'est que comme je ne lis pas directement dans le fichier excel mais que le le lis par le biais du recordset et que le problème se trouve au niveau du recordset, je ne pourrai jamais lire plus de 256 caractères

Merci à tous de m'aider !! Dès qu'une idée vous vient, je suis preneur !!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Ouvrir l'application Excel ne signifie pas l'afficher forcément.
Une application possède la propriété visible. Mets-la donc à False !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
36
Date d'inscription
mardi 21 février 2012
Statut
Membre
Dernière intervention
11 juillet 2012

Je me suis peut-être mal exprimé. Le principe de la "lecture dans fichier fermé" c'est justement de ne pas ouvrir le fichier quand bien même tu le mettes en visible = false. Tu te sers d'un recordset en fait qui va copier tout le contenu du fichier Excel et donc après tu ne travailles que sur ton recordset qui va s'utiliser comme une table de base de données. En fait, en "lecture dans fichier fermé", ton fichier Excel est comme une base de donnée. Voici le lien: lecture fichier fermée

Et voici mon code pour que tu voies en quoi ça consiste:

Dim Cn1 As ADODB.Connection
Set Cn1 = New ADODB.Connection

Dim rec1 As ADODB.Recordset
Set rec1 = New ADODB.Recordset

Dims as string fichierovv

'Init Variable
Fichierovv = "C:\Documents and Settings\K005889\Desktop\Current Version\Fichier tests\ LG_PF_OVV_LTRgr1.xlsm"

'Connection to the Excel file as a database
    With Cn1
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & fichierovv & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With

'We copy the content from the Excel file into the recordset (where "NomFeuilleovv" is the name of the sheet in the open workbook)
rec1.Open "SELECT * FROM [" & NomFeuilleovv & "$]", Cn1, adOpenKeyset, adLockOptimistic
rec1.MoveFirst 

'We look for the line where the item in column "Objective Id" equals NSS-FOD-PF-OVV-FU-472
rec1.Find "[Objective Id]= 'NSS-FOD-PF-OVV-FU-472'", , adSearchForward
'We get description of the Objective
objdesc = rec1![Objective Description]

'We get comment of the Objective
comment = rec1![Comment and additional information]


"Objective Description" et "Comment and additional information" sont les titres qu'il y a dans le fichier Excel sur la première ligne. Et quand le recordset copie tout le tableau, les cases de la première ligne deviennent les cases de la première ligne du recordset et sont interprétées (dans le pricnipe uniquement) comme les champs d'une table d'où la possibilité d’exécuter ce genre d'instruction "rec1![Comment and additional information]".

Et mon problème vient que la variable "comment" lors de la dernière instruction ne prend que 256 caractères alors que la chaine de caractères dans le fichier excel est plus longue que ça.

Tu vois ce que je veux dire ? Si oui tu sais comment y remédier ? Car je suis en détresse la, j'ai plus d'idée.

Je te remercie d'avance !!
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
J'avais bien compris le principe, au demeurant bien connu.
Mais comme tu le dis toi-même : impossible de définir tes champs, avec cette méthode.

Alors : si tu ne "changes pas ton fusil d'épaule" (en ouvrant), je ne vois pas de solution miracle, personnellement.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
36
Date d'inscription
mardi 21 février 2012
Statut
Membre
Dernière intervention
11 juillet 2012

Ouai je pense que je vais changer de méthode, j'y pensais depuis un petit moment mais il est vrai que ça m'aurait plu de pouvoir le faire de cette façon là, c'est dommage...

Car l'avantage de cette solution c'est que les colonnes du fichier Excel peuvent changer de place, peu importe car avec le recordset on ne fera référence qu'au champs.

Enfin bon, me voila parti sur cette idée du coup Merci donc de confirmer le fait qu'il me faut "changer mon fusil d'épaule"

Si jamais une information vous parvient sur l'augmentation de la capacité du recordset, dites moi quand mm