IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Extraction table vers fichier xls - pb de tri


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut Extraction table vers fichier xls - pb de tri
    Bonjour,

    J'ai créé un code VBA qui me permet d'exporter des tables ACCESS dans un seul fichier Excel (qui comporte alors un onglet par table ACCESS).
    L'exportation fonctionne bien.
    Par contre certaines tables se retrouvent "détriées" sans raison (du moins je n'arrive pas à l'expliquer) après l'export.

    Pour info voici le code :

    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
    Private Sub cumul_résultats_Click()
    ' Cette procédure cumule les tables résultats des différents scénarios
    ' et les agrege dans un fichier , enregistré dans le répertoire
    ' de l'outil access
     
    Dim nom_table As String
    Dim première_lettre As String
    Dim Chemin As String
     
    ' création du répertoire Résultats
    If Dir(Application.CurrentProject.Path & "\Résultats", vbDirectory) = "" Then MkDir (Application.CurrentProject.Path & "\Résultats")
    Chemin = Application.CurrentProject.Path & "\Résultats" & "\export_rés_scénarii_" _
    & Day(Now) & "-" & Month(Now) & "-" & Year(Now) & " " & Hour(Now) & "h" & Minute(Now) & "mn" & Second(Now) & "s"
     
    ' enregistrement des résultats dans un fichier export_résultats (le nom du fichier indique la date et l'heure de la sauvegarde des résultats
    For Each t In CurrentDb.TableDefs
        nom_table = t.Name
        If Left(nom_table, 1) = "R" Then
            DoCmd.TransferSpreadsheet acExport, 8, nom_table, Chemin
        End If
    Next
     
    MsgBox ("Votre fichier est sauvegardé sous  " & Chemin)
     
    End Sub
    Merci d'avance pour votre aide car je sèche complètement

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Cela doit venir du fait qu'officiellement une table n'est jamais triée. Elle est simplement affichée dans un certain ordre et cet ordre ne sert qu'à l'affichage.

    Essaye en remplaçant ta table source par une requête. Un truc du genre :

    reqTaRequete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select [TaTable].* from [TaTable] order by [TaTable].[TonChamp].

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Ok effectivement ça doit être qqchose de ce style. Du coup ce n'est pas dans cet endroit du programme que ça buggue.

    Est-ce qu'il existe un moyen de trier mon "DAO.Recordset" en code VBA ?

    Merci d'avance pour votre aide .

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Il y a une méthode .Sort sur ton objet recordset mais personnellement je fais plutôt le tri dans une requête et je me sers de cette requête triée comme source du recordset.

    Je trouve cela plus facile à débugger car on peut visualiser une requête mais plus difficilement un Recordset.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    En fait, pour être plus précis, j'utilise une table (déjà triée dans access) comme source de mon recordset.

    Ensuite, je charge mon recordset ligne à ligne (en utilisant l'instruction "MoveNext"), en y ajoutant des colonnes de calcul, basées sur les données de ma table source.

    Enfin, j'enregistre mon recordset ainsi construit dans une nouvelle table access

    Et là sans comprendre pourquoi, environ 1 fois sur 10, ma nouvelle table access n'est plus triée comme ma source (les 9 autres fois, ça fonctionne !)

    J'espère que mon problème vous parait plus clair. Je ne comprends vraiment pas pourquoi j'ai ce phénomène. Et je ne maitrise pas bien SQL, mais beaucoup plus VBA ...

    Quelqu'un peut-il m'aider à trouver un moyen pour obtenir des tables triées en sortie de mon programme svp ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Petit up !
    J'aimerai vraiment comprendre et trouver une solution à mon problème ...

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Officiellement une table n'est jamais triée donc il n'y a pas de garantie de l'ordre des enregistrements seulement que tous les enregistrements seront parcourus.

    Mathématiquement parlant une table est un ensemble et un ensemble n'a pas de notion d'ordre. C'est juste un gros "sac d'objets" en vrac.

    La seule méthode que j'utilise pour être sur de l'ordre des enregistrements est d'utiliser une requête avec une instruction de tri.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Merci pour cette réponse.
    Je pensais que l'on pouvait trier en amont et disposer les données dans le bon ordre dans la nouvelle table.

    J'ai tenté avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim sql As String
    sql = "SELECT * FROM [R_L_scénario central_Frais] ORDER BY [R_L_scénario central_Frais].[Id_prêt];"
    CurrentDb.Execute sql
    Mais ça ne fonctionne pas ...
    Où est mon erreur ?

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim sql As String
    sql = "SELECT * FROM [R_L_scénario central_Frais] ORDER BY [R_L_scénario central_Frais].[Id_prêt];"
    dim db as dao.database:set db=currentdb
    dim r as dao.recordset:set r=db.openrecordset(sql, dbOpenDynaset)
     
    '
    'Ici ton code
    '
     
    r.close:set r=nothing
    db.close:set b=nothing

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Ok merci bcp, je vais essayer ça de suite.
    Par contre, à quoi sert le code : Est-ce que c'est une façon de vider "r" une fois utilisé ?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Je vais passer pour un boulet je crois, mais je n'y arrive pas.

    Je ne comprend pas comment copier la table r dans la table ACCESS existante ...

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Désolé de m'être montré abscond et elliptique.

    Set x=Nothing sert à libérer explicitement la mémoire utilisée par l'objet x. X est un objet quelconque (formulaire, rapport, module, requête, table, recorset ...).

    Normalement le compliateur s'en charge pour toi mais il est recommandé de rendre au système les ressources utilisées aussi tôt qu'on sait qu'on en aura plus besoin.
    Il fut une époque où cela était vital, car la mémoire était une ressource rare, mais maintenant c'est simplement "plus propre" et cela évite certains bugs un peu sournois.

    r n'est pas une table, c'est un objet de type Recordset (en français : Ensemble d'enregistrements), qui te permet d'accéder à tes données (table ou requête) et qui te permet de les parcourir dans un bout de code. Il n'a pas d'existence réelle en dehors du code qui l'utilise. On peut lui donner un nom plus explicite comme rDonnes ou rClient ou rstVente si cela rend le code plus compréhensible.

    Si tu n'utilises pas de recordset pour parcourir tes données, tu peux utiliser une requête comme source de d'exportation vers Excel avec la commande DoCmd.TransfretSpreadSheet.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Effectivement je ne libère jamais l'espace mémoire.

    Par contre je sais ce qu'est un objet Recordset, et j'en utilise bien pour parcourir mes données

    J'ai intégré ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim sql As String
    sql = "SELECT * FROM [D_Base_en_cours] ORDER BY [D_Base_en_cours].[Id_prêt];"
    Set b_encours = db.OpenRecordset(sql, dbOpenDynaset)
    J'ai pas de bug, mais toujours mon problème de tri.

    Pour info, voici une partie de mon code :
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    Option Compare Database
     
    ' date_calcul As Date, _
     
    Sub Flux_décès( _
        Taux_de_prime As Double, _
        choix_scenario As String, _
        choix_actu As Integer, _
        choix_rachat As Integer, _
        tx_choc_THTF As Double, _
        tx_choc_cat As Double, _
        tx_choc_rachat As Double, _
        tx_choc_rachat_mass As Double, _
        tx_frais_sin As Double, _
        tx_choc_exp As Double, _
        tx_choc_exp_infl As Double _
        )
    ' Procédure de calcul des flux de PRC décès
     
    ' variable d'input de la procédure Flux_décès :
     
    ' date_calcul : date de calcul
     
    ' Taux_de_prime : taux de la prime d'assrance
    ' choix scenario : choix du scenario  de choc, le choix est pris dans le formulaire
    ' choix_actu : choix d'actualiser (=1) ou pas (=0) les flux
    ' tx_choc_THTF : tx de choc des qx pour les chocs de mortalité et de longévité
    ' tx_choc_cat : tx de choc catastrophe
    ' tx_choc_rachat : tx du choc de rachat up ou down
    ' tx_choc_rachat_mass : tx de rachat de masse (appliqué sur la première année)
    ' tx_frais_sin : taux de frais de sinistres
     
    ' Déclaration des variables utilisées
    Dim Montant_emprunté As Double      ' capital initial
    Dim Durée_du_prêt As Long           ' duree de l'emprunt à l'origine du contrat (en mois)
    Dim Ancienneté As Long              ' anciennete dans le prêt (en mois)
    Dim Taux_du_prêt As Double          ' tx_int : tx d'intérêt du prêt (proportionnel)
    Dim Taux_de_prime_m As Double       ' tx de la prime d'assurance /12
    Dim Date_souscription As String     ' date de la souscription du contrat
    Dim Id_pret As Long                 ' numéro d'identification du prêt
    Dim Id_assure As Long               ' numéro d'identification de l'assuré
    Dim Nb_têtes As Long                ' nb têtes sur le prêt (1 ou 2)
    Dim date_naissance As String        ' date de naissance
    Dim Age_x As Long                   ' age de la tête x à la date de calcul en années
    Dim Sexe_x As String                ' sexe de la tête x
    Dim Quotité_x As Double             ' quotite de la tête x
    Dim Age_y As Long                   ' age de la tête y à la date de calcul en années
    Dim Sexe_y As String                ' sexe de la tête y
    Dim Quotité_y As Double             ' quotite de la tête y
    Dim f As Double                     ' variable utilisé pour cumulé les mois en année
    Dim periode As Long                 ' periode : periode de détachement du flux
    Dim i As Long                       ' opérateur d'incrémentation
     
    ' Chargements des tables d'inputs et création des tables de résultats
    Call Chargements(choix_scenario, tx_choc_THTF, tx_choc_cat, tx_choc_rachat, choix_actu, choix_rachat)
    If TableExist("R_L_" & choix_scenario & "_VAPr") = True Then DeleteTable ("R_L_" & choix_scenario & "_VAPr")
    Call Creer_table("R_L_" & choix_scenario & "_VAPr")
    If TableExist("R_L_" & choix_scenario & "_VAPé") = True Then DeleteTable ("R_L_" & choix_scenario & "_VAPé")
    Call Creer_table("R_L_" & choix_scenario & "_VAPé")
    If TableExist("R_L_" & choix_scenario & "_Frais") = True Then DeleteTable ("R_L_" & choix_scenario & "_Frais")
    Call Creer_table("R_L_" & choix_scenario & "_Frais")
     
    Dim db  As dao.Database
    Dim r As dao.Recordset
    Dim é As dao.Recordset
    Dim frais As dao.Recordset
    Dim b_encours As dao.Recordset
    Set db = CurrentDb
    Set r = db.OpenRecordset("R_L_" & choix_scenario & "_VAPr")
    Set é = db.OpenRecordset("R_L_" & choix_scenario & "_VAPé")
    Set frais = db.OpenRecordset("R_L_" & choix_scenario & "_Frais")
     
     
     
     
     
    Dim sql As String
    sql = "SELECT * FROM [D_Base_en_cours] ORDER BY [D_Base_en_cours].[Id_prêt];"
    Set b_encours = db.OpenRecordset(sql, dbOpenDynaset)
     
     
     
     
     
     
    Taux_de_prime_m = Taux_de_prime / 12
     
    ' Enregistrement des flux assureur dans la table résultat (prestations et frais de gestion de sinistres)
    b_encours.MoveFirst
    Do
     
        frais.AddNew
        r.AddNew
     
        Id_prêt = b_encours.Fields(0)
        Date_souscription = b_encours.Fields(1)
        Montant_emprunté = b_encours.Fields(2)
        Durée_du_prêt = b_encours.Fields(3)
        Ancienneté = b_encours.Fields(4)
        Taux_du_prêt = b_encours.Fields(5)
        Nb_têtes = b_encours.Fields(6)
        Age_x = b_encours.Fields(7)
        Sexe_x = b_encours.Fields(8)
        Quotité_x = b_encours(9)
        Age_y = b_encours.Fields(10)
        Sexe_y = b_encours.Fields(11)
        Quotité_y = b_encours(12)
     
        Mensualite = Echeance(Montant_emprunté, Durée_du_prêt, Taux_du_prêt / 12)
     
        ' si scénario = choc catastrophe, les 3 lignes qui suivent recalculent les table de survie
        If choix_scenario = "choc_cat" Then
            Call table_survie_cat(Sexe_x, Age_x, tx_choc_cat)
            If Nb_têtes = 2 Then Call table_survie_cat(Sexe_y, Age_y, tx_choc_cat)
        End If
     
        ' si  scénario = choc rachat mass, les 3 lignes qui suivent recalculent les table de loi de rachat
        If choix_scenario = "choc_rachatmass" Then
            Call loi_rachat_mass(Ancienneté, tx_choc_rachat_mass)
        End If
     
        r.Fields(0) = Id_prêt
        r.Fields(1) = Year(Date_souscription)
        r.Fields(2) = Montant_emprunté
        r.Fields(3) = Durée_du_prêt
        r.Fields(4) = Ancienneté
        r.Fields(5) = Taux_du_prêt
        r.Fields(6) = Mensualite
        r.Fields(7) = Nb_têtes
        r.Fields(8) = Age_x
        r.Fields(9) = Sexe_x
        r.Fields(10) = Quotité_x
        r.Fields(11) = Age_y
        r.Fields(12) = Sexe_y
        r.Fields(13) = Quotité_y
        r.Fields(14) = Taux_de_prime
        r.Fields(15) = choix_scenario
        If choix_actu = 1 Then r.Fields(16) = "oui" Else r.Fields(16) = "non"
        If choix_rachat = 1 Then r.Fields(17) = "oui" Else r.Fields(17) = "non"
        r.Fields(18) = Total_Flux_VAPr_dc(Montant_emprunté, Durée_du_prêt, Taux_du_prêt, Ancienneté, Nb_têtes, _
                       Age_x, Sexe_x, Quotité_x, Age_y, Sexe_y, Quotité_y)
     
        frais.Fields(0) = Id_prêt
        frais.Fields(1) = Year(Date_souscription)
        frais.Fields(2) = Montant_emprunté
        frais.Fields(3) = Durée_du_prêt
        frais.Fields(4) = Ancienneté
        frais.Fields(5) = Taux_du_prêt
        frais.Fields(6) = Mensualite
        frais.Fields(7) = Nb_têtes
        frais.Fields(8) = Age_x
        frais.Fields(9) = Sexe_x
        frais.Fields(10) = Quotité_x
        frais.Fields(11) = Age_y
        frais.Fields(12) = Sexe_y
        frais.Fields(13) = Quotité_y
        frais.Fields(14) = Taux_de_prime
        frais.Fields(15) = choix_scenario
        If choix_actu = 1 Then frais.Fields(16) = "oui" Else frais.Fields(16) = "non"
        If choix_rachat = 1 Then frais.Fields(17) = "oui" Else frais.Fields(17) = "non"
     
        ' Flux engagements assureur en années
        k = 0
        l = 1
        f = 0
        total_frais = 0
        For i = 1 To Durée_du_prêt - Ancienneté + 12
            If k = 12 Then
                r.Fields(18 + l) = f
                frais.Fields(18 + l) = f * tx_frais_sin * (1 + tx_choc_exp) * (1 + tx_choc_exp_infl) ^ l
                total_frais = total_frais + f * tx_frais_sin * (1 + tx_choc_exp) * (1 + tx_choc_exp_infl) ^ l
                f = 0
                l = l + 1
                k = 0
            End If
        f = f + Flux_VAPr_dc(Montant_emprunté, Durée_du_prêt, Taux_du_prêt, Ancienneté, Nb_têtes, _
            Age_x, Sexe_x, Quotité_x, Age_y, Sexe_y, Quotité_y, i)
        k = k + 1
        Next i
        frais.Fields(18) = total_frais
        r.Update
        frais.Update
        b_encours.MoveNext
     
    Loop Until b_encours.EOF
     
    ' Enregistrement des flux assurés dans la table résultat
    b_encours.MoveFirst
    Do
     
        é.AddNew
     
        Id_prêt = b_encours.Fields(0)
        Date_souscription = b_encours.Fields(1)
        Montant_emprunté = b_encours.Fields(2)
        Durée_du_prêt = b_encours.Fields(3)
        Ancienneté = b_encours.Fields(4)
        Taux_du_prêt = b_encours.Fields(5)
        Nb_têtes = b_encours.Fields(6)
        Age_x = b_encours.Fields(7)
        Sexe_x = b_encours.Fields(8)
        Quotité_x = b_encours(9)
        Age_y = b_encours.Fields(10)
        Sexe_y = b_encours.Fields(11)
        Quotité_y = b_encours(12)
     
        ' si le scénario est le choc catastrophe, les 3 lignes qui suivent recalculent les table de survie
        If choix_scenario = "choc_cat" Then
            Call table_survie_cat(Sexe_x, Age_x, tx_choc_cat)
        End If
        ' si le scénario est le choc rachat mass, les 3 lignes qui suivent recalculent les table de loi de rachat
        If choix_scenario = "choc_rachatmass" Then
            Call loi_rachat_mass(Ancienneté, tx_choc_rachat_mass)
        End If
     
        é.Fields(0) = Id_prêt
        é.Fields(1) = Year(Date_souscription)
        é.Fields(2) = Montant_emprunté
        é.Fields(3) = Durée_du_prêt
        é.Fields(4) = Ancienneté
        é.Fields(5) = Taux_du_prêt
        é.Fields(6) = Mensualite
        é.Fields(7) = Nb_têtes
        é.Fields(8) = Age_x
        é.Fields(9) = Sexe_x
        é.Fields(10) = Quotité_x
        é.Fields(11) = Age_y
        é.Fields(12) = Sexe_y
        é.Fields(13) = Quotité_y
        é.Fields(14) = Taux_de_prime
        é.Fields(15) = choix_scenario
        If choix_actu = 1 Then é.Fields(16) = "oui" Else é.Fields(16) = "non"
        If choix_rachat = 1 Then é.Fields(17) = "oui" Else é.Fields(17) = "non"
        é.Fields(18) = Total_Flux_VAPé(Montant_emprunté, Durée_du_prêt, Ancienneté, Taux_de_prime_m, Nb_têtes, _
                       Age_x, Sexe_x, Age_y, Sexe_y)
     
        ' Flux engagements assurés en années
        k = 0
        l = 1
        f = 0
        For i = 1 To Durée_du_prêt - Ancienneté + 12
            If k = 12 Then
                é.Fields(18 + l) = f
                f = 0
                l = l + 1
                k = 0
            End If
            f = f + Flux_VAPé(Montant_emprunté, Durée_du_prêt, Ancienneté, Taux_de_prime_m, Nb_têtes, _
                Age_x, Sexe_x, Age_y, Sexe_y, i)
            k = k + 1
        Next i
     
        é.Update
        b_encours.MoveNext
     
    Loop Until b_encours.EOF
     
    Application.RefreshDatabaseWindow
     
    End Sub

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Je te suggère fortement d'utiliser les noms des champs plutôt que le numéro.

    Si jamais tu change l'ordre de tes champs tu sera es obligé de modifier ton code. [CODEinline]r![TonChamp]=TaValeur[/CODEiniline] ou [CODEinline]r.fields("TonChamp")=TaValeur[/CODEiniline] est plus facile à comprendre et à débugger et ne dépend pas de l'ordre de tes données.

    Pour ton problème d'ordre essaye cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim sql As String
    sql = "SELECT * FROM [D_Base_en_cours] ORDER BY [D_Base_en_cours].[Id_prêt];"
    Set b_encours = db.OpenRecordset(sql, dbOpenDynaset)
     
    do while not b_encours.eof()
       debug.print b_encours![Id_prêt]
    loop
    Est-ce que tes données sont bien affichées dans l'ordre de tes prêts ?

    Si non, je n'ai aucune idée d'où vient le problème.

    Si oui, les données sont sans doute "dé-triées" plus bas dans ton code.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup marot_r.
    J'ai essayé le code et les données sont correctement triées selon l'identifiant du prêt.
    Je vais tenter de comprendre où elles sont mises dans le désordre dans la suite du programme.
    Mais c'est pas gagné ...

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    J'ai avancé un peu dans mes recherches. En intégrant le code suivant en fin de programme, juste avant le "Application.RefreshDatabaseWindow" :

    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
    r.MoveFirst
    For i = 1 To 18
        Debug.Print r.Fields(0)
        r.MoveNext
    Next
     
    Dim sql As String
    sql = "SELECT * FROM [R_L_scénario central_VAPr] ORDER BY [R_L_scénario central_VAPr].[Id_prêt];"
    Set r = db.OpenRecordset(sql, dbOpenDynaset)
     
    r.MoveFirst
    For i = 1 To 18
        Debug.Print r.Fields(0)
        r.MoveNext
    Next

    Je constate que le recordset r est bien triée aprés, par contre ma table dans access ne l'est pas. C'est comme si la table triée r n'existait que dans le "buffer", mais n'était pas enregistrée dans ma base ensuite.

    J'ai essayé de rajouter un "r.update" après le tri mais ça "buggue" (le update ne fonctionne sans doute qu'avec "Edit" et "Addnew")

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Je suis toujours sur le même problème de tri.

    J'ai tenté une nouvelle approche via le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'tri de la table VAPr
    Set qdef = CurrentDb.CreateQueryDef("MyQuery", "SELECT * FROM [R_L_" & choix_scenario & "_VAPr] ORDER BY [R_L_" & choix_scenario & "_VAPr].[Id_prêt] DESC;")
    DoCmd.OpenQuery "MyQuery"
    DoCmd.CopyObject , "R_L_" & choix_scenario & "_VAPrtemp", acTable, "MyQuery"
    DoCmd.Close acQuery, "MyQuery"
    DeleteTable ("R_L_" & choix_scenario & "_VAPr")
    DoCmd.CopyObject , "R_L_" & choix_scenario & "_VAPr", acTable, "R_L_" & choix_scenario & "_VAPrtemp"
    DeleteTable ("R_L_" & choix_scenario & "_VAPrtemp")
    DoCmd.DeleteObject acQuery, "MyQuery"
    La requête semble fonctionner, par contre les données sont toujours, parfois, dans le désordre dans ma table de résultat R_L_" & choix_scenario & "_VAPr.
    Est-ce la commande CopyObject qui ne marche pas entre une query et une table ?
    Est-ce que quelqu'un pourrait m'aider à solutionner mon problème ?
    Je suis un peu perdu

  18. #18
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Tant que tu utilisera une table comme source de tes données pour l'exportation tu risques le problème. Il faut utiliser une requête avec un ordre de tri.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    J'ai essayé avec le code suivant.
    Il arrive que R_essai soit dans le désordre comme il arrive que R_L_scénario_central_VAPr soit dans le désordre (pas forcément les deux en même temps).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call Creer_table("R_essai")
    db.Execute " INSERT INTO R_essai SELECT R_L_scénario_central_VAPr.* from R_L_scénario_central_VAPr ORDER BY R_L_scénario_central_VAPr.Id_prêt;"
    Je désespère un peu là ...

  20. #20
    Futur Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2015
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Janvier 2015
    Messages : 31
    Points : 9
    Points
    9
    Par défaut
    Personne ne voit comment résoudre mon problème ?
    Est ce un bug d'Access ?
    N'y a t il rien a faire ?

Discussions similaires

  1. transfert de saisies vers fichier xls
    Par titi31 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/06/2009, 16h33
  2. exporter table vers fichier txt
    Par joe370 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/05/2009, 12h08
  3. transfert données fichier .bat vers fichier .xls
    Par majothi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/04/2009, 06h35
  4. [Access]lier tables à des Fichiers xls
    Par PiliSql dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/02/2008, 10h40
  5. [WD9] Exporter vers fichier XLS
    Par cactus666 dans le forum WinDev
    Réponses: 1
    Dernier message: 22/10/2007, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo