【问题标题】:Prevent More than 1 cell From Being Changed While Ignoring if the Cells' Contents Were Deleted防止超过 1 个单元格被更改,同时忽略单元格的内容是否被删除
【发布时间】:2013-06-24 07:27:41
【问题描述】:

我正在尝试创建一个 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

我试图弄清楚如何获取它,以便在删除单元格的内容时忽略它。我已经尝试了许多使用KeyAsciiChrClearContents 和其他一些东西的组合。我似乎无法让它工作。以下是我尝试的最后一件事。

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

如果有人有任何建议,请告诉我。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    试试这个

    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
    

    解释:

    dat = Target.Formula 将公式从范围复制到二维变量数组中。
    .Formula 是为了避免将碰巧返回空字符串的公式视为空白 For Each cl in dat 迭代数组的每个元素
    如果cl 不为空,则用户无法删除范围,因此触发消息并撤消

    我本可以使用For Each Cl in Target(其中cl 变暗为Range),但复制到变体数组比在范围内循环更快。

    【讨论】:

    • 非常感谢您发布此内容,这很棒,它确实有效。你能解释一下.Formula是什么吗?这只是表示多个更改单元格中的内容(文本),还是表示选定单元格的数量或其范围,或所有这些(内容、单元格数量和范围)?一旦我理解了 .Formula,我就会明白 dat 变体是什么。
    • 什么是 cl 变体,因为除了变体之外,它没有在任何地方定义。就像我了解 dat 是什么,因为它等于某些东西(也就是说,一旦我了解 .Formula 是什么,我就会明白它是什么),但 cl 不等于任何东西。我认为 cl = “” 因为它没有定义,所以它是空的。如果这是正确的,那么当我删除某些内容时,我认为正在发生的事情是每个空单元格,即 cl 变体,正在 dat 变体中搜索任何非空的单元格。就像删除了 3 个单元格一样,它会循环 3 次搜索一个非空的单元格。
    • 如果你不介意,能不能给我解释一下?我很感激代码,它会很有帮助,但我真的很想了解我正在使用的代码是如何工作的。通常我能够创建自己的代码,但这个确实难倒了我,我并不完全理解它。再次感谢您的帮助,克里斯
    • 范围的Formula 属性是一个包含范围内所有公式的数组。对于包含常量的单元格,它们的Formula 等于它们的ValueClFor 循环填充,每次通过循环时,dat 中的一个值。为了帮助理解这一点,请在代码上放置一个断点,并在单步执行代码时检查观察窗口中的变量。
    • 感谢您的解释,我很感激。我之前确实单步执行了代码,但仍然有些困惑,但是您为我澄清了。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多