【发布时间】:2018-06-14 22:52:28
【问题描述】:
我正在寻求一些 VBA 代码的帮助。
我有一个包含多列和多行的 Excel 表。每行代表一个不同的报告,我必须创建并通过电子邮件发送给特定的收件人。每个报告都是特定于工作日的。我要做的是以下。自动为给定工作日的每一行创建一封电子邮件。我在下面粘贴的代码可以完美地创建一封电子邮件,但我想避免每行都有一个宏按钮。
我希望代码在给定工作日内循环播放每一行。例如,如果第 1 个工作日有 10 份报告,则单击宏会生成 10 封不同的唯一电子邮件。
我尝试创建一个 do while 循环,但我在使用该方法时遇到了一些问题,我不完全确定如何处理主题和正文,它们是连接的文本单元格,每行都是唯一的。
Sub makeReports(dueDate As Date)
Dim reportsRange As Range
Dim xlCell As Range
Dim objOutlook As Outlook.Application
Dim strTo As String
Dim strCc As String
Dim strSubject As String
Dim strBody As String
'Determine reports range (from uppermost cell to last nonempty cell in column)
Set reportsRange = Range("B5", Range("B" & Cells.Rows.Count).End(xlUp))
Set objOutlook = CreateObject("Outlook.Application")
For Each xlCell In reportsRange
If xlCell.Value = dueDate Then
strTo = xlCell.Offset(0, 5).Value
strCc = xlCell.Offset(0, 6).Value
strSubject = xlCell.Offset(0, 10).Value
strBody = xlCell.Offset(0, 11).Value
Call createMail(objOutlook, strTo, strCc, strSubject, strBody)
End If
Next xlCell
Set objOutlook = Nothing
End Sub
Sub createMail(objOutlook As Outlook.Application, strTo As String, strCc As String, strSubject As String, strBody As String)
Dim objMail As Outlook.MailItem
Set objMail = objOutlook.CreateItem(0)
With objMail
.To = strTo
.cc = strCc
.Subject = strSubject
.Body = strBody
.display
' If you want to send:
'.Send
End With
Set objMail = Nothing
End Sub
Sub test()
Call makeReports(1)
End Sub
Private Sub CommandButton1_Click()
Call makeReports(Date)
End Sub
第三次编辑:
我附上了工作日功能的屏幕截图,以确定正确的交付日期
截图
【问题讨论】:
-
您是否考虑过查找最后一行并使用
For循环遍历您的行? -
充分利用自动化。如果您可以用您已经提供的一些额外细节来修改您的问题:逐步对每一行的决策过程进行逻辑分解。如,工作日列在哪里?是数字还是文本工作日?是什么决定了在构建主题和正文时使用哪些列?之类的东西。让它变得非常简单,并将其分解成单独的语句,如下所示: 1. 我查看一行,如果 B 列中的值 =“星期一”,那么 2. 我查看 C 列。如果是这样,那么 3. 我合并正文的 F 和 G 列,然后...
-
您还需要告诉我们如何识别要处理的行数。我假设您首先选择一天(这是一列?),然后找到该列的底部,并且只处理每行包含一个值的单元格。日子是 1-31 还是周一到周五?
-
大家好。我可以帮忙澄清一下。工作日可以是表示工作日的任何内容。我在想我们可以在第一天使用 1,在第二天使用 2,依此类推。随着我们添加和删除报告,未来行数可能会发生变化,因此如果代码会在工作日列上执行某种类型的计数以查看我们有多少工作日 1 报告,这将很有帮助。让我知道我是否可以进一步澄清。我确实在上面发布了我的更新代码供您参考。我建立了一个 for 循环,我想我已经接近了。
-
我现在收到运行时错误 91,因为未设置对象变量或 With 块变量。这出现在生成第一封电子邮件之后,我想当代码循环到下一个 i 时。有什么建议吗?