Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Excel 如果单元格';内容被删除_Excel_Vba - Fatal编程技术网

Excel 如果单元格';内容被删除

Excel 如果单元格';内容被删除,excel,vba,Excel,Vba,我正在尝试创建一个Excel VBA宏,该宏将检测一次是否更改了多个单元格。我还希望它忽略代码,如果一个人只是删除单元格 这可用于检查是否更改了多个单元格,并可防止更改: Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target.Cells.Count > 1 Then MsgBox "Change only one cell

我正在尝试创建一个Excel VBA宏,该宏将检测一次是否更改了多个单元格。我还希望它忽略代码,如果一个人只是删除单元格

这可用于检查是否更改了多个单元格,并可防止更改:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False

    If Target.Cells.Count > 1 Then
        MsgBox "Change only one cell at a time", , "Too Many Changes!"
        Application.Undo
    End If

    Application.EnableEvents = True
End Sub
我试图找出如何获取它,以便在删除单元格内容时忽略它。我用
keyacii
Chr
ClearContents
和其他一些东西尝试了许多组合。我似乎无法让它工作。下面是我最后尝试的东西

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False

    If Target.Cells.Count > 1 Then
        If KeyAscii <> vbKeyDelete Then
            MsgBox "Change only one cell at a time", , "Too Many Changes!"
            Application.Undo
        End If
    End If

    Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
Application.EnableEvents=False
如果Target.Cells.Count>1,则
如果键入ASCII vbKeyDelete,则
MsgBox“一次只更改一个单元格”,“更改太多!”
应用程序。撤消
如果结束
如果结束
Application.EnableEvents=True
端接头
如果有人有任何建议,请告诉我。

试试这个

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cl As Variant
    Dim dat As Variant
    Application.EnableEvents = False

    If Target.Cells.Count > 1 Then
        dat = Target.Formula

        For Each cl In dat
            If cl <> "" Then
                MsgBox "Change only one cell at a time", , "Too Many Changes!"
                Application.Undo
                Exit For
            End If
        Next
    End If

    Application.EnableEvents = True

End Sub
Private子工作表\u更改(ByVal目标作为范围)
Dim cl作为变体
Dim dat作为变量
Application.EnableEvents=False
如果Target.Cells.Count>1,则
dat=目标。公式
对于dat中的每个cl
如果cl“”那么
MsgBox“一次只更改一个单元格”,“更改太多!”
应用程序。撤消
退出
如果结束
下一个
如果结束
Application.EnableEvents=True
端接头
说明:

dat=Target.Formula
将公式从一个范围复制到一个二维变量数组中。
.Formula
是为了避免将恰好返回空字符串的公式视为空白
对于dat中的每个cl
迭代数组的每个元素
如果
cl
为非空,则用户不能删除该范围,因此触发然后消息并撤消


我本可以对Target中的每个Cl使用
(其中
Cl
被暗显为
Range
),但是复制到变体数组比在一个范围内循环更快。

非常感谢您发布这篇文章,这很好,确实有效。你能解释一下公式是什么吗?这只是表示多个已更改单元格中的内容(文本),还是表示选定单元格的数量或其范围,还是表示所有这些内容(内容、单元格数量和范围)?一旦我理解了。公式,我就会理解dat变量是什么。cl变量是什么,因为它除了作为一个变量外,在任何地方都没有定义。就像我理解dat是什么,因为它等于某物(也就是说,一旦我理解了什么,公式是什么,我就会理解它是什么),但是cl不等于任何东西。我认为cl=“”,因为它没有定义,所以它是空的。如果这是正确的,那么当我删除某个内容时,我认为发生的是每个空单元格,即cl变量,在dat变量中搜索任何非空单元格。比如,如果删除了3个单元格,那么它会在搜索一个非空单元格时循环三次。如果你不介意的话,你能给我解释一下吗?我很感谢代码,它将非常有用,但我真的很想了解我正在使用的代码是如何工作的。通常我能够创建自己的代码,但这一条确实难住了我,我不完全理解它。再次感谢您的帮助,ChrisA range的
Formula
属性是一个包含该范围内所有公式的数组。对于包含常数的单元格,其
公式
等于其
Cl
For
循环填充,每次循环中都有一个来自
dat
的值。为了帮助理解这一点,在代码上放置一个断点,并在监视窗口中检查变量,同时单步执行代码。感谢您的解释,我非常感谢。我以前确实一步一步地看了一遍代码,但还是有点困惑,但您为我澄清了这一点。再次感谢。