environnement : office 2007
DAO

Bonjour,

Je travaille à partir d'une base de donnée de cotations du CAC40 et de ses 40composantes. J'ai le nom de chaque composante, son code isin, son cours.


A travers un formulaire, je recupere les dates "debut" et "fin" que me donne l'utilisateur.

Ensuite, je les utilise pour réaliser une requête sur access censé me donner 4 informations sur chaque composante :

nom, code isin, cours initial, moyenne( moyenne des cours entre date "debut+1jour" et fin)

Le probleme est : l'objet resultat de ma requete que j'ai appelé resultat ne trouve pas les données à priori.

L'endroit où se produit l'erreur est en rouge dans le code, tout d'un bas.

Ma requete marche tres bien si je prend des dates en dur comme 11/11/2008.

J'espère avoir été clair : Voila mon code :

formulaire :
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
Private Sub CommandButton1_Click()
Dim debut_temp As String
Dim fin_temp As String
 
    If Len(TextBox1) < 10 Then
        MsgBox "la date de début n'est pas conforme.": Exit Sub
    Else
        debut_temp = TextBox1.Text
        debut = CDate(debut_temp)
    End If
    If Len(TextBox2) < 10 Then
        MsgBox "la date de fin n'est pas conforme.": Exit Sub
    Else
        fin_temp = TextBox2.Text
        fin_temp2 = CDate(fin_temp)
        'met la date en format américain
        fin = Format(fin_temp2, "mm/dd/yyyy")
    End If
    If OptionButton1 = True Then
        UserForm1.Hide
        UserForm2.Show
    Else
        UserForm1.Hide
        main                ' appel de la macro principale
    End If
End Sub
 
 
' Textbox1 et Textbox2
' L'utilisateur ne peux taper que des chiffres, cela limitant le
'nombre d'erreurs possible.
 
Private Sub TextBox1_Change()
With TextBox1
  Select Case Len(.Text)
  Case 2, 5
   .Text = .Text & "/"
  End Select
   End With
End Sub
 
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'L'utilisateur ne peux taper que des chiffres.
If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
 
Private Sub TextBox2_Change()
With TextBox2
  Select Case Len(.Text)
  Case 2, 5
   .Text = .Text & "/"
  End Select
   End With
End Sub
 
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'L'utilisateur ne peux taper que des chiffres.
If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
module principal
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
'déclaration des variables globales :
'dates définies par l'utilisateur

Public debut As Date
Public debut2 As Date
Public fin As Date

Public Sub main()
UserForm1.Show
'déclarations des variables
Dim cheminbdd As String
Dim mabdd As DAO.Database
Dim t_general(5, 41) As Variant

'Si besoin est, modifier la chemin de la base de donnée ici :
cheminbdd = "C:\Users\FABIEN\Desktop\projet vba\cotations.mdb"

Call ouverture(mabdd, cheminbdd)
Call requete_debut2(mabdd, debut, debut2)
'MsgBox debut
'MsgBox fin
'MsgBox debut2
'debut3 = Format(debut2, "dd/mm/yyyy")
'MsgBox debut3
'debut4 = Format(debut2, "mm/dd/yyyy")
'MsgBox debut4
Call requete_cours(mabdd, debut, debut2, fin, resultat)
Call tab_general(resultat, t_general)

End Sub


'Ouverture de la base de donnée'

Sub ouverture(mabdd, cheminbdd)
    Set mabdd = OpenDatabase(cheminbdd)
End Sub

'On définit la date debut2 en vérifiant que celle ci est un jour ouvré.
'On effectue une requête qui permet de vérifier que c'est bel et bien
'un jour férié en basant sur le CAC40.

Public Sub requete_debut2(mabdd, debut, debut2)
Dim test_debut2 As String

Do
    'il faut mettre la date en format francais pour que excel augmente bien de 1 jour
    debut2 = Format(debut2, "dd/mm/yyyy")
    debut2 = debut + 1
    'il faut mettre la date en format américain pour access
    debut2 = Format(debut2, "mm/dd/yyyy")
    
    test_debut2 = "SELECT COTATIONS.DATE " & _
        " FROM COTATIONS WHERE ((CODE_ISIN = 'FR0003500008')" & _
            "AND (DATE='" & debut2 & "'));"
    
    vtest = mabdd.CreateQueryDef("", test_debut2)
Loop Until (IsNull(vtest) = False)
'On peux maintenant mettre debut en format américain pour les requetes access futures
debut = Format(debut, "mm/dd/yyyy")

End Sub

'Requête permettant d'obtenir le cours initial(debut) et la moyenne
'des cours de clotûre de la période T (entre debut2 et fin)

Public Sub requete_cours(mabdd, debut, debut2, fin, resultat)
Dim rgeneral As String

    rgeneral = "SELECT Nom, Cours.CodeISIN, Cours.Cours_Cloture, [CoursMoyen].Moyenne " & _
" FROM (SELECT Cac40.Nom, Cac40.Code_ISIN AS CodeISIN, Cours_Cloture " & _
          " FROM CAC40 INNER JOIN COTATIONS " & _
          " ON CAC40.Code_ISIN=Cotations.Code_ISIN " & _
          " WHERE (Date=#" & debut & "#) " & _
          " ORDER BY Cac40.Code_ISIN)  AS COURS INNER JOIN (SELECT Code_ISIN, AVG(Cours_Cloture) AS Moyenne " & _
                 " FROM Cotations " & _
                 " WHERE (Date BETWEEN #" & debut2 & "# AND  #" & fin & "# ) " & _
                 " GROUP BY COTATIONS.CODE_ISIN " & _
                 " ORDER BY COTATIONS.CODE_ISIN)  AS CoursMoyen ON Cours.CodeISIN=[CoursMoyen].Code_ISIN " & _
" ORDER BY Cours.CodeISIN;"
  
    Set vcours = mabdd.CreateQueryDef("", rgeneral)
    
' L' ERREUR EST SUR LA LIGNE SUIVANTE :
Set resultat = vcours.OpenRecordset

End Sub


Sub tab_general(resultat, t_general)

Dim max1 As Integer

resultat.MoveFirst
max1 = resultat.RecordCount

    For i = 1 To max1
        t_general(1, i) = resultat.Fields("Nom")
        t_general(2, i) = resultat.Fields("CodeIsin")
        t_general(3, i) = resultat.Fields("Cours_Cloture")
        t_general(4, i) = resultat.Fields("Moyenne")
        t_general(5, i) = ((t_general(4, i) - t_general(3, i)) / t_general(3, i))
        resultat.MoveNext
    Next i

For i = 1 To max1
        For j = 1 To 5
            Worksheets("Feuil1").Cells(i, j) = t_general(j, i)
        Next j
         
    Next i

End Sub