vba - VBA 使用 Worksheet_Calculate 在单元格更改时发送电子邮件
问题描述
因此,我的代码会遍历一系列单元格并触发一封电子邮件,条件是,在本例中,N150 = F150。这有效,电子邮件已发送。但我发现困难的是在电子邮件正文中引用更改的单元格。您可以在 xMailBody 变量中看到我尝试过 cll.Offset(0, -12) ,因此当 N150 = F150 时,单元格值为左侧 12 列,应为 B150。相反,我得到的 B145 的值是正确的,因为它是正确的列,但显然是不正确的行。我的目标范围是 N145:N160 所以我认为它只是引用我范围内的第一行。任何帮助将不胜感激,试图解决这个问题几天!
Dim target As Range
Dim cll As Range
Private Sub Worksheet_Calculate()
Set target = Range("N145:N160")
For Each cll In target
If (Range("N150") = Range("F150"))
Call Mail_small_Text_Outlook(target)
Exit For
End If
Next
End Sub
Sub Mail_small_Text_Outlook()
Dim xOutApp As Object
Dim xOutMail As Object
Dim xMailBody As String
Set xOutApp = CreateObject("Outlook.Application")
Set xOutMail = xOutApp.CreateItem(0)
xMailBody = "Hi there" & vbNewLine & vbNewLine & _
cll.Offset(0, -12) & " has reached its target"
On Error Resume Next
With xOutMail
.To = "email"
.CC = ""
.BCC = ""
.Subject = "Target Reached"
.Body = xMailBody
.Send 'or use .Display
End With
On Error GoTo 0
Set xOutMail = Nothing
Set xOutApp = Nothing
End Sub
解决方案
您从 N145:N160 循环,但只检查 Range("N150") = Range("F150")。如果该检查为真,那么当 cll 为 N145 时,它在第一次迭代时为真,因此发送电子邮件并退出循环,因此不会处理其他 cll。
...
Set target = Range("N145:N160")
For Each cll In target
If cll = cll.offset(0, -12) then
'cll is public, no need to pass it or target across
Mail_small_Text_Outlook
Exit For
End If
Next
...
推荐阅读
- google-cloud-platform - 云构建在哪个区域执行其构建?
- cucumber - Cucumber 6.9 java8,无法从 DataTable 转换为自定义类型
- algorithm - Codility CommonPrimeDivisors 时间复杂度?
- c# - 使用 Powershell .Net 方法将 XML 转换为 HTML
- python - Fasttext 自动参数调优训练集
- javascript - React-admin:如何在使用
? - reactjs - 美居码头无法正确配置 CORS 问题
- coordinates - 如何从 st_coordinates 制作的坐标矩阵重建一个 sf 对象?
- reactjs - 如何在我定制的 React 网站中将产品目录集成到我的 Facebook Pixel?
- javascript - Discord JS:TypeError:无法读取未定义的属性“id”