Question

Comment puis-je copier un e-mail au presse-papiers, puis le coller dans Excel avec les tables intactes?

J'utilise Outlook 2007 et je veux faire l'équivalent de

"Click on email > Select All > Copy > Switch to Excel > Select Cell > Paste". 

J'ai le modèle objet Excel assez bien compris, mais ont aucune expérience dans Outlook autre que le code suivant.

Dim mapi As NameSpace
Dim msg As Outlook.MailItem
Set mapi = Outlook.Application.GetNamespace("MAPI")
Set msg = mapi.Folders.Item(1).Folders.Item("Posteingang").Folders.Item(1).Folders.Item(7).Items.Item(526)
Était-ce utile?

La solution

Je dois admettre que j'utiliser dans Outlook 2003, mais s'il vous plaît voir si cela fonctionne en 2007 ainsi:

vous pouvez utiliser le MSForms.DataObject pour échanger des données avec le presse-papiers. Dans Outlook VBA, créez une référence à " Microsoft Forms 2.0 Object Library ", et essayer ce code (vous pouvez bien fixer le cours Sub () à un bouton, etc.):

Sub Test()
Dim M As MailItem, Buf As MSForms.DataObject

    Set M = ActiveExplorer().Selection.Item(1)
    Set Buf = New MSForms.DataObject
    Buf.SetText M.HTMLBody
    Buf.PutInClipboard

End Sub

Après cela, passez à Excel et appuyez sur Ctrl-V - voilà! Si vous voulez aussi trouver en cours d'exécution d'application Excel et même automatiser cela, laissez-moi savoir.

Il y a toujours un HTMLBody valide, même si le courrier a été envoyé en texte brut ou RTF, Excel et affichera tous les attributs de texte transmis dans les HTMLBody incl. colonnes, couleurs, polices, hyperliens, etc. Cependant tirets, les images intégrées ne sont pas copiés.

Ce code montre l'essentiel, mais ne vérifie pas si vraiment un MailItem est sélectionné. Cela nécessiterait plus de codage, si vous voulez le faire fonctionner pour des entrées d'agenda, contacts, etc. ainsi.

Il suffit de si vous avez sélectionné le courrier dans la vue de la liste, vous ne même pas besoin de l'ouvrir.

Autres conseils

Je finalement repris à nouveau et complètement automatisé il. Voici les bases de ce que je l'ai fait pour l'automatiser.

Dim appExcel As Excel.Application
Dim Buf As MSForms.DataObject
Dim Shape As Excel.Shape
Dim mitm As MailItem
Dim itm As Object
Dim rws As Excel.Worksheet
'code to open excel
Set appExcel = VBA.GetObject(, "Excel.Application") 
'...
'code to loop through emails here       
Set mitm = itm
body = Replace(mitm.HTMLBody, "http://example.com/images/logo.jpg", "")
Call Buf.SetText(body)
Call Buf.PutInClipboard
Call rws.Cells(i, 1).PasteSpecial
For Each Shape In rws.Shapes
    Shape.Delete 'this deletes the empty shapes
Next Shape
'next itm

Je retire le logo urls pour gagner du temps , et quand vous avez affaire à 300 e-mails, qui se traduit au moins dix minutes enregistrées.

Je me suis I code nécessaire article TechRepublic, puis a changé pour répondre à mes besoins. Un grand merci à la answerer acceptée de cette question pour le code du presse-papiers.

Ok je vais donc devoir faire certaines hypothèses parce qu'il manque des informations de votre question. Tout d'abord vous ne dites pas ce que mailformat le message est ... HTML serait le plus facile, le processus sera différent pour RTF et pas possible en texte clair Puisque vous faites référence aux tables, je suppose qu'ils sont des tables HTML et le format de courrier est HTML.

En outre, il est difficile de conclure à votre question si vous voulez que le contenu de la table collée séparement (1 cellule excel par cellule de table) et le reste des e-mails bodytext collés dans 1 ou plusieurs cellules?

enfin, vous ne l'avez pas vraiment dit si vous voulez que la VBA en cours d'exécution à partir d'Outlook ou Excel (pas important, mais il affecte les objets intrinsèques sont disponibles.

exemple de code Quoi qu'il en soit: Code Outlook pour accéder à l'htmlbody prop

Dim mapi As Namespace
Set mapi = Application.Session
Dim msg As MailItem
Set msg = mapi.Folders.Item(1).Folders.Item("Posteingang").Folders.Item(1).Folders.Item(7).Items.Item(526) 
Dim strHTML as String
strHTML = msg.HTMLBody
' There is no object model collection for html tables within the htmlbody (which is a string of html) you will need to parse the html and collect the tables before inserting into Excel.

Après un certain temps encore, je l'ai trouvé une autre façon. MailItem.Body est le texte brut, et a un caractère de tabulation entre les cellules de table. Alors que je. Voici l'essentiel de ce que je faisais:

Sub Import()
    Dim itms As Outlook.Items
    Dim itm As Object
    Dim i As Long, j As Long
    Dim body As String
    Dim mitm As Outlook.MailItem
    For Each itm In itms
        Set mitm = itm
        ParseReports (mitm.body) 'uses the global var k
    Next itm
End Sub
Sub ParseReports(text As String)
    Dim table(1 To 1000, 1 To 11) As String 'I'm not expecting to see a thousand rows!
    Dim drow(1 To 11) As String
    For Each Row In VBA.Split(text, vbCrLf)
        j = 1
        For Each Col In VBA.Split(Row, vbTab)
            table(i, j) = Col
            j = j + 1
        Next Col
        i = i + 1
    Next Row
    For i = 1 To l
        For j = 1 To 11
            drow(j) = table(i, j)
        Next j
        hws.Range(hws.Cells(k, 1), hws.Cells(k, 11)) = drow
        k = k + 1
    Next i
End Sub

moyenne: 77 e-mails traités par seconde. Je fais un peu de traitement des mineurs et l'extraction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top