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 :

Récupérer valeur champs, parcourir enregistrements


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut Récupérer valeur champs, parcourir enregistrements
    Bonjour!
    Je souhaite faire une manip mais n'arrive pas à la coder correctement

    Je suis en train de créer une base pour la gestion de rapports de choix et bloque sur la consultation des sous traitants ("SST").
    Un sous-sous-formulaire "frm_consult2" permet de les sélectionner à partir d'une liste déroulante qui contient le nom et leur adresse mail (extraits d'une table contacts SST) mais n'affiche que le nom et affiche le tout sous forme de table de données (permet d'en ajouter autant que voulu pour un même N°_Avis) --> voir photo à la fin pour mieux comprendre
    Il y a un bouton "envoi en consultation" qui fait appel à une fonction permettant d'envoyer un mail tout fait.

    Le problème :
    Récupérer tous les mails des SST de la table pour ce N°_Avis depuis le sous-sous-formulaire frm_consult2 pour les appeler en tant que destinataires dans la fonction mail

    J'ai essayé plusieurs façons différentes pour coder ça.
    - 1e très basique : en rouge
    cf tentative dans VBA Form_frm_consultation -> vers la fin de Private Sub btn_envoiConsultation_Click().

    - 2e plus complexe basée en partie sur cet algorithme avec un Recordset : en vert
         Tant que N°_Avis (frm_rapportChoix2) = N°_Avis(frm_infosAvis)
              Faire
                destSST = destSST + SST.Column(2) + « ; »
                Passage à l’enregistrement suivant de frm_consult2
         Fin tant que
    Problème de cet algo ? le frm_rapportChoix2 affiché dans frm_consultation est déjà filtré selon le N°_Avis en cours on peut
    Il y avait 3 SST pour l'avis n°5 mais ça a affiché le nom des deux premiers uniquement et quel que soit l'enregistrement N°_Avis sur lequel je me trouve, ça ne met soit que ceux de l'avis n°5 soit rien.
    Je ne comprends pas le schéma du problème.

    Please
    Ca fait 4 jours que je galère sur ce problème à essayer plein de choses différentes mais je reste bloquée et la deadline est très proche.
    N'hésitez pas pour plus de détails!

    Merci d'avance!

    NB : toutes les tables sont liées entre elles par le N°_Avis clé primaire partout sauf dans tbl_retourConsultation sur laquelle est basée le frm_consult2

    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
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    '-------------------------------------
    'Envoi mail conslutation
    '-------------------------------------
    
    Private Sub btn_envoiConsultation_Click()
    
    'Envoi mail consultation
    
        Dim sujetMailSST As String
        Dim bodyMailSST As String
        Dim destSST As String
    
        If IsNull(N°_Avis) Then
            MsgBox "Le champ N°Avis est vide.", vbOKOnly, "Envoi en chiffrage"
        Else
            
            'Mail consultation SST
            sujetMailSST = "DEMANDE DE CHIFFRAGE N°" & N°_Avis
                      
            'Body mail HTML----------------
            
            ' Tableau livrables Conception----------------------------------------------------------
            tbl_livrablesHTML = "<h3>Livrables</h3> <h4>Conception</h4> <table style=""width:40%"">"
            
            ' Case Avant projet
            If Me.Parent.Avant_Projet.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Avant-projet</td></tr>"
            
            ' Case Etudes 3D
            If Me.Parent.Etudes_3D.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Etudes 3D</td></tr>"
            
            ' Case Etudes 2D
            If Me.Parent.Etudes_2D.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Etudes 2D</td></tr>"
            
            ' Case Note de calcul
            If Me.Parent.Note_de_calcul.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Note de calcul</td></tr>"
            
            ' Case Notice d'utilisation
            If Me.Parent.Notice_d_utilisation.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Notice d'utilisation</td></tr></table>"
            
            ' Fin tableau livrables conception
            
            '-------------------------------
            ' Tableau livrables Réalisation
            tbl_livrablesHTML = tbl_livrablesHTML & " <h4>Réalisation</h4> <table style=""width:40%"">"
            
            ' Case Fabrication
            If Me.Parent.Fabrication.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Fabrication</td></tr>"
            
            ' Case Certificat matière
            If Me.Parent.Certificat_matière.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Certificat matière</td></tr>"
            
            ' Case Certificat de traitement matière
            If Me.Parent.Certificat_de_traitement_matière.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Certificat de traitement matière</td></tr>"
            
            ' Case Installation/Montage
            If Me.Parent.Installation_Montage.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Installation/Montage</td></tr>"
            
            ' Case Rapport de mesure (pièces unitaires)
            If Me.Parent.Rapport_de_mesure__pièces_unitaires_.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Rapport de mesure (pièces unitaires)</td></tr>"
            
            ' Case Rapport de mesure (outil monté)
            If Me.Parent.Rapport_de_mesure__outil_monté_.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Rapport de mesure (outil monté)</td></tr>"
            
            ' Case Rapport de mesure LASER
            If Me.Parent.Rapport_de_mesure_LASER.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Rapport de mesure LASER</td></tr>"
            
            ' Case Essai en charge
            If Me.Parent.Essai_en_charge.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Essai en charge</td></tr></table>"
            
            ' Fin tableau livrables réalisation
            
            '-------------------------------
            ' Tableau livrables Déclaration
            tbl_livrablesHTML = tbl_livrablesHTML & " <h4>Déclaration</h4> <table style=""width:40%"">"
            
            ' Case Déclaration de conformité
            If Me.Parent.Déclaration_de_conformité.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Déclaration de conformité</td></tr>"
            
            ' Case Déclaration CE
            If Me.Parent.Déclaration_CE.Value = True Then
                tbl_livrablesHTML = tbl_livrablesHTML & "<td style=""text-align:center;""> X </td>" 'Case cochée
            Else
                tbl_livrablesHTML = tbl_livrablesHTML & "<td> </td>" 'Case non cochée
            End If
            tbl_livrablesHTML = tbl_livrablesHTML & "<td>Déclaration CE</td></tr></table>"
            
            ' Fin tableau livrables Déclaration
    
            bodyMailSST = "<head><style>table, th, td {border: 1px solid black;}</style></head><body> <h1>DEMANDE DE CHIFFRAGE</h1> <p>N°Avis : " & N°_Avis
            bodyMailSST = bodyMailSST & "<br \> Date de la demande : " & Date_envoi_consultation & " </p> <p> Madame, Monsieur, </p> <p> Voici une demande de chiffrage concernant : "
            bodyMailSST = bodyMailSST & Me.Parent.Nom_OT.Value & "<br \> Outil N° : " & Me.Parent.N°_OT.Value & "<br \> Demandé par : STELIA <br \> Contact STELIA : "
            bodyMailSST = bodyMailSST & Me.Parent.Contact_client.Column(1) & " " & Me.Parent.Contact_client.Column(2) & "<br \> Date limite de retour de consultation : "
            bodyMailSST = bodyMailSST & Date_réponse_limite_SST & "</p>" & tbl_livrablesHTML & "<p> Lien de téléchargement des documents associés : "
            bodyMailSST = bodyMailSST & Lien_téléchargement_données & "<br \> Remarque : " & Rq_mail_SST & "</p> <p> Cordialement, </p> </body>"
                         
            'Définition destinataires
            'destSST = Forms.frm_consultation.frm_consult2.Form.SST.Column(2))
                                
            Dim Enr As Recordset
            Set Enr = CurrentDb.OpenRecordset("tbl_retourConsultation")
            While Enr("N° Avis") = 5  ---> essayé avec = Me.Parent.N°_Avis.Value pour avoir l'enregistrement sur le N°_Avis actif mais erreur
                destSST = destSST & Enr("SST") & ";"     ---> essayé avec SST.Column(2) pour avoir le mail mais erreur
                Enr.MoveNext
            Wend
            Enr.Close
                         
            EnvoyerEmail sujetMailSST, destSST, bodyMailSST
        End If
        
    'Affecte la date du click sur le bonton à date envoi en consultation
    Date_envoi_consultation = Now()
    
    End Sub
    
    
    '-------------------------------------
    'Envoi mail
    '-------------------------------------
    
    Sub EnvoyerEmail(ByVal Sujet As String, ByVal Destinataire, ByVal ContenuEmail As String, Optional ByVal PieceJointe As String)
    'par Excel-Malin.com ( https://excel-malin.com )
        
    On Error GoTo EnvoyerEmailErreur
        
    'définition des variables
    Dim oOutlook As Outlook.Application
    Dim WasOutlookOpen As Boolean
    Dim oMailItem As Outlook.MailItem
    Dim Body As Variant
        
    Body = ContenuEmail
        
        'vérification si le Contenu du mail n'est pas vide. Si oui, email n'est pas envoyé. Si vous voulez pouvoir envoyer les email vides, mettez en commentaire les 4 lignes de code qui suivent.
        If (Body = False) Then
            MsgBox "Mail non envoyé car vide", vbOKOnly, "Message"
            Exit Sub
        End If
            
        'préparer Outlook
        PreparerOutlook oOutlook
        Set oMailItem = oOutlook.CreateItem(0)
            
        'création de l'email
        With oMailItem
            .BCC = Destinataire
            .Subject = Sujet
               
            'CHOIX DU FORMAT
            '----------------------
            'email formaté comme texte
                '.BodyFormat = olFormatRichText
                '.Body = Body
                    
                'OU
                    
            'email formaté comme HTML
                .BodyFormat = olFormatHTML
                .HTMLBody = "<html>" & Body & "</html>"
           '----------------------
                
           If PieceJointe <> "" Then .Attachments.Add PieceJointe
        
           .Display   '<- affiche l'email (si vous ne voulez pas l'afficher, mettez cette ligne en commentaire)
           '.Save      '<- sauvegarde l'email avant l'envoi (pour ne pas le sauvegarder, mettez cette ligne en commentaire)
           '.Send      '<- envoie l'email (si vous voulez seulement préparer l'email et l'envoyer manuellement, mettez cette ligne en commentaire)
        End With
           
        'nettoyage...
        If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
        If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
            
        Exit Sub
        
    EnvoyerEmailErreur:
        If (Not (oMailItem Is Nothing)) Then Set oMailItem = Nothing
        If (Not (oOutlook Is Nothing)) Then Set oOutlook = Nothing
          
        MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur"
    End Sub
    
    Private Sub PreparerOutlook(ByRef oOutlook As Object)
    'par Excel-Malin.com ( https://excel-malin.com )
    'Ce code vérifie si Outlook est prêt à envoyer des emails... Et s'il ne l'est pas, il le prépare.
    
    On Error GoTo PreparerOutlookErreur
    
    On Error Resume Next
        'vérification si Outlook est ouvert
        Set oOutlook = GetObject(, "Outlook.Application")
            
        If (Err.Number <> 0) Then 'si Outlook n'est pas ouvert, une instance est ouverte
            Err.Clear
            Set oOutlook = CreateObject("Outlook.Application")
        Else    'si Outlook est ouvert, l'instance existante est utilisée
            Set oOutlook = GetObject("Outlook.Application")
            oOutlook.Visible = True
        End If
        Exit Sub
        
    PreparerOutlookErreur:
        MsgBox "Une erreur est survenue lors de l'exécution de PreparerOutlook()..."
    End Sub
    Nom : frmconsult.png
Affichages : 395
Taille : 115,4 Ko

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonjour,
    il faut éviter de changer les couleurs du code: cela le rend illisible quand il ne fait pas mal aux yeux, on perd également la colorisation standard liée au type de code.
    Fait plutôt référence au numéro de ligne situé à gauche.
    Comment peut-on connaitre le numéro de ligne ? tout simplement en utilisant le bouton "Prévisualisation du message" et en parcourant le code balisé.

    Pour ce qui concerne ton problème:
    Le problème :
    Récupérer tous les mails des SST de la table pour ce N°_Avis depuis le sous-sous-formulaire frm_consult2 pour les appeler en tant que destinataires dans la fonction mail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim Enr As Recordset        
            Set Enr = CurrentDb.OpenRecordset("tbl_retourConsultation")
            While Enr("N° Avis") = 5  ---> essayé avec = Me.Parent.N°_Avis.Value pour avoir l'enregistrement sur le N°_Avis actif mais erreur
                destSST = destSST & Enr("SST") & ";"     ---> essayé avec SST.Column(2) pour avoir le mail mais erreur
                Enr.MoveNext
            Wend
    Le souci avec l'instruction: While Enr("N° Avis") = 5, c'est que si elle n'est pas vraie dès le premier enregistrement (cela n'aurait pas été le cas avec <=5), aucune chance de rentrer dans la boucle. Il faut donc utiliser des solutions plus simples.

    il est plus simple d'utiliser un Recordset basé sur la table tbl_retourConsultation (comme tu as fait), plutôt que lire la colonne 2 d'une liste déroulante.
    je commencerai en premier lieu par filtrer les enregistrements concernés par le N°_Avis, inutile d'aller chercher celui du sous-sous-formulaire, autant utiliser celui du formulaire principal.

    Pour le code qui suis, je pars du principe qu'il n'y a pas de souligné (_) entre N° et Avis car on s'y perd en te lisant: parfois, il y en a, parfois, pas:
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Enr As Recordset
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis]" & Me.[N° Avis])
    ensuite tu peux lire le Recordset jusqu'à la fin:
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Do Until Enr.EOF
        destSST = destSST & Enr("SST") & ";"
        Enr.MoveNext
    Loop
    C'est tout.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    Merci pour votre réponse rapide!

    il faut éviter de changer les couleurs du code
    Noté! Je n'avais pas fait le lien entre le changement de couleur de ne serai-ce qu'un élément et la perte de tout le reste

    Le souci avec l'instruction: While Enr("N° Avis") = 5, c'est que si elle n'est pas vraie dès le premier enregistrement (cela n'aurait pas été le cas avec <=5), aucune chance de rentrer dans la boucle. Il faut donc utiliser des solutions plus simples.
    Effectivement je n'avais pas fait attention à cela. Ca se voit en déroulant dans la tête le processus pas à pas.

    Pour le code qui suis, je pars du principe qu'il n'y a pas de souligné (_) entre N° et Avis car on s'y perd en te lisant: parfois, il y en a, parfois, pas:
    En fait, le champ numéro d'avis est noté N° Avis mais dans la plupart des instructions le _ est requis sinon il ne comprend pas. Sauf le While Enr("N° Avis") = 5 visiblement où ça râlait si il y avait le _.
    J'avais cru comprendre que entre crochets le remplissage des espaces par _ n'est pas nécessaire mais sinon oui.



    J'ai intégré votre code tel quel à la place de ce qui était écrit précédemment mais -Erreur d'exécution 3075 : Erreur de syntaxe (opérateur absent) dans l'expression "[N° Avis]1"- s'affiche sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis]" & Me.[N° Avis])

    J'ai donc tenté de la modifier de différentes façons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N°_Avis]" & Me.[N°_Avis])
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where N°_Avis" & Me.N°_Avis)
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N°_Avis] = Me.[N°_Avis]")
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where N°_Avis", Me.N°_Avis)
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis]", Me.[N° Avis])
    Ligne 1 : Erreur d'exécution 3075 : Erreur de syntaxe (opérateur absent) dans l'expression "[N° Avis]1"
    Ligne 2 : Erreur d'exécution 3061 : Erreur de syntaxe (opérateur absent) trop peu de paramètres. 1 attendu.
    Ligne 3 : Erreur d'exécution 3061 : Erreur de syntaxe (opérateur absent) trop peu de paramètres. 2 attendu.
    Ligne 4 et 5 : Proposition basée sur la lecture de la forme de OpenRecordset(Name As String, [Type], [Options], [LockEdit]) As Recordset
    Nom : error acces.PNG
