Excel VBA - Как я могу отправить электронное письмо с текстом, относящимся к определенным значениям ячеек?

В настоящее время работаю над формой заказа в Excel, и я застрял на отправке электронного письма с помощью кнопки макроса.

Теперь я видел в Интернете много «как отправлять электронную почту с помощью VBA в Excel», и я понимаю, о чем они.

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

Например, в форме заказа есть 4 печатные платы, которые я могу заказать. На данный момент они будут представлены A, B, C и D.

Если я поставлю 100 в ячейку количества каждой печатной платы и нажму кнопку «Заказать».

Следующее электронное письмо будет выглядеть следующим образом:

Dear <Name>

I'd like to order 100 of A, 100 of B, 100 of C & 100 of D

Kind Regards,

<Name>

Между тем, если вдруг в следующем заказе, который я хочу разместить, я поставлю только 20 в A и 60 в C, электронное письмо изменится, чтобы отразить это изменение:

Dear <Name>

I'd like to order 20 of A & 60 of C

Kind Regards,

<Name>

Эти изменения заключаются в размещении запятых, точек и символа «&».

Кто-нибудь может указать мне общее направление того, как я могу сделать это / адаптировать текущие учебники, чтобы получить требуемый результат?

Редактировать: кажется, есть небольшое недоразумение в форме, о которой я говорю, поэтому вот текущая настройка: введите описание изображения здесь

Чего я хочу добиться, нажав кнопку заказа: Берет значения ячеек из столбца суммы, который соответствует каждой отдельной доске в столбце типа.

И переносит эти значения в основную часть письма. Что касается конкретного текста, такого как запятые и т. д., я больше думал о формате оператора if, например. если B3 имеет значение && B4 имеет значение, но B5 и B6 == 0, то опубликуйте сообщение в теле письма (B3)"(ref no)"+" & "+ (B4)"(ref no)"

И так далее в зависимости от того, имеет ли какая-либо из этих ячеек значение. Я не прошу размещать текст в других ячейках, таких как ячейка J7, содержащая «Я хотел бы» и т. д. Этот тип текста я добавлю непосредственно в сценарий VBA.

@BBRK - Что касается моего комментария к вашему ответу, то это то, что я имею в виду, изменяя тело сообщения:

  xMailBody = "Hi <NAME>" & vbNewLine & vbNewLine & _
              "I'd like to order" & vbNewLine & _
              "Kind Regards"
                  On Error Resume Next

Этот код выглядит следующим образом: введите здесь описание изображения

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

Также я хочу изменить положение «0 Vibro» и переместить его после того, как я сказал, что хотел бы заказать, но не появляться в следующей строке, где он находится рядом с разделом «С уважением».

@BBRK вот текущий полный VBA:

Private Sub Board_Order()

    Dim xMailBody As String
    Dim xOutApp As Object
    Dim xOutMail As Object
    Dim count_var As Integer
    Dim arr() As String
    Dim arr_val() As Integer
    Dim great_count As Integer
    Dim arr_now As Integer
    On Error Resume Next
    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)

    arr_now = 0

    'Gets the count of number of zeroes available in the B3 to last data filled row of that column.
    great_count = Application.WorksheetFunction.CountIf(Range("B3:B6" & Range("B3").End(Excel.XlDirection.xlDown).Row), ">0")

    xMailBody = "Hi <NAME>" & vbNewLine & vbNewLine & _
                "I'd like to order" & vbNewLine & _
                "Kind Regards"
                    On Error Resume Next

    'If orders are there then will go for further processing.
    If great_count <> 0 Then

        'Resizes array according to the count
        ReDim arr(0 To great_count - 1)
        ReDim arr_val(0 To great_count - 1)

        'Loops through the range and input product into the arr and it's value in arr_val
        If great_count > 0 Then
            For i = 3 To Range("B3").End(Excel.XlDirection.xlDown).Row
                If Range("B" & i).Value > 0 Then
                    arr(arr_now) = Range("A" & i).Value
                    arr_val(arr_now) = Range("B" & i).Value
                    arr_now = arr_now + 1
                End If
            Next i
        End If

        'Looping through each element in the array to get the desired result.
            If great_count = 1 Then
                xMailBody = xMailBody + " " + CStr(arr_val(j)) + " of " + arr(j)
            Else
                For j = 0 To UBound(arr)
                    If j = 0 Then
                        xMailBody = xMailBody + " " + CStr(arr_val(j)) + " of " + arr(j)
                    ElseIf j = UBound(arr) Then
                        xMailBody = xMailBody + " & " + CStr(arr_val(j)) + " of " + arr(j)
                    Else
                        xMailBody = xMailBody + " , " + CStr(arr_val(j)) + " of " + arr(j)
                    End If
                Next j
            End If
    End If

    With xOutMail
            .To = "[email protected]"
            .CC = ""
            .BCC = ""
            .Subject = "Test email send by button clicking"
            .Body = xMailBody
            .Display   'or use .Send
    End With
    On Error GoTo 0
    Set xOutMail = Nothing
    Set xOutApp = Nothing

