ThomasFalguieres
Messages postés36Date d'inscriptionmardi 21 février 2012StatutMembreDernière intervention11 juillet 2012
-
6 avril 2012 à 11:00
NHenry
Messages postés15090Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 6 novembre 2023
-
14 avril 2012 à 20:04
Bonjour,
Je suis actuellement en train de développer une application VBA et je rencontre un problème au niveau des recordset je pense.
Le contexte de mon problème est le suivant: Je fais une requête SQL sur un fichier Excel fermé grâce à l'objet ADO et je stock le résultat dans un recordset. Mon recordset est dès lors interprété comme une table de base de donnée avec pour noms de champs la première ligne du tableau dans le fichier Excel.
Mon problème: Je veux faire afficher le contenu de certains enregistrements de mon recordset qui contiennent du texte. Le problème est que s'il y a trop de texte dans une cellule de mon tableau Excel, j'ai l'impression que le recordset ne prend qu'un certain nombre de caractères. Car je me retrouve avec une chaine de caractères coupée à un certain endroit et ne l'ai pas dans sa totalité ce qui m'embête fortement.
Je voulais donc savoir si c'est dû à la capacité d'un enregistrement de recordset qui serait très faible ou à autre chose. Je récupère le texte de l'enregistrement de mon recordset dans une variable string qui a une capacité de 63 Ko (par définition) donc qui ne devrait pas me poser problème.
Je vous donne mon code si jamais cela peut aider:
Sub RequeteClasseurFerme_Excel()
Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim Rst As ADODB.Recordset
Set Rst = New ADODB.Recordset
Dim Rst1 As ADODB.Recordset
Set Rst1 = New ADODB.Recordset
Dim tableauLTR() As ltrObjectif
Dim titre3 As String, titre2 As String, titre1 As String, objdesc As String, nomacceptance As String
Dim itemPointe As String, ovvName As String
'Définit le classeur fermé servant de base de données
Fichier = "P:\LG_PF_OVV_L46D05023192_v8.xlsm"
'Nom de la feuille dans le classeur fermé
NomFeuille = "Test Obj."
Set Cn = New ADODB.Connection
'--- Connexion ---
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With
'-----------------
'On définit la requête ...
'
Rst.CursorType = adOpenKeyset
Rst.CursorLocation = adUseClient
'On récupère dans le recordset le tableau Excel
Rst.Open "SELECT * FROM [" & NomFeuille & "$]", Cn, adOpenDynamic, adLockOptimistic
Rst.MoveFirst
While Not Rst.EOF
'On lit l'item selectionné dans le recordset
itemPointe = Nz(Rst![Objective Id])
If (itemPointe <> "NSS-FOD-PF-OVV-PI-680" Or itemPointe = Null) Then
Rst.MoveNext
ovvName = Nz(Rst![Objective Id])
Else
'on cherche la description correspondant à l'Ovv
objdesc = Nz(Rst![Objective Description])
While (objdesc "" Or objdesc " ")
Rst.MovePrevious
objdesc = Nz(Rst![Objective Description])
Wend
'on cherche l'acceptance criteria correspondant à l'Ovv
nomacceptance = Nz(Rst![acceptance criteria])
'on cherche le titre 1 correspondant à l'Ovv
titre1 = Nz(Rst![Platform Function])
While (titre1 "" Or titre1 " ")
Rst.MovePrevious
titre1 = Nz(Rst![Platform Function])
Wend
'On place le curseur à la fin du recordset car on a déjà trouvé l'OVV
Rst.MoveLast
Rst.MoveNext
End If
Wend
Rst.Close
Set Rst = Nothing
'On affiche toute les information liéees à l'OVV
MsgBox "Id objectif: " & ovvName & Chr(13) & _
"Description Objectif: " & objdesc & Chr(13) & _
"Acceptance criteria: " & nomacceptance & Chr(13) & _
"titre 3: " & titre3 & Chr(13) & _
"titre 2: " & titre2 & Chr(13) & _
"titre 1: " & titre1 & Chr(13)
'Je crée un fichier texte et écris les variables pour voir le contenu exact
Set FSys = CreateObject("Scripting.FileSystemObject")
Set MonFic = FSys.CreateTextFile("P:\fichier.txt")
With MonFic 'Pour écrire dans le fichier texte
.WriteLine "Id objectif: " & ovvName 'Mettre write pour ne pas sauter à la ligne
.WriteLine "Description Objectif: " & objdesc
.WriteLine "titre 3: " & titre3
.WriteLine "titre 2: " & titre2
.WriteLine "titre 1: " & titre1
.WriteLine "Acceptance criteria: " & nomacceptance
End With
Msg = "Écriture réussie dans fichier.txt"
MsgBox (Msg)
End Sub
L'erreur se produit sur la variable en rouge "nomacceptance" qui ne prend que la moitié du texte contenu dans l'enregistrement pointé par l'instruction "Rst![acceptance criteria]"
NHenry
Messages postés15090Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 6 novembre 2023159 6 avril 2012 à 12:51
Bonjour,
Quelle est la longueur du texte dans la cellule ?
Quelle est la longueur récupérée ?
---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list ---
Mon site
ThomasFalguieres
Messages postés36Date d'inscriptionmardi 21 février 2012StatutMembreDernière intervention11 juillet 2012 10 avril 2012 à 08:57
Bonjour,
Désolé de ne pas avoir répondu avant mais weekend de pâque oblige
Pour en revenir à mon problème, je ne peux vous montrer le texte car développant une application dans le cadre professionnel, il m'est impossible de le copier coller.
Toutefois, mon texte fait environ 360 caractères et mon recordset n'en prend que 250 ce qui est un peu plus de la moitié.
NHenry
Messages postés15090Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention 6 novembre 2023159 14 avril 2012 à 20:04
Bonjour,
Je crois qu'en Excel, par défaut on ne peut récupérer que 250 caractères, il faut utiliser des fonctions VBA pour s'en sortir.
Voir si avec une base Access tu t'en sors mieux.
Sinon, pourquoi utiliser FSO ?
Il y a Open, Print et Close qui feront l'affaire.
---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list ---
Mon site