Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 当特定单元格更改时,如何运行Excel宏?[新花样]_Vba_Excel - Fatal编程技术网

Vba 当特定单元格更改时,如何运行Excel宏?[新花样]

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 = "

我在谷歌上搜索了一下,编写了以下代码,我只想在特定单元格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 = "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