View Full Version : [SOLVED:] Export Word Table into Outlook Email Body
Loss1003
04-10-2015, 01:44 PM
How can I edit the following code, in-which copies a table to clipboard, and then the coiped table iinserted into an outlook email body.
Private Sub CommandButton4_Click()
With ActiveDocument
    .Tables(1).Range.Copy
    .Range(1, 1).Select
ActiveDocument.Tables(1).Cell(2, 1).Select
  
  
End With
End Sub
Currently using word 2010 and outlook professional plus 2010
gmayor
04-11-2015, 01:03 AM
The following should do that. You can replace the subject, the texts and the recipient as required:
Private Sub CommandButton4_Click()
Dim olApp As Object
Dim oMail As Object
Dim olInsp As Object
Dim wdDoc As Object
Dim oRng As Object
    On Error Resume Next
    If ActiveDocument.Tables.Count > 0 Then
        ActiveDocument.Tables(1).Range.Copy
        Set olApp = GetObject(, "Outlook.Application")
        If Err <> 0 Then
            Set olApp = CreateObject("Outlook.Application")
        End If
        'On Error GoTo lbl_Exit
        Set oMail = olApp.CreateItem(0)
        With oMail
            .to = "someone@somewhere.com"
            .Subject = "Message Subject"
            .BodyFormat = 2
            Set olInsp = .GetInspector
            Set wdDoc = olInsp.WordEditor
            Set oRng = wdDoc.Range(0, 0)
            .Display        'This line is required.
            oRng.Text = "This is the text before the table." & vbCr & vbCr
            oRng.Collapse 0
            oRng.Paste
            oRng.Collapse 0
            oRng.Text = vbCr & "This is the text after the table, before the signature."
            '.Send  'Restore this line to send the message
        End With
    Else
        MsgBox "No table!"
    End If
    ActiveDocument.Tables(1).Cell(2, 1).Select
lbl_Exit:
    Set olApp = Nothing
    Set olInsp = Nothing
    Set wdDoc = Nothing
    Set oRng = Nothing
    Exit Sub
End Sub
Loss1003
04-13-2015, 07:02 AM
Great works perfectly.
How can i copy cell (2 and 4) from row (2) and insert into the .subject line. I tried tinkering around with the following and few other variations but it only picks up the first or last cell only and not both.
.Subject = ActiveDocument.Tables(1).Cell(2, 2).Range & .Subject = ActiveDocument.Tables(1).Cell(2, 4).Range
gmayor
04-13-2015, 07:33 AM
Presumably these cells are in the table being copied? That being the case add a couple of declarations at the top
Dim oCell As Range
Dim strSubject As String
Modify the code as follows
If ActiveDocument.Tables.Count > 0 Then
        Set oCell = ActiveDocument.Tables(1).Cell(2, 2).Range
        oCell.End = oCell.End - 1 'remove the cell end character
        strSubject = oCell.Text
        Set oCell = ActiveDocument.Tables(1).Cell(2, 4).Range
        oCell.End = oCell.End - 1'remove the cell end character
        'Add the cell text to the subject string
        strSubject = strSubject & Chr(32) & oCell.Text
and insert the subject string into the message
.Subject = strSubject
naeemakhtar
04-11-2016, 04:25 AM
Please advise if the code can be revised to remove the border that is displayed around the table in the body of the email.
gmayor
04-11-2016, 05:48 AM
Add another value to the Dim statements
Dim oBorder As Object
Then add the following where shown
oRng.Text = vbCr & "This is the text after the table, before the signature."
            '.Send  'Restore this line to send the message
            With wdDoc.Tables(1)
                For Each oBorder In .Borders
                    oBorder.LineStyle = 0
                Next oBorder
            End With
        End With
microware197
12-19-2019, 10:19 AM
I have this code working and can change ActiveDocument.Tables(1).Range.Copy with any number in the ( ) to select that table from the document to send in the email. I would like a drop down to open when the macro is run to allow selection of which table to be copied. This could simply be by number or a nickname (preferred), then that number would populate ActiveDocument.Tables(x).Range.Copy and copy the correct table into the email body. TIA.
gmayor
12-19-2019, 10:34 PM
This is an old thread and it would have been advisable to start a new one, however. If you want to select from a list of tables, then bookmark the tables with suitable names. 
Create a simple userform with a combo box and a command button - https://www.gmayor.com/Userform.htm
The code for the userform is
Option Explicit
Private Sub CommandButton1_Click()
    Hide
End Sub
 