End Sub

person Marc Brooks    schedule 14.10.2018    source источник
comment
Есть много вещей, которые вам нужно учитывать. 1 что делать, если в ячейках количество пусто? 2 Сколько товаров можно заказать? 3 у вас есть заданный диапазон, тогда вам поможет перебор диапазона и объединение значений на основе того, что у вас есть в поле qty.   -  person Siddharth Rout    schedule 14.10.2018
comment
В идеале, если ваш список предметов может увеличиваться, тогда поможет их расположение по вертикали. Items в Col A и Qty в Col B. Таким образом, вы можете просмотреть каждый элемент в диапазоне.   -  person Siddharth Rout    schedule 14.10.2018


Ответы (2)


Основываясь на вашем объяснении, я разработал метод VBA в Excel.

Это поможет вам сгенерировать конкатенированную строку, которую вы хотите.

Скопируйте и вставьте ниже код Excel VBA в редакторе и попробуйте запустить его.

Sub Generate_String()
Dim HTML_body As String
Dim count_var As Integer
Dim arr() As String
Dim arr_val() As Integer
Dim great_count As Integer
Dim arr_now As Integer
Dim xMailBody As String
Dim xOutApp As Object
Dim xOutMail As Object

Set xOutApp = CreateObject("Outlook.Application")
Set xOutMail = xOutApp.CreateItem(0)

arr_now = 0

'Gets the count of number of zeroes available in the B3 to last data filled row of that column.
great_count = Application.WorksheetFunction.CountIf(Range("B3:B" & Range("B3").End(Excel.XlDirection.xlDown).Row), ">0")

HTML_body = "Hi <Name>," & vbnewline & vbnewline & "I'd like to order"

'If orders are there then will go for further processing.
If great_count <> 0 Then

    'Resizes array according to the count
    ReDim arr(0 To great_count - 1)
    ReDim arr_val(0 To great_count - 1)

    'Loops through the range and input product into the arr and it's value in arr_val
    If great_count > 0 Then
        For i = 3 To Range("B3").End(Excel.XlDirection.xlDown).Row
            If Range("B" & i).Value > 0 Then
                arr(arr_now) = Range("A" & i).Value
                arr_val(arr_now) = Range("B" & i).Value
                arr_now = arr_now + 1
            End If
        Next i
    End If

    'Looping through each element in the array to get the desired result.
        If great_count = 1 Then
            HTML_body = HTML_body + " " + CStr(arr_val(j)) + " of " + arr(j)
        Else
            For j = 0 To UBound(arr)
                If j = 0 Then
                    HTML_body = HTML_body + " " + CStr(arr_val(j)) + " of " + arr(j)
                ElseIf j = UBound(arr) Then
                    HTML_body = HTML_body + " & " + CStr(arr_val(j)) + " of " + arr(j)
                Else
                    HTML_body = HTML_body + " , " + CStr(arr_val(j)) + " of " + arr(j)
                End If
            Next j
        End If
Else
    HTML_body = "No Orders"
End If

HTML_body = HTML_body & vbnewline & "Kind Regards" & vbnewline & "<Name>"
With xOutMail
        .To = "[email protected]"
        .CC = ""
        .BCC = ""
        .Subject = "Test email send by button clicking"
        .Body = HTML_body
        .Display   'or use .Send
End With
End Sub

Измените его в соответствии с вашими потребностями. Надеюсь, я смог вам помочь.

Я отредактировал код в соответствии с вашими потребностями. Проблема заключалась в том, что вы добавляли текст «С уважением» перед обработкой.

EDIT2:

С проверкой проверяет, является ли столбец суммы для любой строки пустым

Sub Generate_String()
Dim HTML_body As String
Dim count_var As Integer
Dim arr() As String
Dim arr_val() As Integer
Dim great_count As Integer
Dim arr_now As Integer
Dim rng_Body As Range
Dim xMailBody As String
Dim xOutApp As Object
Dim xOutMail As Object
Dim validate_pass As Boolean

'Checks if the any of the range has blank values
'if blank value is found it will make validate_pass variable to false.
Set rng_Body = Range("B3:B" & Range("B3").End(Excel.XlDirection.xlDown).Row)
validate_pass = True
For Each r In rng_Body
    If Trim(r.Text) = "" Then
        validate_pass = False
        Exit For
    End If
Next r

