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

Macros et VBA Excel Discussion :

Lire dans un fichier excel fermé depuis VBA Outlook [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut Lire dans un fichier excel fermé depuis VBA Outlook
    Bonjour à tous,

    Je suis à la recherche d'une solution pour le problème suivant :

    Contexte:

    - Dans un fichier excel sont référencés en ligne des appareils qui doivent être étalonnés. En colonne "E" se trouve la date de validité, c'est à dire la date à laquelle ceux-ci devront de nouveau être étalonnés. En colonne "G" se trouve la différence entre la date de validité et la date actuelle. Cette différence décroit donc au fur et à mesure du temps pour tendre vers 0 et peu devenir négative.

    - Le fichier excel se trouvera sur le bureau du pc d'un collègue, dans lequel il pourra de façon ponctuelle faire des modifications de dates, ajouter des lignes pour de nouveaux appareils etc..

    - Outlook est la messagerie par défaut utilisée sur tout nos postes informatique. Celle-ci est lancée au démarrage de son pc et reste ouverte en continue, le pc est parfois simplement mis en veille en quittant le travail et sorti de veille le lendemain.

    Besoin :

    J'aurais besoin de votre aide pour réaliser une macro sous VBA Outlook (ma première, je n'ai de l'expérience que sous VBA excel, je préfère donc m'adresser au forums pour éviter les problèmes de syntaxe etc..).
    Le but de la macro serait SANS ouvrir le fichier excel, qui se trouvera toujours au même emplacement sur le bureau, de vérifier la différence entre les dates en colonne "G". Si la valeur de cette cellule est inférieure à 30, alors envoyer un mail au responsable de l'appareil en question. On peut imaginer ici positionner l'adresse mail en question dans la colonne "J".

    J'avais pensé à quelque chose de ce type en "réfléchissant excel" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    For Each cellule In Range(Cells(4, 7), Cells(65536, 7).End(xlUp))
        If cellule.Value <= 30 Then
            adresse = cellule.Offset(0, 3).Value 'email dans la colonne J
            Call EnvoiMail 'avec variable public "adresse" et fonction d'envoi de mail
        End If
    Next
    L'un de vous saurait-il m'éclairer sur la marche à suivre ? Je reste à votre disposition pour toute autre explication du problème ou question.
    Dans l'attente de vos réponses,

    Ycære

  2. #2
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Si tu as de l'expérience en VBA Excel, pourquoi vouloir envoyer tes mails depuis VBA Outlook que tu ne connais pas?

    Tu pourrais très bien faire cette procédure depuis ton classeur Excel.

    J'envoie quotidiennement des mails, via Outlook, grâce à une macro Excel située dans un classeur Excel...

    Après cette réflexion, ta demande est tout à fait réalisable, relativement facilement.
    Pour accéder aux onjets Excel (Range etc...) depuis Outlook, il te suffit de cocher la référence (sous VBE Outils/références...) Microsoft Excel xx.x Object Library.

    Tu auras ainsi accès aux objets de ton classeur.

    La plus grosse difficulté étant : "sans ouvrir le classeur". Mais, là encore, tu trouveras tout ce qu'il te faut sur ce site.

  3. #3
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Après réflexion, la référence à Excel n'est pas nécessaire.
    On peut se passer des objets Excel...

    Par contre : Nécessite de cocher la référence suivante : Microsoft ActiveX Data Objects x.x Library

    Pour le coup, voici un exemple de macro qui réalise ce que tu souhaites.
    La source principale est en commentaire de cette macro.

    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
    Option Explicit
     
    Public adresse As String
     
    Sub RequeteClasseurFerme()
    '   Source : https://silkyroad.developpez.com/VBA/ClasseursFermes/
    '   Nécessite de cocher la référence suivante :
        '   Microsoft ActiveX Data Objects x.x Library
        Dim Cn As ADODB.Connection, Rst As ADODB.Recordset
        Dim Fichier As String, NomFeuille As String, texte_SQL As String
        Dim Datas As Variant, i As Long
     
        'Définit le classeur fermé servant de base de données
        Const NOMFICHIER As String = "Le_Nom_De_Mon_Fichier.xlsm"
        Fichier = "C:\Users\" & Environ("username") & "\Desktop\" & NOMFICHIER
     
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "BDD"
     
        Set Cn = New ADODB.Connection
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans le Variant Datas
        If Not Rst.EOF Then
            Datas = Rst.GetRows
        Else
            MsgBox "erreur d'importation"
        End If
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
        Set Rst = Nothing
     
        'Boucle sur les valeurs de la colonne 7
        For i = 0 To UBound(Datas)
            If Datas(6, i) <= 30 Then
                adresse = Datas(9, i) 'email dans la "colonne 10" de la variable tableau
                Call EnvoiMail 'avec variable public "adresse" et fonction d'envoi de mail
            End If
        Next i
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut
    Bonjour Pijaku,

    Merci de ta réponse rapide et complète ! Le pourquoi de Outlook c'est justement pour matcher avec la demande de mon collègue : ne pas passer par un fichier excel, que l'opération vérif+envoi si nécessaire soit vraiment autonome, je m'étais donc dit que ça permettrait de palier ce problème

    En revanche, quelle est la condition de démarrage de la macro sous Outlook? J'imagine qu'elle ne tourne pas en tache de fond en lecture continue du fichier excel ?

    Cordialement,
    Ycære

  5. #5
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Pour l'instant, elle se déclenche sur lancement de l'utilisateur : Alt+F8, choisir RequeteClasseurFerme et exécuter.

    Tu peux, au choix :
    1. Ajouter un bouton à la barre d'accès rapide : [à faire sur le poste concerné]
      https://support.microsoft.com/fr-fr/...a-927f84eb5d2c
    2. Utiliser un des événements suivants :
      • Application.AdvancedSearchComplete
        Cet événement se produit lorsque la méthode AdvancedSearch est terminée.
      • Application.AdvancedSearchStopped
        Survient lors de l’exécution de la méthode Stop d’un objet Search spécifié.
      • Application.ItemLoad
        Se produit lorsqu'un élément Outlook est chargé en mémoire. i.e. réception d'un mail
      • Application.ItemSend
        Cet événement se produit lorsqu’un élément Microsoft Outlook est envoyé par l’utilisateur i.e. envoi d'un mail
      • etc...
        Voir ici :
        https://docs.microsoft.com/fr-fr/off...searchcomplete


    Tu n'as plus qu'à choisir ta méthode de déclenchement et nous tenir informé.

    L'avantage d'un événement est que cela ne nécessite aucune intervention de l'utilisateur.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut
    Bonjour,

    Le lancement par event me semble effectivement le meilleur choix pour cette notion "d'autonome". Après avoir parcouru la liste, le plus logique me semble être le Application.Startup, exécution au démarrage après chargement de tout les compléments.

    Je vois en revanche à partir de là un problème : Si Outlook est ouvert plusieurs fois dans la journée, cela peut engendrer une pollution des boites mail en cas de d’occurrence dans le fichier excel source.

    L'idée serait peut-être d'intégrer un compteur pour n'exécuter la procédure qu'une fois par jour ? Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim LastExecution As String
    .
    .
    if LastExecution <> Date Then
    ...
    End if
    .
    .
    LastExecution = Date
    End Sub

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 576
    Par défaut
    Bonjour,
    Personnellement j'aurais opté pour un fichier vbscript exécuter par le gestionnaire de tâche de Windows !

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut
    @Pijaku
    Si c'est totalement invisible oui ca me va!
    Après sur le principe pourquoi ça ne marche pas avec cette méthode ? S'il le faut on peut imaginer ordonner les données autrement ?

    @Thumb down
    Je n'ai rien contre mais ça dépasse mes compétences actuelles

  9. #9
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    S'il le faut on peut imaginer ordonner les données autrement ?
    Pas de ligne vide, pas de colonne vide...
    C'est tout.
    Donc, déjà, ça va bloquer pour la ligne 1...

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut
    Ah! Donc pas de soucis tout est bien plein, j'ai simplement vidé et simplifié le fichier au max pour la confidentialité et la simplicité de lecture des données principales.
    Le haut de la feuille fusionné ne peut pas représenter une gêne pour la création du tableau de la requête ?

  11. #11
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Je ne sais pas, ne pouvant pas tester.
    Par contre, la date en K1 n'est pas importée car colonne K non remplie...

    Donc, non ADODB ne fonctionne pas.

  12. #12
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 576
    Par défaut
    Bonjour,
    Pourquoi utiliser le shell ?
    Application.Quit

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut
    @Pijaku

    Oui c'est une possibilité que j'avais envisagé mais le processus devant être totalement transparent, limité à une fois par jour et un seul utilisateur en première activité lors du démarrage du pc je ne l'ai pas mis ici.

    @Thumb down

    Le .quit est déjà présent dans le code mais laissé systématiquement un processus excel en arrière plan. J'ai donc ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VBA.Interaction.Shell ("TASKKILL /F /IM excel.exe")

  14. #14
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par ycære Voir le message
    Oui c'est une possibilité que j'avais envisagé mais le processus devant être totalement transparent, limité à une fois par jour et un seul utilisateur en première activité lors du démarrage du pc je ne l'ai pas mis ici.
    On peut toutefois imaginer que l'utilisateur, ayant un travail urgent à faire sur Excel, commence par ça.
    Ensuite, il lance Outlook pour voir ses mails et... Crac boum, fermeture de son travail Excel...
    ça ne se produira qu'une fois, mais c'est chiant...

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Février 2019
    Messages : 21
    Par défaut
    Outlook se lance au démarrage de l'ordinateur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-365] Lire dans un fichier excel fermé depuis VBA Outlook
    Par ycære dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 16/07/2020, 09h36
  2. Probleme lecture dans un fichier Excel ferme
    Par kent17 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/07/2010, 09h29
  3. Réponses: 3
    Dernier message: 28/08/2009, 15h01
  4. Lire dans un Fichier Excel et Ecrire dans une base Access
    Par tarik75 dans le forum Modélisation
    Réponses: 1
    Dernier message: 03/09/2008, 21h10
  5. [Authorware] Lire dans un fichier Excel
    Par soeursourire dans le forum Autres langages
    Réponses: 0
    Dernier message: 11/09/2007, 10h38

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