有很多人问这个问题,如果在一列中写算式,如何在旁边列自动计算出结果?
有很多人会建议用 evaluate 函数来实现,我很早以前也写过这种方法,详情请参见
Excel 函数(一) – 用 evaluate 函数自动计算
但是,这种方式仍然要在结果列输入自定义的函数,并没有实现广大网友们要的真正自动化。
要完全自动化,必须使用 VBA,因为只有 VBA 才能根据事件来触发结果。
案例:
如下表所示,A 列是随机列出的一些算式。要求:只要选中 A 列的任意非空区域,就会在 B 列的对应区域自动得出结果。
![6fade1466f95aa73d8ea094374d3a675.png](https://i-blog.csdnimg.cn/blog_migrate/d9b56b230cc49d4eda57192b12bf35cd.jpeg)
这是最终完成效果:
![8f494026fcd2706bc17746188037183a.gif](https://i-blog.csdnimg.cn/blog_migrate/50407b6d358fc024d7fb944e31c39b34.gif)
解决方案:
1. 按 Alt+F11 打开 VBE,输入以下代码:
Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i, n, r, c As Integer, calculator '声明变量 calculator = Selection 'calculator为选中的单元格区域 r = Application.WorksheetFunction.Max(Selection.Cells(1).Row, "2") '获取选中区域的第一个行号,如果行号小于2,则从2开始 n = Selection.Cells(Selection.Cells.Count).Row 'n为选中区域的最后一个行号 c = Selection.Cells.Column '获取选中区域的列号 For i = r To n '历遍选中的区域 If Cells(i, c) <> "" Then '如果选中的单元格不为空 Cells(i, c + 1) = "=" & Cells(i, c) '在右边列出计算结果 End If Next End SubSub 清空() Dim j, k As Integer k = Sheet1.Range("b" & Sheet1.Rows.Count).End(xlUp).Row '找出B列非空的最后一个行号 For j = k To 2 Step -1 '从最后一个非空行向上历遍至第2行 Sheet1.Range("B" & j).Clear '清空B列除B1之外的所有单元格 Next End Sub
![5dae1fca5222153e114d87162f5eaaaf.png](https://i-blog.csdnimg.cn/blog_migrate/27fe0632a89049d99c07cab7b0d786fb.jpeg)
2. 保存后返回 Excel,选择菜单栏的“开发工具”-->“插入”-->“按钮”
![98311100b9cfa9f4c8ba01cfdf82d5ea.png](https://i-blog.csdnimg.cn/blog_migrate/dd07a5b8ac316ac2ceb6418d75c180c8.jpeg)
3. 在弹出的指定宏对话框中选择刚才设置的“清空”作为宏 --> 确定
![578530db937adb4190c7c3469ceb7c26.png](https://i-blog.csdnimg.cn/blog_migrate/5637477515b03601e7534a92d7f251d9.jpeg)
4. 将默认的按钮名称更改为“清空”
![88962d98161318bf1cbb5dd148e6f714.png](https://i-blog.csdnimg.cn/blog_migrate/0beeb20c183fff13f26329400bd72df4.jpeg)
5. 现在就已经完成了,这是演示效果:
![8f494026fcd2706bc17746188037183a.gif](https://i-blog.csdnimg.cn/blog_migrate/50407b6d358fc024d7fb944e31c39b34.gif)