如何不通过双击单元格或按 F2 来执行脚本

How NOT to execute a script by double-clicking on a cell or pressing F2

提问人:BugFix 提问时间:9/18/2023 最后编辑:BugFix 更新时间:9/20/2023 访问量:69

问:

显示的过程适用于不允许更改的现有输入掩码。我能够通过公式从不同的单元格收集多个数据,但用户必须能够在不影响此公式的情况下输入数字。我真的是 VBA 的新手,但用户(不愿意)或根本无法理解简单的 excel 程序。

此脚本按选择存储单元格的内容。

通过工作表更改(单元格获得新输入),单元格中的公式将在右括号前的左侧部分作为字符串划分,在右侧部分作为值(长整型)划分。结果是公式(左部分)和值(右部分)加上所选(初始)单元格中的输入。

这些公式包含对其他单元格和总值的引用,例如 示例中的公式仅用于说明=WENNFEHLER(AUFRUNDEN(C376/$M$369+P509;0);0)+0

一般来说,这很好用,但我的错误处理似乎一团糟。此外,我的代码对我来说很容易理解,但它是最优的吗?

脚本不得:

  • 当用户双击单元格或按键盘上的 F2 时被激活(< - 可能不是错误,而是避免无意输入的主要问题)似乎得到了解决,可以让我的一天......但是当我有一个带有 Value 但没有公式的单元格时,当我计数时会导致问题,例如 6+6 :( < - 解决了If Target.CountLarge <> 1 Or Target.HasFormula And Target.Formula = OldValues(1) Then Exit Sub
  • 当选择<求解的 1 个以上单元格时运行
  • 单击工作表的左上角或按键盘上的 Strg+A 选择所有单元格时运行(< - 主要问题) < - 已解决
  • 当形状、按钮或其他东西发生变化时运行<似乎是不可能的,所以它被解决了

我试图包括,但我使 Excel 崩溃,因此非常欢迎一些帮助。On Error Goto ...

进行任何更改后,脚本运行良好,如下所示:

Dim OldValues As New Collection

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Target.CountLarge = 1 And Not Intersect(Target, Range("C9:C853")) Is Nothing Then
        Set OldValues = Nothing
        OldValues.Add Target.Formula
        Debug.Print OldValues(1)
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.CountLarge <> 1 Or Target.HasFormula And Target.Formula = OldValues(1) Then Exit Sub
    Dim r As Long, c As Long, ValInput As Long, ValShortFormula As String, ValFormulaEnd As Long
    Dim keyCells As Range: Set keyCells = Range("C9:C853")
    On Error Resume Next
    Set keyCells = Application.Union(keyCells.Precedents, keyCells)
    Application.EnableEvents = False
        If Not Application.Intersect(Target, keyCells) Is Nothing Then
            r = Target.Row
            c = Target.Column
            ValInput = Target.Value
            ValShortFormula = Left(OldValues(1), InStrRev(OldValues(1), ")") - 0)
            ValFormulaEnd = Right(OldValues(1), Len(OldValues(1)) - InStrRev(OldValues(1), ")"))
            Debug.Print OldValues(1)
            Debug.Print ValInput
            Debug.Print ValShortFormula
            Debug.Print ValFormulaEnd
                    Cells(r, c).Formula = ValShortFormula & "+" & ValFormulaEnd + ValInput
                    Set OldValues = Nothing
                    OldValues.Add Target.Formula
        End If
    Application.EnableEvents = True
End Sub

但我相信还有很大的改进空间,我会欣赏一些提示:)

example setup

脚本的执行可能是由识别为输入触发的。我没有找到任何提示如何将此操作与实际输入(正数或负数)进行比较,比较值可能无济于事,因为它会得到相同的结果。

溢出错误可能来自将所有单元格存储到集合中?如何处理?我想过以不同的方式定义变量,但同样没有找到解决方案。

希望描述是可以理解的并且足够广泛 提前谢谢:)

Excel VBA 错误处理

评论

0赞 ValNik 9/18/2023
您可以使用 sheet event 。查看 learn.microsoft.com/ru-ru/office/vba/api/...BeforeDoubleClick
0赞 Tim Williams 9/18/2023
Target始终是一个范围,因此您无需测试TypeName(Target) <> "Range"
0赞 Tim Williams 9/18/2023
If Target.CountLarge > 1应该解决溢出问题。 无法处理选择整个工作表的情况。查看 learn.microsoft.com/en-us/office/vba/api/excel.range.countlargeTarget.Count
0赞 Tim Williams 9/19/2023
如果您仅响应For Each cell In TargetTarget
0赞 BugFix 9/19/2023
非常感谢大家!@ValNik -> 是个好主意,但我找到了一种更聪明的方法(对我来说),用更少的努力解决了溢出错误(Thx @Tim Williams),并且仅在检测到公式等于集合值时才退出宏。BeforeDoublecClickIf Target.CountLarge <> 1 Or Target.HasFormula And Target.Formula = OldValues(1) Then Exit Sub

答: 暂无答案