Then use the following code to call the userform and create the message. Note especially the comment at the top of the code as it won't work otherwise.
Note the userform uses the default names here for the form and its controls. If you need to change them, you will have to change them in the code also.
Option Explicit
Private Sub Macro1()
'Graham Mayor - https://www.gmayor.com - Last updated - 20 Dec 2019
'This macro requires the code from the following link to open Outlook correctly
'http://www.rondebruin.nl/win/s1/outlook/openclose.htm
Dim olApp As Object
Dim oMail As Object
Dim olInsp As Object
Dim wdDoc As Object
Dim oRng As Object
Dim oFrm As UserForm1
Dim lngTable As Long
Dim oBM As Bookmark
    On Error Resume Next
    If ActiveDocument.Tables.Count > 0 Then
        Set oFrm = New UserForm1
        With oFrm
            .ComboBox1.AddItem "[Select Table]"
            For Each oBM In ActiveDocument.Bookmarks
                If oBM.Range.Tables.Count > 0 Then
                    .ComboBox1.AddItem oBM.Name
                End If
            Next oBM
            .ComboBox1.ListIndex = 0
            .Show
            If .ComboBox1.ListIndex < 1 Then
                MsgBox "No table selected"
                GoTo lbl_Exit
            End If
            lngTable = .ComboBox1.ListIndex
        End With
        Unload oFrm
        ActiveDocument.Tables(lngTable).Range.Copy
        Set olApp = OutlookApp()
        On Error GoTo 0
        Set oMail = olApp.CreateItem(0)
        With oMail
            .to = "someone@somewhere.com"
            .Subject = "Message Subject"
            .BodyFormat = 2
            Set olInsp = .GetInspector
            Set wdDoc = olInsp.WordEditor
            Set oRng = wdDoc.Range(0, 0)
            .Display        'This line is required.
            oRng.Text = "This is the text before the table." & vbCr & vbCr
            oRng.Collapse 0
            oRng.Paste
            oRng.Collapse 0
            oRng.Text = vbCr & "This is the text after the table, before the signature."
        End With
        '.Send  'Restore this line to send the message
    Else
        MsgBox "No table!"
    End If
lbl_Exit:
    Set olApp = Nothing
    Set olInsp = Nothing
    Set wdDoc = Nothing
    Set oRng = Nothing
    Set oFrm = Nothing
    Exit Sub
End Sub
CHARHOLD
11-28-2022, 09:38 AM
Hi gmayor
 
I just stumbled upon this thread and the original code is almost exactly what I am looking for in one of my projects and I was wondering if you could possibly help please.
 
I was trying to update the code to send multiple tables, for example in my code I would like to take tables 1 , 2, 8 & 9 and drop into the body of the email,  but every time I tried kept getting errors .
 
Also is it possible to add a line of code to attach the active document to the email and name the subject of the email the active name?
 
If you could advice that would be amazing as I'm quite the macro novice.
gmayor
11-28-2022, 10:13 PM
Maybe something like
Option Explicit
Private Sub Macro1()
'Graham Mayor - https://www.gmayor.com - Last updated - 29 Nov 2022
'This macro requires the code from the following link to open Outlook correctly
'http://www.rondebruin.nl/win/s1/outlook/openclose.htm
Dim olApp As Object
Dim oMail As Object
Dim olInsp As Object
Dim wdDoc As Object
Dim oDoc As Document
Dim oRng As Object
Dim lngTable As Long
Dim oBM As Bookmark
    On Error Resume Next
    If ActiveDocument.Tables.Count > 4 Then
        Set oDoc = ActiveDocument
        oDoc.Save
        Set olApp = OutlookApp()
        On Error GoTo 0
        Set oMail = olApp.CreateItem(0)
        With oMail
            .to = "someone@somewhere.com"
            .Subject = oDoc.Name
            .BodyFormat = 2
            .Attachments.Add oDoc.FullName
            Set olInsp = .GetInspector
            Set wdDoc = olInsp.WordEditor
            Set oRng = wdDoc.Range(0, 0)
            .Display        'This line is required.
            oRng.Text = "This is the text before the tables." & vbCr & vbCr
            oRng.Collapse 0
            For lngTable = 1 To 9
                If lngTable = 1 Then
                    oDoc.Tables(lngTable).Range.Copy
                    oRng.Paste
                    oRng.Collapse 0
                    oRng.Text = "Table " & lngTable & vbCr
                    oRng.Collapse 0
                End If
                If lngTable = 2 Then
                    oDoc.Tables(lngTable).Range.Copy
                    oRng.Paste
                    oRng.Collapse 0
                    oRng.Text = "Table " & lngTable & vbCr
                    oRng.Collapse 0
                End If
                If lngTable = 8 Then
                    oDoc.Tables(lngTable).Range.Copy
                    oRng.Paste
                    oRng.Collapse 0
                    oRng.Text = "Table " & lngTable & vbCr
                    oRng.Collapse 0
                End If
                If lngTable = 9 Then
                    oDoc.Tables(lngTable).Range.Copy
                    oRng.Paste
                    oRng.Collapse 0
                    oRng.Text = "Table " & lngTable & vbCr
                    oRng.Collapse 0
                End If
            Next lngTable
            oRng.Text = vbCr & "This is the text after the tables, before the signature."
        End With
        '.Send  'Restore this line to send the message
    Else
        MsgBox "No tables!"
    End If
lbl_Exit:
    Set olApp = Nothing
    Set oDoc = Nothing
    Set olInsp = Nothing
    Set wdDoc = Nothing
    Set oRng = Nothing
    Exit Sub
End Sub
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.