为了避免用户在单元格中输入算术运算之前键入=(即5+2、8*8等(,我有以下代码:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Not Intersect(Target, Range("C4:C303")) Is Nothing Then
If Target = "" Then Exit Sub
Application.EnableEvents = False
TempTarget = Target
Target = "=" & TempTarget
If IsError(Target) Then Target = TempTarget
Application.EnableEvents = True
End If
On Error GoTo 0
结束子
它适用于加法(5+5(和乘法(9*55(,但不适用于小数字(5-2,8/9(的除法和减法,因为Excel将它们视为日期。它适用于带有较大数字(不可能是日期(的减法和除法。我想在单元格中有算术公式,但要显示结果。如何修复代码,使其始终按照我想要的方式工作?
这并不像看上去那么简单。如果输入像5-2
或8/9
这样的值,则在Excel将单元格更改为Date格式之前,无法截取单元格发生的更改。
然而,有一个解决方案,尽管它可能不适合您的目的。
-
将要将其应用于的每个单元格的格式(推测为
C4:C303
(设置为";CCD_ 4";或";@
";。 -
在设置单元格的值之前,请更改代码以包括添加的
Target.NumberFormat = "General"
。
实现这一目标的代码如下所示:
...
Application.EnableEvents = False
TempTarget = Target
' Add this line to change the format back to General
Target.NumberFormat = "General"
Target = "=" & TempTarget
...
这将正确处理5-2
或8/9
等情况,否则这些情况将自动变为日期。
副作用
这产生了不希望的副作用,即如果稍后再次编辑现有计算单元中的一个;CCD_ 9";格式而不是文本。
这可以通过使用CCD_ 10事件并通过将单元的格式设置为"0"来解决;CCD_ 11";或";CCD_ 12";同样,如果它在您正在处理的范围内,但如果用户不编辑单元格的值,则您希望撤消该操作。
有点乱。Excel显然不适合这种方法。