Excel VBA:编辑单元格时创建确认提示

Excel VBA:编辑单元格时创建确认提示,excel,prompt,vba,Excel,Prompt,Vba,我正在尝试创建一个确认,以便当单元格为空时,会启动一个提示。如果用户单击“确认”,单元格将保持空白,否则单元格将返回原始值。我有以下问题,但它不起作用,我希望有人能解决这个问题: Private Sub MYtest() Dim vatcell As Range Set vatcell = Worksheets("Invoice").Range("D11:D11") If vatcell = "" Then response = MsgBox("Are you sure you want t

我正在尝试创建一个确认,以便当单元格为空时,会启动一个提示。如果用户单击“确认”,单元格将保持空白,否则单元格将返回原始值。我有以下问题,但它不起作用,我希望有人能解决这个问题:

Private Sub MYtest()
Dim vatcell As Range
Set vatcell = Worksheets("Invoice").Range("D11:D11")
If vatcell = "" Then

 response = MsgBox("Are you sure you want to change the VAT ammount?" & Chr(10) & Chr(10) _
                        & "Value = " & vatcell & Chr(10) & Chr(10) _
                        & "Do you really want to change it?", vbYesNo + vbQuestion, "Value Already Entered")
            If response = vbYes Then
                vatcell = ""
            Else
                vatcell = vatcell
                End If
                End If
End Sub
提前谢谢

Daryll的脚本不起作用:

我相信您希望这是一个事件过程。下面检查工作表“发票”每次更改时单元格D11是否已更改。请注意,这必须存储在VBE中的工作表“发票”中

Private Sub Worksheet_Change(ByVal Target as Range)
Dim vatcell As Range
Set vatcell = Worksheets("Invoice").Range("D11:D11")

If Not Intersect(Target,vatcell) is Nothing Then

 response = MsgBox("Are you sure you want to change the VAT ammount?" & Chr(10) & Chr(10) _
                        & "Value = " & vatcell & Chr(10) & Chr(10) _
                        & "Do you really want to change it?", vbYesNo + vbQuestion, "Value Already Entered")
End If

If response = vbYes Then
vatcell = ""
Else
vatcell = vatcell
End If
End Sub

您的解决方案缺少两部分。首先,您需要在单元格更改之前存储其值。其次,您需要连接到一个事件,该事件会在单元格内容发生更改时通知您

' This is where you store the value before it was changed
Private last_vat As Variant

' this is where you capture the value when the worksheet is first loaded
Private Sub Worksheet_Activate()
    Dim vatcell As Range
    Set vatcell = Range("D11")
    last_vat = vatcell.Value
End Sub

' This is where you respond to a change
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vatcell As Range
    Set vatcell = Range("D11")
    ' Make sure the cell that changed is the one you are interested in
    If Target = vatcell Then
        ' If it changed from something to nothing
        If vatcell.Value = "" And last_vat <> "" Then
            response = MsgBox("Are you sure you want to clear the VAT ammount?" & Chr(10) & Chr(10) _
                        & "Previous Value = " & last_vat & Chr(10) & Chr(10) _
                        & "Do you really want to change it?", vbYesNo + vbQuestion, "Value Already Entered")
            If response = vbYes Then
                ' Allow the change (by doing nothing)
            Else
                ' Reject the change
                vatcell = last_vat
            End If
        End If
        ' Save changes from non-blank to different non-blank value
        last_vat = vatcell.Value
    End If
End Sub
“这是更改前存储值的位置
作为变体的私人增值税
'这是首次加载工作表时捕获值的位置
专用子工作表_Activate()
暗淡的vatcell As范围
设置vatcell=范围(“D11”)
last_vat=vatcell.Value
端接头
“这是你应对变化的地方
私有子工作表_更改(ByVal目标作为范围)
暗淡的vatcell As范围
设置vatcell=范围(“D11”)
'确保更改的单元格是您感兴趣的单元格
如果目标=vatcell,则
“如果它从某物变为无物
如果vatcell.Value=“”和最后一个“vat”,则
response=MsgBox(“您确定要清除增值税金额吗?”&Chr(10)和Chr(10)_
&“上一个值=”&上一个增值税和现金(10)&现金(10)_
&“是否确实要更改它?”,vbYesNo+vbQuestion,“值已输入”)
如果响应=vbYes,则
'允许更改(不执行任何操作)
其他的
“拒绝改变
vatcell=最后一个vat
如果结束
如果结束
'将更改从非空值保存到不同的非空值
last_vat=vatcell.Value
如果结束
端接头

这不是VB.NET代码Hi Darryl,感谢您的回复,对图片表示抱歉。当注释就位时,我得到一个错误9,当我删除注释时,脚本被忽略。有没有办法解决这个问题?我已经把代码放在图片中,因为我是VBA新手,我不知道我是否犯了错误。谢谢。我从Excel VBA编辑器逐字复制了代码,包括注释。我正在使用Excel 2010。你的截图看起来好像你把代码放在了正确的地方,所以我不确定出了什么问题。看起来您已经这样做了,但我把它放在这里:首先确保您有一个名为Invoice的选项卡。然后从“开发人员”功能区选项卡中,单击Visual Basic。右键单击左侧的Sheet1(发票),选择查看代码。复制并粘贴代码,然后关闭窗口。这对我来说很有效(我只是从头再尝试一次)。谢谢Daryyl,不知道那里发生了什么,但现在似乎已经解决了。我稍微编辑了脚本,当值小于或等于100时打开提示,这很有效,但当我按no时,提示会一直打开。单击大约30次后,我就会离开。我认为这是因为新值与此语句一致,但在脚本中,如果框为空,那么它也应该激活吗?我已经将上面的响应行替换为:If-vatcell.Value如果单元格的值是,比如说,30,那么修改后的If语句将一次又一次地传递。那是因为
vatcell.Value