Affichages : 393
Taille : 18,9 Ko

    Pour confirmer que j'ai bien compris le rôle de cette ligne : elle va sélectionner dans tbl_retourConsultation les SST qui correspondent au N° Avis commun entre cette même table et celui de l'enregistrement où je me trouve?
    Par contre, cela ne permet de récupérer que les noms des SST, il n'est pas possible de faire appel à la colonne 2 de la liste déroulante qui les contient déjà? Sinon il faut aller parcourir la tbl_contactsSST et récupérer les mails des enregistrements correspondant à chaque nom ce qui est très peu efficace et lent

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonsoir,
    oups ! désolé pour ce "petit" oubli:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis] = " & Me.[N° Avis])
    Par contre, cela ne permet de récupérer que les noms des SST, il n'est pas possible de faire appel à la colonne 2 de la liste déroulante qui les contient déjà? Sinon il faut aller parcourir la tbl_contactsSST et récupérer les mails des enregistrements correspondant à chaque nom ce qui est très peu efficace et lent
    comment peux-tu savoir que c'est lent si tu n'as pas essayé ?

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    En fait, le champ numéro d'avis est noté N° Avis mais dans la plupart des instructions le _ est requis sinon il ne comprend pas. Sauf le While Enr("N° Avis") = 5 visiblement où ça râlait si il y avait le _.
    J'avais cru comprendre que entre crochets le remplissage des espaces par _ n'est pas nécessaire mais sinon oui.
    inutile de fabuler: le champ se nomme N° Avis avec un espace et c'est bien son orthographe dans la table.
    mais dans la plupart des instructions le _ est requis sinon il ne comprend pas
    L'explication es tout autre: si on ne respecte pas les règles de nommage, Access est obligé de faire avec: à la création des modules de classe dans VBA (Procédure événementielle), il remplace les espaces et certains caractères réservés par les _ contenu dans le nom des contrôles (mais jamais dans le nom du source contrôle).

    Enr("N° Avis") fait référence à un champ de la table dans un recordset, il est donc normal de garder l'orthographe d'origine.

    Pour résumé, Me.N°_Avis concerne uniquement la référence au contrôle dans le formulaire dans VBA.
    Par contre la source contrôle peut éventuellement se référencer dans VBA avec l'orthographe d'origine (mais avec le ! et les []): Me![N° Avis] mais le plus simple c'est de ne pas mettre des espaces dans le nom des objets, car ce n'est pas de la littérature c'est du code.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    Bonjour!

    Désolée de vous embêter encore mais ça ne fonctionne toujours pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis] = " & Me.[N° Avis])
    Donne l'erreur : Erreur d'exécution 3464. Type de données incompatible dans l'expression du critère.

    OpenRecordset prend en premier argument un String donc tout devrait être entre " " mais si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis] = & Me.[N° Avis]")
    Une erreur s'affiche disant qu'il manque 1 paramètre.

    Tous les champs N° Avis sont en texte court donc ça ne vient pas de là.

    J'ai aussi essayé avec Me.Parent.N°_Avis.Value comme fait ailleurs pour appeler des éléments du formulaire principal depuis un sous-formulaire mais ça donne aussi erreur d'incompatibilité de types de données.

    Je vous mets ci-dessous la base en zippé peut être que ça peut être plus simple pour voir d'où vient le problème puisque je n'arrive pas à l'analyser moi même et c'est pas faute d'avoir essayé
    Cette partie se trouve dans Form_frm_consultation vers la fin du premier Sub juste avant un bloc de 7 lignes de code mis en commentaire.

    Rapport_de_choix_IndZ.rar

    comment peux-tu savoir que c'est lent si tu n'as pas essayé ?
    Effectivement. Je me suis fait cette réflexion car cela semble effectuer une tâche pour récupérer une information qui devrai déjà être directement disponible. Mais vu que visiblement elle ne l'est pas, pas le choix

    Concernant votre message suivant.
    Merci, je comprends mieux maintenant. Les noms des champs mis dans les tables servent automatiquement d'étiquette pour les champs dans les formulaires et vu que cette base va servir d'interface pour le traitement d'informations c'est plus clair pour l'utilisateur d'avoir de la "littérature". J'aurai dû modifier les noms dans les paramètres pour pouvoir les appeler sans espaces tout en gardant des étiquettes "jolies" mais je n'y ai pas pensé. J'ai découvert le monde merveilleux de VBA et Access il y a à peine 2 mois avec pour mission de créer cet outil ducoup j'ai fait comme j'ai pu en apprenant au fur et à mesure

  7. #7
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    Si [N° Avis] est de type TEXTE, alors ceci fonctionnera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis]'" & Me.[N° Avis] & "'") ' à utiliser tel quel avec copier/coller

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    Zekraoui_Jakani
    Toujours pas
    Erreur d'exécution 3075 : Erreur de syntaxe (opérateur absent) dans l'expression <<[N° Avis]'1'>>
    (J'ai bien fait un copié collé tel quel)

  9. #9
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Points : 2 491
    Points
    2 491
    Par défaut
    Pardon; une erreur de frappe de ma part (j'ai oublié un signe "=" dans l'expression) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'") ' à utiliser tel quel avec copier/coller

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    OUIIIII ça marche!!
    Je me sens bête de ne pas avoir vu qu'il manquait le =
    tee_grandbois & Zekraoui_Jakani merci beaucoup!
    Il ne me reste plus qu'à récupérer les adresses mail correspondantes dans tbl_contactsSST j'espère que je vais pas me rater là dessus
    Juste pour confirmer la méthode déjà : il faut faire un autre Recordset du même type mais cette fois en faisant la concordance entre les enregistrements du Recordset Enr qu'on avait et les SST de la table contacts et en enregistrer les enregistrements correspondants de la colonne mail?

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    Et voilà pour ceux que ça intéresse!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            'Définition destinataires
            Dim Enr As Recordset
            Dim EnrMail As Recordset
            Set Enr = CurrentDb.OpenRecordset("select [SST] from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'")
     
            Do Until Enr.EOF
                Set EnrMail = CurrentDb.OpenRecordset("select [Mail] from tbl_contactsSST where [SST] ='" & Enr("SST") & "'")
                destSST = destSST & EnrMail("Mail") & ";"
                Enr.MoveNext
            Loop

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    Juste pour confirmer la méthode déjà : il faut faire un autre Recordset du même type mais cette fois en faisant la concordance entre les enregistrements du Recordset Enr qu'on avait et les SST de la table contacts et en enregistrer les enregistrements correspondants de la colonne mail?
    pas forcément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim Enr As Recordset
        Dim stSQL as String
     
        stSQL = "SELECT [tbl_contactsSST].[Mail] FROM tbl_retourConsultation" _
        & " INNER JOIN tbl_contactsSST ON [tbl_retourConsultation].SST = [tbl_contactsSST].SST " _
        & "WHERE [tbl_retourConsultation].[N° Avis]='" & Me.[N° Avis] & "';")
     
        Set Enr = CurrentDb.OpenRecordset(stSQL)
        Do While Not Enr.EOF
            destSST = destSST & Enr("Mail") & ";"
            Enr.MoveNext
        Loop

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    Encore une petite question.
    Comment peut on récupérer plusieurs colonnes dans le Recordset. Par exemple en plus de la colonne SST de tbl_retourConsultation je veux en récupérer d'autres.
    J'ai tenté avec !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set Enrg = CurrentDb.OpenRecordset("select [SST] & [Prix € HT] & [Solution tech] & [Coh coût-besoin] & [Coh délai-besoin] & [Qualité offre] & [Offre parielle] from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'")
    Mais erreur : Erreur d'exécution 3061 : Erreur de syntaxe (opérateur absent) trop peu de paramètres. 1 attendu.

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    on sépare les champs avec des virgules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set Enrg = CurrentDb.OpenRecordset("select [SST], [Prix € HT], [Solution tech], [Coh coût-besoin], [Coh délai-besoin], [Qualité offre], [Offre parielle] from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'")
    ou simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enrg = CurrentDb.OpenRecordset("select * from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'")
    pour avoir accès à toutes les colonnes de la table

  15. #15
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    tee_grandbois

    Effectivement ton code donne le même résultat.
    Attention il y a une erreur ligne 6 il faut enlever la parenthèse à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim Enr As Recordset
        Dim stSQL as String
     
        stSQL = "SELECT [tbl_contactsSST].[Mail] FROM tbl_retourConsultation" _
        & " INNER JOIN tbl_contactsSST ON [tbl_retourConsultation].SST = [tbl_contactsSST].SST " _
        & "WHERE [tbl_retourConsultation].[N° Avis]='" & Me.[N° Avis] & "';")
     
        Set Enr = CurrentDb.OpenRecordset(stSQL)
        Do While Not Enr.EOF
            destSST = destSST & Enr("Mail") & ";"
            Enr.MoveNext
        Loop
    As-tu une idée du code le plus efficace c'est à dire le moins lourd en mémoire et temps?
    J'aurai tendance à dire que c'est le tien parce qu'il y a un Recordset en moins mais je suis pas sure.

  16. #16
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2019
    Messages : 36
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    on sépare les champs avec des virgules
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set Enrg = CurrentDb.OpenRecordset("select [SST], [Prix € HT], [Solution tech], [Coh coût-besoin], [Coh délai-besoin], [Qualité offre], [Offre parielle] from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'")
    ou simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Enrg = CurrentDb.OpenRecordset("select * from tbl_retourConsultation where [N° Avis]='" & Me.[N° Avis] & "'")
    pour avoir accès à toutes les colonnes de la table
    Super! Merci c'est ce que je cherchais j'avais tenté avec les virgules mais en enlevant les crochets

  17. #17
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    As-tu une idée du code le plus efficace c'est à dire le moins lourd en mémoire et temps?
    J'aurai tendance à dire que c'est le tien parce qu'il y a un Recordset en moins mais je suis pas sure.
    raison pour laquelle je te l'ai proposé.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/03/2014, 15h04
  2. récupérer valeur champ libre formulaire dans un état
    Par stagolee dans le forum VBA Access
    Réponses: 1
    Dernier message: 10/01/2008, 13h18
  3. récupérer valeur d'un enregistrement
    Par tzinzin dans le forum VBA Access
    Réponses: 6
    Dernier message: 23/11/2007, 11h41
  4. Réponses: 3
    Dernier message: 06/06/2007, 19h47
  5. Récupérer valeur champs de formulaire dynamique
    Par antillejj dans le forum ASP
    Réponses: 1
    Dernier message: 22/12/2006, 07h17

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