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

VB.NET Discussion :

Problème late binding avec Word et Outlook


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Problème late binding avec Word et Outlook
    Salut,

    J'ai le code suivant:
    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
                Dim WordApp As Object
                Dim OutlMail As Object
     
                WordApp = CreateObject("Word.Application")
                WordApp.Visible = True
                WordApp.Documents.Add(Template:="Normal", NewTemplate:=False, DocumentType:=0)
                Me.RichTextBoxTrame.SelectAll()
                Me.RichTextBoxTrame.Copy()
                WordApp.ActiveDocument.Range.PasteAndFormat(0) ' 0 = wdPasteDefault
                For Each Destinataire As Class_Fournisseur_IC In FournisseursConsultes
                    OutlMail = WordApp.ActiveDocument.MailEnvelope.Item
                    With OutlMail
                        .To = Destinataire.Adresse
                        .Cc = Me.TextBoxInge.Text & ";" & Me.TextBoxAdresseAchat.Text & ";" & ListeCT(Me.ComboBoxCTAffaire.SelectedIndex).Adresse
                        .Subject = "Consultation dans le cadre du forfait OPTIM - DM " & Me.TextBoxNumDM.Text & " - société " & Destinataire.Societe
                        For Each PieceJointe As String In Me.ListBoxPiecesJointes.Items
                            .Attachments.Add(PieceJointe)
                        Next
                    End With
                    OutlMail.Save()
                    OutlMail = Nothing
                Next
                WordApp.ActiveDocument.Close(0)
                WordApp.Quit()
    qui me permet de créer des mails sous outlook à partir de mon formulaire (je passe par Word pour récupérer le contenu d'une Richtextbox en RTF (alignements, images, etc...)).

    Tout se passe à peu prêt bien pendant l'exécution du code (j'ai quelques fois le mail qui au lieu de se retrouver dans les brouillons est dans ma boite de réception, mais rien de bien grave).

    Le problème c'est que quand j'arrête mon code (quand je suis en débug), je ne réussi pas à reprendre la main tant que je n'ai pas cliqué sur le petit carré 'Arrêter le débogage'. Le problème semble provenir de mon lien Word ou outlook qui ne doit pas être complètement "mort" car si j'arrête le Winword (et aussi le Outlook) qui traine par le gestionnaire de tâches, VB me rend la main immédiatement sans passer par 'Arrêter le débogage'.

    J'ai bien essayé de rajouter un WordApp = Nothing à la fin, ça ne change rien.
    Si je passe le For Each Destinataire ... Next en commentaire, le winword reste dans le gestionnaire de tache (mais je n'ai plus de Outlook) et le code se termine normalement.

    Quelqu'un a-t-il une idée?

    Pour info, je passe par du late binding car mon exe peut être exécuté sur des machines n'ayant pas forcement la même version du pack office.

    Merci.

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Hello,
    pour bien arrêter word (ou excel) il faut fermer tout les documents ouvert avec le .close sur le document, une fois TOUT les documents fermé, il faut quitter l'application avec .quit sur l'objet application. Et quand c'est fait, tu dois absolument mettre à nothing toute variable ayant servis sur le word (variable application & document)
    Bien à toi.

  3. #3
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Désolé pour le temps mis à répondre, mais j'étais sur une autre manip.

    Suite à divers essais après la réponse de Sankasssss, le .QUIT na pas l'air vital , l'improtant c'est bien le montruc=nothing. Dans mon code modifié, les messages restent ouverts, prêts à être envoyés,ce qui me va bien comme principe.

    Mon code a évolué de la manière suivante:
    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
                Me.RichTextBoxTrame.SelectAll()
                Me.RichTextBoxTrame.Copy()
     
                ' Création des DPX
                Dim OutlApp As Object
                Dim OutlMail As Object
     
                OutlApp = CreateObject("Outlook.Application")
     
                For Each Destinataire As Class_Fournisseur_IC In FournisseursConsultes
                    OutlMail = OutlApp.CreateItem(0)
                    OutlMail.To = Destinataire.Adresse
                    OutlMail.Cc = Me.TextBoxInge.Text & ";" & Me.TextBoxAdresseAchat.Text & ";" & ListeCT(Me.ComboBoxCTAffaire.SelectedIndex).Adresse
                    OutlMail.Subject = "Consultation dans le cadre du forfait OPTIM - DM " & Me.TextBoxNumDM.Text & " - société " & Destinataire.Societe
                    For Each PieceJointe As String In Me.ListBoxPiecesJointes.Items
                        OutlMail.Attachments.Add(PieceJointe)
                    Next
                    OutlMail.Display()
                    SendKeys.Send("^v")
                    OutlApp.activewindow()
                    OutlMail = Nothing
                Next
                OutlApp = Nothing
    Et ça marche à un foutu détail prêt:
    pour 1 mail a créer: tout fonctionne
    pour 2 mail à créer: tout fonctionne
    pour plus que 2: le premier mail est nickel, les intermédiaires, prennent ou pas le CTRL+V , et le dernier contient autant de copie de mon RTF qu'il y a de mails qui sont vides (il a l'air de se récupérer tous les CTRL+V à la traine).

    Le CTRL+V est bien pratique car il me permet de copier mon RTF (qui contient du texte et des images) en contenu de Mail comme quand on fait un copier/coller de Word vers Outlook.

    J'ai bien essayé de rajouter des attentes dans la boucle, rien n'y fait.

    Y a t-il un moyen de vérifier que le "coller" est fini avant de poursuivre la boucle?

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Je n'ai pas réponse à ta question mais je sais qu'Excel à une méthode past sur ces worksheets qui est surement mieux gérée qu'un CTRL+V, regarde si outlook n'a pas une méthode similaire.

  5. #5
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Merci Sankasssss pour ta réponse, mais même si le CTRL+V n'est pas très élégant, des recherches depuis plusieurs jours sur le net me laissent dubitatif quand à l'existance d'une solution "pro" quand à ce que je cherche à faire.

    En tous cas, j'ai l'impression d'avoir trouvé la solution à mon bricolage. Mon problème semble venir du fait que le CTRL+V met un certain temps pour s'exécuter, et surtout (allez savoir pourquoi), que cela se passe d'autant mieux qu'il n'y a a pas de code en cours d'exécution (toutes les attentes, même celle du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep
    sensées laisser la main n'y ont rien fait).

    Après pas mal d'essais et de déboires, la solution a été le Timer. Je prépare mes mails (sauf le BODY) et je laisse un pointeur dessu via une list (of Object) puis je lance un Timer (1s c'est bien, 0,75 c'est trop court).

    Dans le timer_tick, je fait mon CTRL+V (1 par pick). Lorsque tous les mails sont passés, je fais un .clear de ma liste qui libère les ressources. Ca donne ça:

    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
                Me.RichTextBoxTrame.SelectAll()
                Me.RichTextBoxTrame.Copy()
     
                ' Création des DPX
                Dim OutlApp As Object
     
                OutlApp = CreateObject("Outlook.Application")
     
                For Each Destinataire As Class_Fournisseur_IC In FournisseursConsultes
                    OutlMail.Add(OutlApp.CreateItem(0))
                    With OutlMail(OutlMail.Count - 1)
                        .To = Destinataire.Adresse
                        .Cc = Me.TextBoxInge.Text & ";" & Me.TextBoxAdresseAchat.Text & ";" & ListeCT(Me.ComboBoxCTAffaire.SelectedIndex).Adresse
                        .Subject = "Consultation dans le cadre du forfait OPTIM - DM " & Me.TextBoxNumDM.Text & " - société " & Destinataire.Societe
                        For Each PieceJointe As String In Me.ListBoxPiecesJointes.Items
                            .Attachments.Add(PieceJointe)
                        Next
                    End With
                Next
     
                TimerAttenteOutlook.Start()
     
                OutlApp = Nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Private Sub TimerAttenteOutlook_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerAttenteOutlook.Tick
            ' Mise à jour du Body des mails en laissant le temps à l'IHM de tout rafraîchir
            FormAttentCreationDPX.Close()
            If CptMail < OutlMail.Count Then
                OutlMail(CptMail).display()
                SendKeys.Send("^v")
                CptMail += 1
            Else
                OutlMail.Clear()
                TimerAttenteOutlook.Stop()
                Me.Visible = True
            End If
     
        End Sub
    C'est super cool de voir les mails réapparaitre et le contenu se mettre à jour .

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

Discussions similaires

  1. Problème de Binding avec un formulaire
    Par vilveq dans le forum Flex
    Réponses: 7
    Dernier message: 06/08/2009, 11h03
  2. Problème de Binding avec un UserControl
    Par birdyz dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 20/02/2009, 12h31
  3. Problème d'encodage avec Word
    Par kOrt3x dans le forum Word
    Réponses: 4
    Dernier message: 23/08/2008, 23h21
  4. problèmes d'impression avec WORD
    Par MY356 dans le forum Word
    Réponses: 1
    Dernier message: 13/12/2007, 20h54
  5. problème de bindings avec DropDownList
    Par Vlatiska dans le forum ASP.NET
    Réponses: 14
    Dernier message: 17/03/2007, 14h04

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