gpt4 book ai didi

excel - 如何使用 Excel VBA 向范围内的唯一用户发送电子邮件?

转载 作者:行者123 更新时间:2023-12-04 20:54:39 26 4
gpt4 key购买 nike

我正在尝试查看 A 列,找到所有唯一的电子邮件地址,为每个电子邮件地址创建一个 Outlook 电子邮件,并使用该电子邮件地址所在的行(也包括标题)填充该电子邮件的正文。
示例数据:

+----------------+---------------------+---------+
| Email | Application | Version |
+----------------+---------------------+---------+
| test1@test.com | Microsoft_Office_13 | v2.0 |
| test1@test.com | Putty | v3.0 |
| test1@test.com | Notepad | v5.6 |
| test2@test.com | Microsoft_Office_13 | v2.0 |
| test2@test.com | Putty | v3.0 |
| test2@test.com | Adobe_Reader | v6.4 |
| test3@test.com | Microsoft_Office_13 | v3.6 |
| test3@test.com | Paint | v6.4 |
| test3@test.com | Adobe_Reader | v6.4 |
+----------------+---------------------+---------+
这是我发现的,但每次列出地址时它都会创建一封电子邮件。它也没有任何代码显示如何将一系列细胞拉入体内。
Sub Test1()
Dim OutApp As Object
Dim OutMail As Object
Dim cell As Range

Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")

On Error GoTo cleanup
For Each cell In Columns("A").Cells.SpecialCells(xlCellTypeConstants)
If cell.Value Like "?*@?*.?*" And _
LCase(Cells(cell.Row, "C").Value) = "yes" Then

Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = cell.Value
.Subject = "Reminder"
.Body = "Hi, please find your account permissions below:"
.Display
End With
On Error GoTo 0
Set OutMail = Nothing
End If
Next cell

cleanup:
Set OutApp = Nothing
Application.ScreenUpdating = True
End Sub
所需的电子邮件输出将类似于:
您好,请在下面找到您的帐户权限:
+----------------+---------------------+---------+
| Email | Application | Version |
+----------------+---------------------+---------+
| test2@test.com | Microsoft_Office_13 | v2.0 |
| test2@test.com | Putty | v3.0 |
| test2@test.com | Adobe_Reader | v6.4 |
+----------------+---------------------+---------+

最佳答案

我使用了我的 answer 中的代码评论中提到并对其进行了修改。
创建一个类并将其命名为 AppInfo。 Here你会发现怎么做

Option Explicit

Public app As String
Public version As String

然后将以下代码放入模块中。假设数据位于从 A1 开始的事件工作表中,标题为电子邮件、应用程序和版本。
Option Explicit

Sub Consolidate()

#If Early Then
Dim emailInformation As New Scripting.Dictionary
#Else
Dim emailInformation As Object
Set emailInformation = CreateObject("Scripting.Dictionary")
#End If

GetEmailInformation emailInformation
SendInfoEmail emailInformation
End Sub


Sub GetEmailInformation(emailInformation As Object)

Dim rg As Range
Dim sngRow As Range

Dim emailAddress As String
Dim myAppInfo As AppInfo
Dim AppInfos As Collection

Set rg = Range("A1").CurrentRegion ' Assuming the list starts in A1 and DOES NOT contain empty row
Set rg = rg.Offset(1).Resize(rg.Rows.Count - 1) ' Cut the headings

For Each sngRow In rg.Rows

emailAddress = sngRow.Cells(1, 1)

Set myAppInfo = New AppInfo
With myAppInfo
.app = sngRow.Cells(1, 2)
.version = sngRow.Cells(1, 3)
End With

If emailInformation.Exists(emailAddress) Then
emailInformation.item(emailAddress).Add myAppInfo
Else
Set AppInfos = New Collection
AppInfos.Add myAppInfo
emailInformation.Add emailAddress, AppInfos
End If

Next

End Sub
Sub SendInfoEmail(emailInformation As Object)

Dim sBody As String
Dim sBodyStart As String
Dim sBodyInfo As String
Dim sBodyEnd As String
Dim emailAdress As Variant
Dim colLines As Collection
Dim line As Variant

sBodyStart = "Hi, please find your account permissions below:" & vbCrLf


For Each emailAdress In emailInformation
Set colLines = emailInformation(emailAdress)
sBodyInfo = ""
For Each line In colLines
sBodyInfo = sBodyInfo & _
"Application: " & line.app & vbTab & "Version:" & line.version & vbCrLf
Next
sBodyEnd = "Best Regards" & vbCrLf & _
"Team"

sBody = sBodyStart & sBodyInfo & sBodyEnd
SendEmail emailAdress, "Permissions", sBody
Next


End Sub

Sub SendEmail(ByVal sTo As String _
, ByVal sSubject As String _
, ByVal sBody As String _
, Optional ByRef coll As Collection)


#If Early Then
Dim ol As Outlook.Application
Dim outMail As Outlook.MailItem
Set ol = New Outlook.Application
#Else
Dim ol As Object
Dim outMail As Object
Set ol = CreateObject("Outlook.Application")
#End If

Set outMail = ol.CreateItem(0)

With outMail
.To = sTo
.Subject = sSubject
.Body = sBody
If Not (coll Is Nothing) Then
Dim item As Variant
For Each item In coll
.Attachments.Add item
Next
End If

.Display
'.Send
End With

Set outMail = Nothing

End Sub

关于excel - 如何使用 Excel VBA 向范围内的唯一用户发送电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51140980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com