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 :

Problème avec .movenext


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Problème avec .movenext
    Bonjour à tous,

    Comme tout nouveau qui passe par là, j'espère ne pas faire de doublon, mais j'ai retourné tout le net (rien que ça!) sans trouver de solution à mon problème.

    J'ai une table CARNET_ADRESSE à laquelle je souhaite envoyer des mails "à la chaîne".
    Dans mon code j'utilise .movenext mais... ça ne passe jamais au suivant.
    (je suis bien débutante et tâtonne beaucoup encore )

    Pour comprendre le problème, j'ai voulu vérifier combien de lignes "voyait" mon code, et je constate que le résultat retourné est 1 (peut être que le problème vient de là?)

    Je vous joins le fameux code (basé sur un super tuto du grenier access ) et vous laisse en juger.

    Merci pour votre aide!

    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
    Function btnEmail_Click()
      Dim db As DAO.Database
      Dim rst As DAO.Recordset
      Dim strSQL As String
      Dim strMessageType As String
      Dim strTitre As String
      Dim mail As String
      Dim obj As String
      Dim count As Long
     
     
     
      ' Titre du message
      strTitre = "Commandes C&C Après 17h - {NOM STAC}"
      strMessageType = "Bonjour, Vous trouverez en pièce jointe la liste des commandes passées après 17h30. Bonne fin de journée"
      obj = "{NOM STAC}"
      mail = "{mail}"
     
      ' Ouverture de la requête
     
              Set db = CurrentDb
     
     
                    strSQL = "SELECT * FROM [CARNET_ADRESSE]"
     
     
                         Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
       count = rst.RecordCount
     
     
     
       ' Parcourir la liste des mails/contacts
     
      rst.MoveFirst
     
     
    Do While Not rst.EOF
     
    For i = 0 To count
    count = count - 1
     
     
        ' Personalisation de l'objet du message, spécification de la PJ et du mail
     
        strTitre = Replace(strTitre, "{NOM STAC}", rst("STAC"))
        obj = Replace(obj, "{NOM STAC}", rst("STAC"))
        mail = Replace(mail, "{mail}", rst("Adresse mail"))
     
     
        ' Expédier le mail
        DoCmd.SendObject acQuery, obj, "ExcelWorkbook(*.xlsx)", mail, "", "", strTitre, strMsg, True, ""
     
       rst.MoveNext
       Next i
     
        ' Contact suivant
     
     Loop
     
     
      ' On libère les ressources
      rst.Close
      Set rst = Nothing
     
      ' Un petit message de confirmation
      MsgBox "Opération terminée !", vbInformation, "Fini!"
    End Function

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    If rst.EOF = False Or Rs.bof = False Then rst.MoveFirst
     While rst.EOF = False
        ' Personalisation de l'objet du message, spécification de la PJ et du mail
     
        strTitre = Replace(strTitre, "{NOM STAC}", rst("STAC"))
        obj = Replace(obj, "{NOM STAC}", rst("STAC"))
        mail = Replace(mail, "{mail}", rst("Adresse mail"))
        ' Expédier le mail
        DoCmd.SendObject acQuery, obj, "ExcelWorkbook(*.xlsx)", mail, "", "", strTitre, strMsg, True, ""
       rst.MoveNext
        ' Contact suivant
     Wend

  3. #3
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour Rdurupt,

    Merci beaucoup pour ta réponse rapide!

    Malheureusement, ça boucle toujours sur le 1er enregistrement

  4. #4
    Invité
    Invité(e)
    Par défaut
    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
    Function btnEmail_Click()
      Dim db As DAO.Database
      Dim rst As DAO.Recordset
      Dim strSQL As String
      Dim strMessageType As String
      Dim strTitre As String
      Dim mail As String
      Dim obj As String
      Dim count As Long
     
     
     
      ' Titre du message
      strTitre = "Commandes C&C Après 17h - {NOM STAC}"
      strMessageType = "Bonjour, Vous trouverez en pièce jointe la liste des commandes passées après 17h30. Bonne fin de journée"
      obj = "{NOM STAC}"
      mail = "{mail}"
     
      ' Ouverture de la requête
     
              Set db = CurrentDb
     
     
                    strSQL = "SELECT * FROM [CARNET_ADRESSE]"
     
     
      With db.OpenRecordset(strSQL)
      ' Parcourir la liste des mails/contact
     
    Do While Not .EOF
        ' Personalisation de l'objet du message, spécification de la PJ et du mail
     
        strTitre = Replace(strTitre, "{NOM STAC}", .fields("STAC"))
        obj = Replace(obj, "{NOM STAC}", .fields("STAC"))
        mail = Replace(mail, "{mail}", .fields("Adresse mail"))
     
     
        ' Expédier le mail
        DoCmd.SendObject acQuery, obj, "ExcelWorkbook(*.xlsx)", mail, "", "", strTitre, strMsg, True, ""
     
       .MoveNext
        ' Contact suivant
     
     Loop
     
     
      ' On libère les ressources
      .Close
     End With
      ' Un petit message de confirmation
      MsgBox "Opération terminée !", vbInformation, "Fini!"
    End Function

  5. #5
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Nope! Toujours pas :/

    (Merci beaucoup pour ton aide en tout cas!)

  6. #6
    Invité
    Invité(e)
    Par défaut
    As tu à un moment ou un autre écris on error resume Next?

    Car là c'est du domaine de Fox Mulder, la vérité est ailleur!

  7. #7
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Non, j'ai fourni le code complet...

    Est-ce normal que mon rst.RecordCount renvoi 1 alors que dans ma table il y a 7 lignes?

    Je cherche les coordonnées de Mulder en attendant

  8. #8
    Invité
    Invité(e)
    Par défaut
    Un record count envoi le nombre d'enregistrement à partir de l'endroit où ce trouve le curseur d'enregistrement.
    1 si on est sur first, la moitié si le nombre d movenext nous positionne au milieux et tout si eof=True.

    Ce n'est pas une information pertinente!

    MoveLast;recordcount: Moverfirst.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if Rst.eof=false then
    Rst.movelast
    nb= Rst.recordcount
    Rst.movefirst
    For i=0 to nb-1
    Rst.move(i)
    Next
    End if
    je suis sur mon téléphone portable vérifies la syntaxe!
    Dernière modification par Invité ; 08/09/2016 à 19h07.

  9. #9
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci pour l'explication!

    Alors ça ne marche pas (pour info je l'ai intégré comme ci-contre)

    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
    If rst.EOF = False Then
    rst.MoveLast
    nb = rst.RecordCount
    rst.MoveFirst
    For i = 0 To nb - 1
     
     
     
        strTitre = Replace(strTitre, "{NOM STAC}", rst("STAC"))
        obj = Replace(obj, "{NOM STAC}", rst("STAC"))
        mail = Replace(mail, "{mail}", rst("Adresse mail"))
     
     
        DoCmd.SendObject acQuery, obj, "ExcelWorkbook(*.xlsx)", mail, "", "", strTitre, strMsg, True, ""
     
     
       rst.Move (i)
    Next
     
     
    End If
    En revanche en faisant le pas à pas détaillé, j'ai remarqué que ça restait bloqué sur
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.SendObject acQuery, obj, "ExcelWorkbook(*.xlsx)", mail, "", "", strTitre, strMsg, True, ""

    C'est une commande qui m'a l'air assez simple pourtant, mais se pourrait il que le problème vienne de là?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Personnellement je n'utilise pas les DoCmd!

    Je viens de vb6 et pas Access, pour c'est une base de données pas d'instruction système!

    C'est même parfois difficile pour moi de faire le lien entre les DoCmd et l'équivalent Vba!

    Mets la ligne en commentaire pour voir si ça vient de là!

    'DoCmd

  11. #11
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Hmmm...
    ça me donne une erreur d'exécution 3021 - Aucun enregistrement en cours

    Je vais tenter de changer mon docmd par sendMail (j'avais contourné car ça ne marchait pas comme je voulais)

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 075
    Points : 24 701
    Points
    24 701
    Par défaut
    Bonjour,

    C'est un peu capilotracté cet algo de parcours d'enregistrement.

    Ce serait pas plus simple d'écrire normalement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    While not rst.eof
     
    ...
     
    rst.movenext
    Wend
    Connaître le nombre d'enregistrement quand ça ne sert pas dans le code
    Utiliser un for et un move (i) au lieu d'un simple movenext.

    Cordialement,

  13. #13
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour loufab,

    C'était ce que j'avais mis dans mon code à la base, mais vu que ça ne fonctionnait pas, je tente tout ce que je trouve

    Petite mise à jour de la situation: Donc je suis revenue sur cette version du 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
    While Not rst.EOF
     
        ' Personalisation de l'objet du message, spécification de la PJ et du mail
     
        strTitre = Replace(strTitre, "{NOM STAC}", rst("STAC"))
        obj = Replace(obj, "{NOM STAC}", rst("STAC"))
        mail = Replace(mail, "{mail}", rst("Adresse mail"))
        ' Expédier le mail
     
     
        'DoCmd.SendObject acQuery, obj, "ExcelWorkbook(*.xlsx)", mail, "", "", strTitre, strMsg, True, ""
       rst.MoveNext
        ' Contact suivant
     Wend
    J'ai laissé mon Docmd désactivé pour l'instant.
    Ce qui se passe actuellement, c'est que j'ai la boucle qui se répète bien 7 fois (ça tombe bien j'ai 7 lignes dans ma table), mais qui ne prend à chaque fois que les informations de la première ligne.

  14. #14
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 075
    Points : 24 701
    Points
    24 701
    Par défaut
    Bonjour,

    EDIT : si tu as 7 lignes et qu'il y passe 7 fois c'est que ça marche mieux non ?

    Je n'avez pas vu tes appels au recordset...
    C'est du code ACCESS 2.0 ?

    Tu n'utilises jamais l'automation ?

    Voici la notation standard de récupération d'une valeur d'un champ de recordset.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst.fields("STAC").value
    Peux-tu poster la ligne déclarative de ton rst ?

    Cordialement,

  15. #15
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Effectivement il y a du progrès

    Alors à ta question "Tu n'utilises jamais l'automation", je vais te dire non, car sur l'échelle de l'évolution d'un codeur VBA, je ne suis même pas un oeuf ^^ (vraiment au tout début de l'apprentissage )

    Voici la ligne déclarative (enfin je crois):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
              Set db = CurrentDb
     
     
                    strSQL = "SELECT * FROM [CARNET_ADRESSE]"
     
     
                         Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)

  16. #16
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Code non ici tu montre où tu utilises rst : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
              Set db = CurrentDb
     
     
                    strSQL = "SELECT * FROM [CARNET_ADRESSE]"
     
     
                         Set rst = db.OpenRecordset(strSQL, dbOpenSnapshot)
    Code là tu déclares rst! : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function btnEmail_Click()
      Dim db As DAO.Database
      Dim rst As DAO.Recordset

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 200
    Points : 157
    Points
    157
    Par défaut
    si ca peut t'aider moi je le fait un peu de cette façon
    (peut etre pas la meilleur solution mais cela fonctionne (a adapter avec des données de tables)
    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
     
    Dim appOutLook As Outlook.Application
    Dim MailOutLook As Outlook.MailItem
    Dim strPath As String
    Set appOutLook = CreateObject("Outlook.Application")
    Set MailOutLook = appOutLook.CreateItem(olMailItem)
    Dim sql As String
    sql = "SELECT * FROM carnetAdresse"
    Dim rs As DAO.Recordset
    Set rs = db.OpenRecordset(sql, dbOpenDynaset)
    rs.MoveFirst
    Dim sujet As String
    sujet = "Mon objet de mail"
    Dim corps As String
    corps = "Le contenu de mon mail"
    Dim destinataire As String
    With rs
        Do While Not .EOF
            destinataire = rs("email")
            With MailOutLook
                            .BodyFormat = olFormatRichText
                            .To = destinataire
                            '.CC = copyMail
                            .Subject = sujet
                            .HTMLBody = corps
                            .Send
                            '.Display    'permet de créer l'email sans l'envoyer
            End With
        Loop
    End With

  18. #18
    Candidat au Club
    Femme Profil pro
    Logistique Méthodes
    Inscrit en
    Septembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Logistique Méthodes
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour Tyjez,

    Merci pour l'alternative!

    Petite question, on peut joindre des PJ avec cette méthode?

  19. #19

  20. #20
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 075
    Points : 24 701
    Points
    24 701
    Par défaut
    Citation Envoyé par LaureneK Voir le message
    Effectivement il y a du progrès
    Alors à ta question "Tu n'utilises jamais l'automation", je vais te dire non, car sur l'échelle de l'évolution d'un codeur VBA, je ne suis même pas un oeuf ^^ (vraiment au tout début de l'apprentissage )
    Mauvaise raison ! L'automation DOIT être utilisée dès le début, justement pour apprendre le contenu des classes.

Discussions similaires

  1. [vba] Problème avec MoveNext - Erreur de collection ?
    Par ancel17 dans le forum VBA Access
    Réponses: 6
    Dernier message: 07/05/2007, 18h17
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 12h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 19h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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