Vba 当特定单元格更改时,如何运行Excel宏?[新花样]
我在谷歌上搜索了一下,编写了以下代码,我只想在特定单元格D4发生变化时运行这些代码:Vba 当特定单元格更改时,如何运行Excel宏?[新花样],vba,excel,Vba,Excel,我在谷歌上搜索了一下,编写了以下代码,我只想在特定单元格D4发生变化时运行这些代码: Private Sub Worksheet_Change(ByVal Target As Range) Dim KeyCells As Range Static EmailSent As Boolean Dim Threshold As Integer Dim Cell As String, Email As String, Msg As String Cell = "
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Static EmailSent As Boolean
Dim Threshold As Integer
Dim Cell As String, Email As String, Msg As String
Cell = "D4"
Threshold = 100
Email = Range("E7").Value
Set KeyCells = Range(Cell)
If Not Application.Intersect(Range(Cell), Range(Target.Address)) Is Nothing Then
Dim x As Integer
x = Range(Cell).Value
If x >= Threshold Then
EmailSent = False
ElseIf x < Threshold And Not EmailSent Then
EmailSent = True
Msg = "You only have " & x & " widgets remaining."
MsgBox Msg
SendMail Email, Msg
End If
End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
暗淡的关键单元格作为范围
静态电子邮件以布尔形式发送
将阈值设置为整数
Dim单元格为字符串,电子邮件为字符串,Msg为字符串
Cell=“D4”
阈值=100
电子邮件=范围(“E7”)。值
设置关键单元格=范围(单元格)
如果不是Application.Intersect(范围(单元格),范围(目标地址))则什么都不是
作为整数的Dim x
x=范围(单元格)。值
如果x>=阈值,则
EmailSent=False
ElseIf x<阈值,然后不发送电子邮件
EmailSent=True
Msg=“您只剩下“&x&”小部件。”
MsgBox味精
发送邮件
如果结束
如果结束
端接头
这是可行的,我知道这里有很多类似的问题但我遇到了麻烦:只有当我将D4设置为显式值,比如说“48”
时,这才有效。我希望即使D4是一个公式,它也能工作:因此,如果D4是“=SUM(A4:C4)”
,那么如果该总和低于100,则应发送电子邮件。在这种情况下,此代码不会发送电子邮件:-(
有人知道如何解决这个问题吗?私有子工作表\u Calculate()
Private Sub Worksheet_Calculate()
CheckForMail
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
CheckForMail Target
End Sub
Sub CheckForMail(Optional rng As Range = Nothing)
Static EmailSent As Boolean
Dim KeyCells As Range
Dim Threshold As Integer
Dim Cell As String, Email As String, Msg As String
Dim x As Integer
Cell = "D4"
Set KeyCells = Me.Range(Cell)
'if called from worksheet_change, check the range
If Not rng Is Nothing Then
If Application.Intersect(KeyCells, rng) Is Nothing Then
Exit Sub
End If
End If
Threshold = 100
Email = Me.Range("E7").Value
x = KeyCells.Value
If x >= Threshold Then
EmailSent = False
ElseIf x < Threshold And Not EmailSent Then
EmailSent = True
Msg = "You only have " & x & " widgets remaining."
MsgBox Msg
SendMail Email, Msg
End If
End Sub
支票格式
端接头
私有子工作表_更改(ByVal目标作为范围)
支票格式靶标
端接头
子检查表(可选rng As范围=无)
静态电子邮件以布尔形式发送
暗淡的关键单元格作为范围
将阈值设置为整数
Dim单元格为字符串,电子邮件为字符串,Msg为字符串
作为整数的Dim x
Cell=“D4”
设置关键单元格=Me.范围(单元格)
'如果从工作表_change调用,请检查范围
如果不是,那么rng什么都不是
如果Application.Intersect(KeyCells,rng)什么都不是,那么
出口接头
如果结束
如果结束
阈值=100
Email=Me.Range(“E7”)值
x=关键单元格。值
如果x>=阈值,则
EmailSent=False
ElseIf x<阈值,然后不发送电子邮件
EmailSent=True
Msg=“您只剩下“&x&”小部件。”
MsgBox味精
发送邮件
如果结束
端接头
专用子工作表\u Calculate()
支票格式
端接头
私有子工作表_更改(ByVal目标作为范围)
支票格式靶标
端接头
子检查表(可选rng As范围=无)
静态电子邮件以布尔形式发送
暗淡的关键单元格作为范围
将阈值设置为整数
Dim单元格为字符串,电子邮件为字符串,Msg为字符串
作为整数的Dim x
Cell=“D4”
设置关键单元格=Me.范围(单元格)
'如果从工作表_change调用,请检查范围
如果不是,那么rng什么都不是
如果Application.Intersect(KeyCells,rng)什么都不是,那么
出口接头
如果结束
如果结束
阈值=100
Email=Me.Range(“E7”)值
x=关键单元格。值
如果x>=阈值,则
EmailSent=False
ElseIf x<阈值,然后不发送电子邮件
EmailSent=True
Msg=“您只剩下“&x&”小部件。”
MsgBox味精
发送邮件
如果结束
端接头
当任何贡献单元格发生变化时,您需要检查您的单元格。如果它们在同一张表中,这将起作用:
试试这个:
私有子工作表_更改(ByVal目标作为范围)
Static varD4_old As Variant'静态变量在调用之间保留其值
Dim varD4作为变体
varD4=范围(“D4”).值
如果varD4<;>;varD4_旧,则
调试。打印“D4从”&varD4\u old&“更改为”&varD4
varD4_old=varD4
'现在运行我的更改代码
如果结束
端接头
当任何贡献单元格发生变化时,您需要检查您的单元格。如果它们在同一张表中,这将起作用: 试试这个: 私有子工作表_更改(ByVal目标作为范围) Static varD4_old As Variant'静态变量在调用之间保留其值 Dim varD4作为变体 varD4=范围(“D4”).值 如果varD4<;>;varD4_旧,则 调试。打印“D4从”&varD4\u old&“更改为”&varD4 varD4_old=varD4 '现在运行我的更改代码 如果结束 端接头
除了
工作表\u更改
之外,您还必须处理工作表\u计算
事件参见此,除了工作表\u更改
之外,您还必须处理工作表\u计算
事件参见此
Private Sub Worksheet_Change(ByVal Target As Range)
Static varD4_old As Variant ' Static variables retain their value between calls
Dim varD4 As Variant
varD4 = Range("D4").Value
If varD4 <> varD4_old Then
Debug.Print "D4 changed from " & varD4_old & " to " & varD4
varD4_old = varD4
' NOW RUN MY CHANGE CODE
End If
End Sub