VBA Problème récupération format Date Recordset

creal69360

XLDnaute Junior
Bonjour,

J'ai crée une Recordset afin de récupérer d'une grosse base des données selon certains critères (saisis dans un userform) que je rajoute à la clause where. Jusque là aucun problème, ma requête fonctionne très bien et me récupère les bonnes données.

J'ai cependant un soucis au niveau des dates, en effet un grand nombre de colonnes contiennent des dates (elles peuvent aussi contenir du texte). Le soucis est que lorque j'exécute ma recordset, les dates sont transformées en integer au format standard donc changer le format avec .numberformat n'a aucun impact (mes données ne sont plus considérées comme des données numériques). Je voudrais donc savoir si il existe une solution pour avoir des dates à la place de nombres. Voici ci-dessous mon code pour exécuter la recordset (Utilisable uniquement sous Excel 2007):


sub recup()

Dim cn, cn1 As ADODB.Connection
Dim rst, rst1 As ADODB.Recordset
Dim texte_SQL As String
Dim where as string



where = where & "[Manager]='" & filtre.zl_manager_projet & "'"

Set cn = New ADODB.Connection

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & chemin_base & ";Extended Properties=Excel 8.0;"

texte_SQL = "Select * from [" & onglet_source & "$] " & where
Set rst = New ADODB.Recordset


Set rst = cn.Execute(texte_SQL)

ThisWorkbook.Sheets(onglet_dest).Cells.ClearContents

For i = 0 To rst.Fields.Count - 1
ThisWorkbook.Sheets(onglet_dest).Cells(4, i + 1) = rst.Fields(i).Name
Next i

ThisWorkbook.Sheets(onglet_dest).Range("a5").CopyFromRecordset rst

rst.Close
Set rst = Nothing

cn.Close
Set cn = Nothing

end sub
 

Dranreb

XLDnaute Barbatruc
Re : VBA Problème récupération format Date Recordset

Bonjour.
Vous ne mettez pas le mot clé "WHERE" dans votre requête SQL, ça passe quand même ?
Vous ne typez pas explicitement les variables cn et rst, elles sont donc déclarées Variant.
La fonction CDate permet de transformer en date une expression String représentant une date valide, et la fonction DateSerial permet d'en fabriquer une à partir des année, mois et jour.
 

creal69360

XLDnaute Junior
Re : VBA Problème récupération format Date Recordset

Rebonjour.

Tout d'abbord merci pour cette réponse rapide, je pense que la fonction Cdate est une bonne méthode mais il faudrait réaliser une boucle avec un temps d'exécution élevé (quelques milliers de lignes). ya -t-il donc une possibilité d'utiliser une CDATE sur une range ou quelquechose dans ce genre, je rappelle que certaines cellules contiennent du texte. Je vais aussi essayer la méthode proposer par Gilbert. Encore merci.
 

creal69360

XLDnaute Junior
Re : VBA Problème récupération format Date Recordset

Concernant la requête SQL, elle fonctionne. Je n'ai pas mis le code en entier car il est confidentiel j'ai peut être oublier de précise que where est initialisé comme ceci:
where="where" ensuite viennent les critères. Si un critère est déja indiqué on concataine la variable when de cette façon when=when & "and intitulé de colonne=critere.
en espérant me faire comprendre.
 

creal69360

XLDnaute Junior
Re : VBA Problème récupération format Date Recordset

J'ai cherché sur internet des solutions pour mon problème. J'aimerais le traiter à la source c'est à dire depuis la recordset. Cependant je suis un débutant des recordset, j'en ai déja réalisé qui étaient assez simple. Celle ci me semblait aussi assez simple mais maintenant il y a ce soucis de date qui m'embête beaucoup. Peut-être que je pourrai modifier les propriétés de ma recordset. Quelqu'un sait comment faire? Merci.
 

Dranreb

XLDnaute Barbatruc
Re : VBA Problème récupération format Date Recordset

il faudrait réaliser une boucle avec un temps d'exécution élevé (quelques milliers de lignes)
Il ne sera élevé que si vous travaillez directement avec les cellules au lieu de charger toute la colonne, travailler sur le tableau puis décharger tout celui-ci dans la colonne. La durée d'exécution est en effet beaucoup plus dépendante du nombre de fois qu'on utilise Range ou Cells que du nombre de valeurs de cellules transférées à chacune de ces utilisations. donc : seulement 2 * 10000 et surtout pas 10000 * 2 !
 

creal69360

XLDnaute Junior
Re : VBA Problème récupération format Date Recordset

Tout à fait d'accord!

Mais comment je fais? Sachant que certaines données ne sont pas des dates. Voici ma méthode par cellule mais bon c'est longt et le temps c'est de l'argent!

For Each c In Sheets("Consultation Données").Range("n5:aa" & dernlign).Cells
If c.Value <> "" Then

c.Value = CDate(c.Value)
End If
Next c

Comme je suis pas très doué, je rajoute
Range("n5:aa" & dernlign).NumberFormat = "dd/mm/yyyy"
 

MJ13

XLDnaute Barbatruc
Re : VBA Problème récupération format Date Recordset

Bonjour à tous

Mais comment je fais? Sachant que certaines données ne sont pas des dates. Voici ma méthode par cellule mais bon c'est longt et le temps c'est de l'argent!

Je ne comprend pas, tu nous livres un code et sans fichier de données, on pourra pas faire plus :confused:.

C'est à toi à modifier tes données pour les transfromer en dates. C'est pour cela que dans les bases de données, il vaut mieux avoir un type de défini pour un champs.

Pour nous le temps ce n'est pas de l'argent mais de l'aide et qui peut nous aider en retour!
 

Dranreb

XLDnaute Barbatruc
Re : VBA Problème récupération format Date Recordset

Eh bien comme ça par exemple :
VB:
Dim T() As Variant, L As Long, C As Long
With Worksheets("Consultation Données").Range("n5:aa" & dernlign).Cells
   T = .Value
   On Error Resume Next
   For L = 1 To UBound(T, 1): For C = 1 To UBound(T, 2)
      If Not IsEmpty(T(L, C)) Then T(L, C) = CDate(T(L, C))
      Next C, L
   On Error GoTo 0
   .NumberFormat = "dd/mm/yyyy"
   .Value2 = T: End With
 
Dernière édition:

creal69360

XLDnaute Junior
Re : VBA Problème récupération format Date Recordset

Bonjour,

J'ai un nouveau souci:

j'ai certaines lignes qui sont vides, quand j'utilise la procédure elles contiennent alors 00/01/1900 car les cellules vides sont considérées comme des 0. Peut-on le modifier avec le même principe?
Merci d'avance.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof