2015-07-06 2 views
0

Я пытаюсь отправить определенные разделы файла excel в тело почты Outlook.Как отправить данные Excel (несколько отдельных диапазонов), разделенных возвратом каретки в почтовый ящик Outlook

Мне нужно форматирование данных, поскольку я работаю с данными внутри таблиц и с разными цветами заполнения ячеек и цветами шрифта, поэтому его нельзя хранить в строке AFAIK.

Мне нужно, чтобы кадры возвращались для разделения таблиц, вставленных в Outlook, чтобы другой текст можно было вручную добавить в тело электронной почты между таблицами, не искажая форматирование таблицы.

Код ниже показывает, что нужно делать, но не работает, поскольку возвращает ошибку времени выполнения 13, не соответствует раскладке на строке «.HTMLBody». Я потратил много времени на различные способы сделать это, но так я должен работать, я просто не знаю, какие типы данных использовать и как правильно это делать.

Имейте в виду, что в обоих примерах моего кода ниже я вырезал большую часть области ввода данных, потому что это был бы избыточный код.

Sub sendToOutlook() 
    Dim OutApp As Object 
    Dim OutMail As Object 

    Dim bodyFieldA As Range 
    Dim bodyFieldB As Range 

    On Error Resume Next 
    Set OutApp = GetObject(, "Outlook.Application") 
    If Err <> 0 Then Set OutApp = CreateObject("Outlook.Application") 
     On Error GoTo 0 

    Set OutMail = OutApp.CreateItem(0) 

    With OutMail 
     .To = Range("L18").Value 
     .CC = Range("L19").Value 
     .BCC = Range("L20").Value 
     .Subject = Range("L1") & " " & Range("N1").Text _ 
        & " " & Range("O1") & " " & Range("R1").Text _ 
        & " " & Range("S1") 

     Set bodyFieldA = Range("A26:I33") 
     Set bodyFieldB = Range("A34:I34") 

     .HTMLBody = bodyFieldA + vbCrLf + bodyFieldB + "<HTML><body><body></HTML>" 
     .display 
    End With 

    Application.CutCopyMode = False 
    Range("A1").Select 

    Set OutMail = Nothing 
    Set OutApp = Nothing 
End Sub 

Моя старая версия работает только тогда, когда прогноз уже был дан фокус, пользователь один раз, в противном случае «SendKeys», которые я использую вместо возврата каретки посылаются, чтобы преуспеть вместо этого, разрушая данные рабочего листа.

Кроме того, если поле «.TO» оставлено пустым, вместо «тела электронной почты» отправляются «sendkeys».

Мне нужно исправить эту проблему, поэтому приведенный выше код является моей попыткой решения для него, а код ниже - это мой старый код, который выполняет эту работу, но с большим количеством работы с Band-Aid и проблемами с менее опытными пользователями которые будут использовать макрос, не смогут справиться.

Sub sendToOutlook() 
    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim olInsp As Object 
    Dim wdDoc As Object 
    Dim oRng As Object 

    On Error Resume Next 
    Set OutApp = GetObject(, "Outlook.Application") 
    If Err <> 0 Then Set OutApp = CreateObject("Outlook.Application") 
     On Error GoTo 0 

    Set OutMail = OutApp.CreateItem(0) 

    With OutMail 
     .To = Range("L18").Value 
     .CC = Range("L19").Value 
     .BCC = Range("L20").Value 
     .Subject = _ 
      Range("L1") & " " & Range("N1").Text _ 
      & " " & Range("O1") & " " & Range("R1").Text _ 
      & " " & Range("S1") 

     Set olInsp = .GetInspector 
     Set wdDoc = olInsp.WordEditor 
     Set oRng = wdDoc.Range 

     'force html format 
     .HTMLBody = "<HTML><body><body></HTML>" 
     .display 

     oRng.collapse 1 
     Range("A26:I33").Select 
     Selection.Copy 
     oRng.Paste 
     SendKeys "{ENTER}", True 

     oRng.collapse 1 
     Range("A34:I34").Select 
     Selection.Copy 
     oRng.Paste 
     SendKeys "{ENTER}", True 
    End With 

    'deselect cell range 
    Application.CutCopyMode = False 
    Range("A1").Select 

    Set OutMail = Nothing 
    Set OutApp = Nothing 
    Set olInsp = Nothing 
    Set wdDoc = Nothing 
    Set oRng = Nothing 
End Sub 
+0

Я попытался с помощью: "oRng = ORng & Chr (13)" ... Тем не менее, Chr (13) остается внутри таблиц, которая губит их форматирование размера, и не расщепляется таблицы. – Wafer

ответ

0

Из второго набора кода выше, копия пасты таблиц, в Word, на основе электронной почты тело, я придумал следующий код. В принципе, мы «заправляем» документ паролем CrLf, прежде чем вставлять таблицы.

Option Explicit 

Sub sendToOutlook() 
    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim olInsp As Object 
    Dim wdDoc As Object 
    Dim oRng As Object 

    On Error Resume Next 
    Set OutApp = GetObject(, "Outlook.Application") 
    If Err <> 0 Then Set OutApp = CreateObject("Outlook.Application") 
     On Error GoTo 0 

    Set OutMail = OutApp.CreateItem(0) 

    With OutMail 
     .To = Range("L18").Value 
     .CC = Range("L19").Value 
     .BCC = Range("L20").Value 
     .Subject = _ 
      Range("L1") & " " & Range("N1").Text _ 
      & " " & Range("O1") & " " & Range("R1").Text _ 
      & " " & Range("S1") 

     Set olInsp = .GetInspector 
     Set wdDoc = olInsp.WordEditor 
     Set oRng = wdDoc.Range 

     'force html format 
     .HTMLBody = "<HTML><body><body></HTML>" 
     .display 

     '--- start with two CrLf's, so we can add the first table 
     ' in between them... 
     oRng.InsertAfter vbCrLf & vbCrLf 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up one character (so that the table inserts before the CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -1 
     Range("A26:I33").Select 
     Selection.Copy 
     oRng.Paste 

     '--- finally move the cursor all the way to the end and paste the 
     ' second table 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     Range("A34:I34").Select 
     Selection.Copy 
     oRng.Paste 
     'SendKeys "{ENTER}", True 
    End With 

    'deselect cell range 
    Application.CutCopyMode = False 
    Range("A1").Select 

    Set OutMail = Nothing 
    Set OutApp = Nothing 
    Set olInsp = Nothing 
    Set wdDoc = Nothing 
    Set oRng = Nothing 
End Sub 
+0

Мои типы и размеры шрифтов не поддерживаются. Кроме того, ячейки таблицы более широкие и более высокие (заполнение?), Чем те, в которых они установлены в Excel. Однако это определенно ближе, спасибо! – Wafer

+0

Кроме того, мои методы ранее сохраняли все форматирование по мере необходимости, единственная проблема, с которой я столкнулась, - это возврат каретки, разделяющий таблицы. Это много кода для работы только для разделения таблиц с пустой строкой. Есть ли простой способ просто добавить возврат каретки? – Wafer

+0

Я переработал приведенный выше код, чтобы использовать ваше решение для копирования-вставки. На основе вашего второго набора кода. Посмотрите, работает ли это лучше для вас или, по крайней мере, дает вам пример для работы. – PeterT

0

ниже код решает обе мои вопросы. Спасибо PeterT, который дал мне стратегию использования.

Sub sendToOutlook() 
    Dim OutApp As Object 
    Dim OutMail As Object 
    Dim olInsp As Object 
    Dim wdDoc As Object 
    Dim oRng As Object 

    On Error Resume Next 
    Set OutApp = GetObject(, "Outlook.Application") 
    If Err <> 0 Then Set OutApp = CreateObject("Outlook.Application") 
     On Error GoTo 0 

    Set OutMail = OutApp.CreateItem(0) 

    With OutMail 
     .To = Range("L18").Value 
     .CC = Range("L19").Value 
     .BCC = Range("L20").Value 
     .Subject = _ 
      Range("L1") & " " & Range("N1").Text _ 
      & " " & Range("O1") & " " & Range("R1").Text _ 
      & " " & Range("S1") 

     Set olInsp = .GetInspector 
     Set wdDoc = olInsp.WordEditor 
     Set oRng = wdDoc.Range 

     'force html format 
     .HTMLBody = "<HTML><body><body></HTML>" 
     .display 

     '--- start with 6 CrLf's, so we can place each table 
     ' above all but the last used... 
     oRng.InsertAfter vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up six characters (so that the table inserts before the FIRST CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -6 
     Range("A1:I8").Select 
     Selection.Copy 
     oRng.Paste 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up five characters (so that the table inserts before the SECOND CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -5 
     Range("A9:I9").Select 
     Selection.Copy 
     oRng.Paste 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up four characters (so that the table inserts before the THIRD CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -4 
     Range("A11:I22").Select 
     Selection.Copy 
     oRng.Paste 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up three characters (so that the table inserts before the FOURTH CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -3 
     Range("A24:I24").Select 
     Selection.Copy 
     oRng.Paste 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up two characters (so that the table inserts before the FIFTH CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -2 
     Range("A26:I33").Select 
     Selection.Copy 
     oRng.Paste 

     '--- now reselect the entire document, collapse our cursor to the end 
     ' and back up one character (so that the table inserts before the SIXTH CrLf) 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     oRng.Move 1, -1 
     Range("A34:I34").Select 
     Selection.Copy 
     oRng.Paste 


     '--- finally move the cursor all the way to the end and paste the 
     ' second table BELOW the SIXTH CrLf 
     Set oRng = wdDoc.Range 
     oRng.collapse 0 
     Range("A36:I47").Select 
     Selection.Copy 
     oRng.Paste 
    End With 

    'deselect cell range 
    Application.CutCopyMode = False 
    Range("A1").Select 

    Set OutMail = Nothing 
    Set OutApp = Nothing 
    Set olInsp = Nothing 
    Set wdDoc = Nothing 
    Set oRng = Nothing 

End Sub 
Смежные вопросы