Bonjour,
Après plusieurs recherches et différents tests, je ne trouve toujours pas comment faire pour exporter le résultat d'une requete faisant plus de 255 caractères vers excel.
Ma requete récupère des données d'une table + un champ calculé basé sur une fonction que j'ai fait en vba qui concatène des données de 3 champs d'une autre tables.
En gros j'ai une table de comptes et une table de contatcs de ces comptes et ma requête me fait une ligne par compte avec une concaténation dans la dernière colonne des contacts réalisés avec ces comptes sous la forme [date du contact] ([type de contact]): saut de ligne [descripif du contact] (fonction ci-dessous).
Mon export se fait aussi en code vba en écrivant ligne par ligne dans Excel (car je fais d'autres concaténations lors de du remplissage du fichier issues d'autres tables)
La requête servant de base à l'export n'est pas en dur dans la base, mais gérée par un recordset DAO. Elle n'utilise pas de regroupement (j'ai vu que c'était une des sources possibles de coupures).
Si j'exécute cette requête dans Access (copie/colle du sql dans une requête), le résultat comprend bien plus de 255 caractères (mon texte n'est pas tronqué quand je visualise le résultat de la requête dans Access), mais une fois envoyé dans Excel, c'est coupé à 255 et c'est suivit d'un caractère spécial non issu de ma requête... :
10/10/2014 (Courrier) :
Publipostage initial de présentation du projet + enquete
20/10/2014 (Courrier) :
Retour enquete favorable
27/10/2014 (Tél.) :
Appel pour validation de la négo
28/10/2014 (Courrier) :
envoie de la Propo21
05/11/2014 (Couă
si je fais un docmd.transfertspreadsheet de la requête issue du copié/collé évoqué, j'obtiens également une donnée tronquée, mais il n'y a pas le "ă" à la fin
J'ai vu que cela pouvait aussi être lié au fait qu'Excel se base sur les 8 première ligne pour définir le format de sa colonne (la ligne qui contient plus de 255 était en 12), j'ai donc tenté en modifiant ma requete pour la trier par longueur du commentaire décroissant, mais cela coupe quand même à 255 caractères...
Je ne vois pas comment procéder. J'aimerais éviter de devoir créer une table temporaire avec un champ de type mémo (qui lui sera paut être complètement exporté ?)
Je met le code de ma fonction et de ma manipulation Excel mais je ne pense pas que le problème vienne de là vu le résultat du transfertspreadsheet sur la requête qui contient le champs de plus de 255 caractères.
Code de l'export (j'ai effacé des bouts car bcp de passages inutiles = remplissage des autres colonnes qui ne posent pas de problème)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 Function ConcatContact(ChampSearch, id) Dim rst As DAO.Recordset Dim sql As String ConcatContact = "" sql = "SELECT Contact.Contact_Date, Contact.Contact_Type, Contact.Contact_Rq" sql = sql & " FROM Contact" Select Case ChampSearch Case "Compte" sql = sql & " WHERE Nz([Contact_Compte],'') = '" & id & "'" Case "Exploitation" sql = sql & " WHERE Nz([Contact_Exploit],'') = " & id & "" Case "Tiers" End Select sql = sql & " ORDER BY Contact.Contact_Date" Set rst = CurrentDb.OpenRecordset(sql) If rst.EOF Then Exit Function ConcatContact = rst("Contact_Date") & " (" & rst("Contact_Type") & ")" & IIf(Nz(rst("Contact_Rq"), "") = "", "", " : " & Chr(13) & Chr(10) & rst("Contact_Rq")) rst.MoveNext While Not rst.EOF ConcatContact = ConcatContact & Chr(13) & Chr(10) & rst("Contact_Date") & " (" & rst("Contact_Type") & ")" & IIf(Nz(rst("Contact_Rq"), "") = "", "", " : " & Chr(13) & Chr(10) & rst("Contact_Rq")) rst.MoveNext Wend rst.Close Set rst = Nothing End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 '***ouverture du fichier excel entretien Set appExcel = CreateObject("Excel.Application") Set wbExcel = appExcel.Workbooks.Add Set wsExcel = wbExcel.Sheets(1) wbExcel.Sheets(1).Name = "Compte" '************************************ '*** selection des données compte *** '************************************ Set db = CurrentDb Set rst = db.OpenRecordset("SELECT Compte.*, ConcatContact('compte',[Id_compte]) as contacts FROM Compte ORDER BY Compte.Id_Compte;") rst.MoveFirst rst.MoveLast avance = rst.RecordCount rst.MoveFirst '***ecriture ligne à ligne nbEnreg = 1 id = 0 cptligne = 1 cpt = "" wsExcel.Cells(cptligne, 1) = "RefCpt1" ... wsExcel.Cells(cptligne, 6) = "Historique contacts" wsExcel.Cells(cptligne, 9) = "NomComplet" wsExcel.Cells(cptligne, 10) = "Nee" ... wbExcel.SaveAs FileName:=CurrentProject.Path & "\Suivi_Nego.xlsx" Set wbExcel = appExcel.Workbooks.Open(CurrentProject.Path & "\Suivi_Nego.xlsx") Set wsExcel = wbExcel.Sheets(1) Do Until rst.EOF cptligne = cptligne + 1 wsExcel.Cells(cptligne, 1) = rst("Id_compte") ... wsExcel.Cells(cptligne, 6) = rst("contacts") Set rst2 = db.OpenRecordset("SELECT Proprio.*,Cpt_Proprio.* FROM Proprio INNER JOIN Cpt_Proprio ON Proprio.Id_Proprio = Cpt_Proprio.Id_Proprio WHERE (((Cpt_Proprio.Id_Compte)='" & rst("Id_compte") & "'));") wsExcel.Cells(cptligne, 9) = IIf(Nz(rst2("Civilite"), "") = "", rst2("Nom"), rst2("Civilite") & " " & rst2("Nom") & " " & rst2("prenom")) wsExcel.Cells(cptligne, 10) = rst2("Nee") ... rst2.MoveNext While Not rst2.EOF wsExcel.Cells(cptligne, 9) = wsExcel.Cells(cptligne, 9) & Chr(10) & IIf(Nz(rst2("Civilite"), "") = "", rst2("Nom"), rst2("Civilite") & " " & rst2("Nom") & " " & rst2("prenom")) wsExcel.Cells(cptligne, 10) = wsExcel.Cells(cptligne, 10) & Chr(10) & rst2("Nee") rst2.MoveNext Wend rst2.Close rst.MoveNext nbEnreg = nbEnreg + 1 Loop rst.Close rst2.Close set rst=nothing set rst2 = nothing wbExcel.Close True Set wbExcel = Nothing Set wsExcel = Nothing appExcel.Quit
Partager