'If validate_pass variable is false then throws out error message.
'Else it will go through the normal procedure to sent out emails.
If validate_pass = False Then
    MsgBox "Your appropriate error message if any of the amount value found blank", vbCritical
Else
    Set xOutApp = CreateObject("Outlook.Application")
    Set xOutMail = xOutApp.CreateItem(0)

    arr_now = 0

    Set rng_Body = Range("B3:B" & Range("B3").End(Excel.XlDirection.xlDown).Row)


    'Gets the count of number of zeroes available in the B3 to last data filled row of that column.
    great_count = Application.WorksheetFunction.CountIf(Range("B3:B" & Range("B3").End(Excel.XlDirection.xlDown).Row), ">0")

    HTML_body = "Hi <Name>," & vbNewLine & vbNewLine & "I'd like to order"

    'If orders are there then will go for further processing.
    If great_count <> 0 Then

        'Resizes array according to the count
        ReDim arr(0 To great_count - 1)
        ReDim arr_val(0 To great_count - 1)

        'Loops through the range and input product into the arr and it's value in arr_val
        If great_count > 0 Then
            For i = 3 To Range("B3").End(Excel.XlDirection.xlDown).Row
                If Range("B" & i).Value > 0 Then
                    arr(arr_now) = Range("A" & i).Value
                    arr_val(arr_now) = Range("B" & i).Value
                    arr_now = arr_now + 1
                End If
            Next i
        End If

        'Looping through each element in the array to get the desired result.
            If great_count = 1 Then
                HTML_body = HTML_body + " " + CStr(arr_val(j)) + " of " + arr(j)
            Else
                For j = 0 To UBound(arr)
                    If j = 0 Then
                        HTML_body = HTML_body + " " + CStr(arr_val(j)) + " of " + arr(j)
                    ElseIf j = UBound(arr) Then
                        HTML_body = HTML_body + " & " + CStr(arr_val(j)) + " of " + arr(j)
                    Else
                        HTML_body = HTML_body + " , " + CStr(arr_val(j)) + " of " + arr(j)
                    End If
                Next j
            End If
    Else
        HTML_body = "No Orders"
    End If

    HTML_body = HTML_body & vbNewLine & "Kind Regards" & vbNewLine & "<Name>"
    With xOutMail
            .To = "[email protected]"
            .CC = ""
            .BCC = ""
            .Subject = "Test email send by button clicking"
            .Body = HTML_body
            .Display   'or use .Send
    End With
    MsgBox "Order Email has been Sent"
End If


End Sub
person BBRK    schedule 15.10.2018
comment
Ура, отлично получается. Любопытный вопрос, а как изменить текст, в котором упоминается тип? Поскольку мне нужно изменить это на набор ссылочных номеров вместо того, чтобы ссылаться на ячейки в столбце A. Также как мне изменить тело сообщения? Я опубликую редактирование, показывающее, что я имею в виду. - person Marc Brooks; 15.10.2018
comment
Можете ли вы опубликовать весь код VBA для справки? Нужно посмотреть, что вы создали. - person BBRK; 15.10.2018
comment
Вы используете Outlook для создания писем? - person BBRK; 15.10.2018
comment
Да, я использую Outlook для создания писем. - person Marc Brooks; 15.10.2018
comment
Итак, каким будет ‹Имя› в электронном письме? - person BBRK; 15.10.2018
comment
Я планирую использовать код vba для нескольких кнопок заказа. Итак, у меня есть «ИМЯ» в качестве заполнителя для поставщика, с которым я собираюсь связаться, за которым следует «ИМЯ» внизу в качестве заполнителя для моего имени, подписи и т. д. - person Marc Brooks; 15.10.2018
comment
Забыл добавить, также необходимо выяснить, как добавить проверку проверки, если в поле суммы не было указано значение. Хотите, чтобы он вызывал msgbox с указанием ввести значение в поле суммы. Точно так же, когда сообщение отправляется, появляется окно msgbox, в котором говорится, что электронное письмо с заказом отправлено и т. Д., Но я уверен, что смогу понять это. - person Marc Brooks; 15.10.2018
comment
^ Добавлено в проверку количества, просто нужно выяснить размещение текста. - person Marc Brooks; 15.10.2018
comment
Давайте продолжим обсуждение в чате. - person BBRK; 16.10.2018

Ну, вы можете комбинировать текст и числа вместе, чтобы получить то, что вы хотите:

=A1&" "&A2&" "&A3

Где ячейка A1 содержит «Я бы хотел», ячейка A2 содержит значение 100, ячейка A3 содержит «переменные резисторы».

что приводит к: я хотел бы 100 переменных резисторов

person Solar Mike    schedule 14.10.2018