用Excel做工程预决算的时候,一个最常见的需求是在某个单元格中输入工程量的计算式,然后在计算式右侧的相邻单元格中显示出计算式的结果,示例图如下:
要在计算结果栏中算出计算结果,最笨的方法当然是点计算器算出结果了填上(为什么说这个方法最笨恕不解释),第二笨的方法是在计算结果对应的单元格中写上`=`号再重抄一遍公式(请恕同样不给出解释)。
笨办法说完了,该比较聪明的方法出场了:利用宏表函数。具体做法如下(千言万语比不上一个动图):
上面的演示中将单元格的绝对引用改为相对引用,主要是为了方便下拉公式时自动改变引用的单元格。
下面才是本文的主角——利用VBA来自动计算表达式并将结果填写在右侧相距distance列的单元格中。使用VBA的好处是:只要在计算使单元格中完成了计算式的填写,结果就自动显示,无需在对应的计算结果单元格中输入“=计算结果”之类引用名称的公式,而且可以兼容多个Excel版本(在早期Excel版本中,不支持`×、÷`这样的运算符)。
这次的VBA代码不再写在通用模块中,而是写在worksheet的change事件中。方法是打开VBA编辑器后点击如下图红色方框中的下拉按钮,分别选中Worksheet和Change:
代码编辑框中即自动出现如下代码块:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
我们的代码就放在这个代码块里。完整代码如下:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim xR As Range, tmp, flag As String, distance As Integer
flag = "计算式"
distance = 1
Set xR = Cells.Find(flag)
If Not xR Is Nothing Then
If Target.Column = xR.Column And Target.Row > xR.Row Then
On Error GoTo er
tmp = Cells(Target.Row, Target.Column)
If tmp <> "" Then
tmp = Replace(tmp, "+", "+")
tmp = Replace(tmp, "-", "-")
tmp = Replace(tmp, "×", "*")
tmp = Replace(tmp, "÷", "/")
tmp = Replace(tmp, "(", "(")
tmp = Replace(tmp, ")", ")")
tmp = Replace(tmp, vbCr, "")
Cells(Target.Row, Target.Column + distance) = "=" & tmp
End If
Else
End
End If
Else
MsgBox "没有找到计算式所在列的标题,请检查计算式所在列的标题与本宏代码第三行标题是否一致。"
End
End If
er:
MsgBox "您可能输入了无效的算式!"
Cells(Target.Row, Target.Column + distance ) = Cells(Target.Row, Target.Column)
End Sub
当然,如果你的计算式所在列的标题不是“计算式”而是其他标志,你只需要修改`flag`变量的值,但应该注意的是,这个标志在整个工作表中最好是唯一的,否则我也没测试会发生什么不测事件。