提问人:BugFix 提问时间:9/18/2023 最后编辑:BugFix 更新时间:9/20/2023 访问量:69
如何不通过双击单元格或按 F2 来执行脚本
How NOT to execute a script by double-clicking on a cell or pressing F2
问:
显示的过程适用于不允许更改的现有输入掩码。我能够通过公式从不同的单元格收集多个数据,但用户必须能够在不影响此公式的情况下输入数字。我真的是 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
但我相信还有很大的改进空间,我会欣赏一些提示:)
脚本的执行可能是由识别为输入触发的。我没有找到任何提示如何将此操作与实际输入(正数或负数)进行比较,比较值可能无济于事,因为它会得到相同的结果。
溢出错误可能来自将所有单元格存储到集合中?如何处理?我想过以不同的方式定义变量,但同样没有找到解决方案。
希望描述是可以理解的并且足够广泛 提前谢谢:)
答: 暂无答案
评论
BeforeDoubleClick
Target
始终是一个范围,因此您无需测试TypeName(Target) <> "Range"
If Target.CountLarge > 1
应该解决溢出问题。 无法处理选择整个工作表的情况。查看 learn.microsoft.com/en-us/office/vba/api/excel.range.countlargeTarget.Count
For Each cell In Target
Target
BeforeDoublecClick
If Target.CountLarge <> 1 Or Target.HasFormula And Target.Formula = OldValues(1) Then Exit Sub