0

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

我试图弄清楚如何获取它,以便在删除单元格的内容时忽略它。我已经尝试了许多使用KeyAscii, 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

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

4

1 回答 1

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 TargetclDim'ed as 的位置Range),但复制到变体数组比在范围内循环更快。

于 2013-06-24T07:41:00.310 回答