设计缘由
无纸化办公是很多年前的口号了,在此也分享一个很多年前用EXCEL制作的一个小工具,其实现在很多场景也是可以用得上的,希望对大家有用。
在那个还没有IP电话更改号码实施电信诈骗的年代,在那个各行各业还没有全部通过疯狂电话推销业务的年代,在那个手机接听和漫游都需要另外收费的年代,公司固定电话还是主要的业务联系工具,公司是配电话程控交换机的,来电也是有专门电话接线员的。
电话接线员的工作一方面是解答业务咨询和电话转接,另一方面就是来电记录。作为一家IT公司,要是电话记录还是用小本子的方式,有点太LOW了,用电子记录的话,接电话的过程中想完整记下来内容就需要很简便操作才可以,要是等电话挂了后再来补充记录,说不定电话挂了之后又会立马来新的电话。一条一条记录写在表格里面,要是在接电话时候的慌乱操作很容易将前面记录的内容误删除掉。
之所以分享这个文章,可能以上这些类似的问题,也有人遇到过,下面就说一下我当时的解决办法。
解决方案
很多同学对EXCEL并不是特别熟悉,其实EXCEL有着非常强大的功能,公众号前面的文章也分享过一个使用EXCEL做报价工具的内容,有兴趣的朋友可以关注后查阅。两篇文章用到的知识不太一样,上篇文章主要是讲解公式,这篇文章主要是vba宏的编写。

新建一个工作簿,工作簿里面创建6个工作表如上图。其中表单和统计的两个工作表,完成后可以隐藏起来。表单里面就存放一些快捷内容,用于制作下拉按钮里面内容的,比方说员工姓名、来电事由、处理结果等等,方便快捷选择。统计里面就是一条一条的记录。

首页只是为了装点门面的,没啥用,做了四个超链接,分别链接到不同的工作表。所有单元格属性都设成保护---隐藏和锁定。

来电录入工作表中,上面是三个超链接,下面是两个按钮,中间的部分是录入内容。时间这块是自动取当时的时间,这个用个公式就可以了。通过下拉菜单将部分快捷输入部分内容,关键在于两个按钮,下面就将两个按钮对应的vba内容粘贴如下:
保存按钮的代码,代码非常简单,就是将记录的内容写到工作表记录的空行里面:
Sub 来电保存()
Application.ScreenUpdating = False '停止屏幕刷新
'找出记录表中空行的行号,用x表示
Dim x, y
x = 2
Do While Not (IsEmpty(Sheets("记录").Cells(x, 5).Value))
x = x + 1
Loop
y = 2
Do While Not (IsEmpty(Sheets("记录").Cells(y, 17).Value))
y = y + 1
Loop
'来电号码必须输入
If Sheets("来电录入").Range("B7") = "" Then
Sheets("来电录入").Range("B15") = "电话号码不能为空"
Else
Sheets("记录").Cells(x, 1) = x - 1 '序号
Sheets("记录").Cells(x, 2) = Sheets("来电录入").Cells(4, 2) '来电日期
Sheets("记录").Cells(x, 3) = Sheets("来电录入").Cells(4, 5) '来电时间
Sheets("记录").Cells(x, 4) = Sheets("来电录入").Cells(13, 2) '接线人
Sheets("记录").Cells(x, 5) = Sheets("来电录入").Cells(7, 2) '电话号码
Sheets("记录").Cells(x, 6) = Sheets("来电录入").Cells(8, 2) '来电人
Sheets("记录").Cells(x, 7) = Sheets("来电录入").Cells(9, 2) '性别
Sheets("记录").Cells(x, 8) = Sheets("来电录入").Cells(10, 2) '单位
Sheets("记录").Cells(x, 9) = Sheets("来电录入").Cells(11, 2) '事由
Sheets("记录").Cells(x, 10) = Sheets("来电录入").Cells(12, 2) '详细情况
Sheets("记录").Cells(x, 11) = Sheets("来电录入").Cells(14, 2) '回复情况
'记录录入过的日期
If Sheets("记录").Cells(y - 1, 17) <> Sheets("来电录入").Cells(4, 2) Then
Sheets("记录").Cells(y, 17) = Sheets("来电录入").Cells(4, 2)
End If
Range("B7:B15").ClearContents '清除记录中的数据
Range("B7").Select '选中单元格以便输入相关数据
End If
Application.ScreenUpdating = True '开始屏幕刷新
End Sub
清空按钮的代码更简单:
Sub 来电清空()
Range("B7:B15").ClearContents '清除记录中的数据
Range("B7").Select '选中单元格以便输入相关数据
End Sub
代码很简单,也很容易看明白,就不详细解释了,若有疑问可以留言沟通。

处理录入工作表,最上面三个超链接,中间一部分只读内容,然后5个按钮,道理跟上面都是一样,这里只贴代码如下:
Public xx '定义全局指针
Sub 处理查询()
Application.ScreenUpdating = False '停止屏幕刷新
Dim x, i, a, b
'首先查出记录表的行数,用a表示
a = 2
Do While Not (IsEmpty(Sheets("记录").Cells(a, 5).Value)) '认为电话号码非空的一行应该是有记录的一行
a = a + 1
Loop
b = 0 '给标签赋一个初值
x = 2
'找到符合条件的那一行,用x表示
For i = 2 To a - 1
If Sheets("记录").Cells(i, 2) = Sheets("处理录入").Cells(4, 2) Then '来电日期
b = 9 '找到后,标签重新赋值
x = i
xx = i
Exit For
End If
Next
If b = 0 Then
Sheets("处理录入").Range("G6") = "您查询的记录不存在"
Range("B5,E4,E5,B8,D8,F8,B9,B10,B11,B12,B21,G9,G12").ClearContents '清除单元格内容
Range("B4").Select '选中单元格以便输入相关数据
Else
Range("B4,B5,E4,B8,D8,F8,B9,B10,B11,B12,B21,G6,G9,G12,B18,B19,B20").ClearContents '清除单元格内容
Sheets("处理录入").Cells(5, 5) = Sheets("记录").Cells(x, 1) '序号
Sheets("处理录入").Cells(4, 2) = Sheets("记录").Cells(x, 2) '日期
Sheets("处理录入").Cells(4, 5) = Sheets("记录").Cells(x, 3) '时间
Sheets("处理录入").Cells(5, 2) = Sheets("记录").Cells(x, 4) '接线人
Sheets("处理录入").Cells(8, 2) = Sheets("记录").Cells(x, 5) '电话号码
Sheets("处理录入").Cells(8, 4) = Sheets("记录").Cells(x, 6) '来电人
Sheets("处理录入").Cells(8, 6) = Sheets("记录").Cells(x, 7) '性别
Sheets("处理录入").Cells(9, 2) = Sheets("记录").Cells(x, 8) '单位
Sheets("处理录入").Cells(10, 2) = Sheets("记录").Cells(x, 9) '事由
Sheets("处理录入").Cells(11, 2) = Sheets("记录").Cells(x, 10) '详细情况
Sheets("处理录入").Cells(12, 2) = Sheets("记录").Cells(x, 11) '回复情况
End If
Range("B18").Select '选中单元格以便输入相关数据
Application.ScreenUpdating = True '开始屏幕刷新
End Sub
Sub 处理上一条()
Application.ScreenUpdating = False '停止屏幕刷新
Dim x, i, b
b = 0 '给标签赋一个初值
x = xx - 1
'找到符合条件的那一行,用x表示
For i = xx - 1 To 2 Step -1
If Sheets("记录").Cells(i, 2) = Sheets("处理录入").Cells(4, 2) Then '来电日期
b = 9 '找到后,标签重新赋值
x = i
xx = i
Exit For
End If
Next
If b = 0 Then
Sheets("处理录入").Range("G9") = "已到第一条"
Range("B18,B19,B20,G12,G6").ClearContents '清除单元格内容
Range("B4").Select '选中单元格以便输入相关数据
Else
Range("B4,B5,E4,B8,D8,F8,B9,B10,B11,B12,B21,G6,G9,G12,B18,B19,B20").ClearContents '清除单元格内容
Sheets("处理录入").Cells(5, 5) = Sheets("记录").Cells(x, 1) '序号
Sheets("处理录入").Cells(4, 2) = Sheets("记录").Cells(x, 2) '日期
Sheets("处理录入").Cells(4, 5) = Sheets("记录").Cells(x, 3) '时间
Sheets("处理录入").Cells(5, 2) = Sheets("记录").Cells(x, 4) '接线人
Sheets("处理录入").Cells(8, 2) = Sheets("记录").Cells(x, 5) '电话号码
Sheets("处理录入").Cells(8, 4) = Sheets("记录").Cells(x, 6) '来电人
Sheets("处理录入").Cells(8, 6) = Sheets("记录").Cells(x, 7) '性别
Sheets("处理录入").Cells(9, 2) = Sheets("记录").Cells(x, 8) '单位
Sheets("处理录入").Cells(10, 2) = Sheets("记录").Cells(x, 9) '事由
Sheets("处理录入").Cells(11, 2) = Sheets("记录").Cells(x, 10) '详细情况
Sheets("处理录入").Cells(12, 2) = Sheets("记录").Cells(x, 11) '回复情况
xx = x
End If
Range("B18").Select '选中单元格以便输入相关数据
Application.ScreenUpdating = True '开始屏幕刷新
End Sub
Sub 处理下一条()
Application.ScreenUpdating = False '停止屏幕刷新
Dim x, a, i, b
'首先查出记录表的行数,用a表示
a = 2
Do While Not (IsEmpty(Sheets("记录").Cells(a, 5).Value)) '认为电话号码非空的一行应该是有记录的一行
a = a + 1
Loop
b = 0 '给标签赋一个初值
x = xx + 1
'找到符合条件的那一行,用x表示
For i = xx + 1 To a - 1
If Sheets("记录").Cells(i, 2) = Sheets("处理录入").Cells(4, 2) Then '来电日期
b = 9 '找到后,标签重新赋值
x = i
xx = i
Exit For
End If
Next
If b = 0 Then
Sheets("处理录入").Range("G12") = "已到最后一条"
Range("B18,B19,B20,G9,G6").ClearContents '清除单元格内容
Range("B4").Select '选中单元格以便输入相关数据
Else
Range("B4,B5,E4,B8,D8,F8,B9,B10,B11,B12,B21,G6,G9,G12,B18,B19,B20").ClearContents '清除单元格内容
Sheets("处理录入").Cells(5, 5) = Sheets("记录").Cells(x, 1) '序号
Sheets("处理录入").Cells(4, 2) = Sheets("记录").Cells(x, 2) '日期
Sheets("处理录入").Cells(4, 5) = Sheets("记录").Cells(x, 3) '时间
Sheets("处理录入").Cells(5, 2) = Sheets("记录").Cells(x, 4) '接线人
Sheets("处理录入").Cells(8, 2) = Sheets("记录").Cells(x, 5) '电话号码
Sheets("处理录入").Cells(8, 4) = Sheets("记录").Cells(x, 6) '来电人
Sheets("处理录入").Cells(8, 6) = Sheets("记录").Cells(x, 7) '性别
Sheets("处理录入").Cells(9, 2) = Sheets("记录").Cells(x, 8) '单位
Sheets("处理录入").Cells(10, 2) = Sheets("记录").Cells(x, 9) '事由
Sheets("处理录入").Cells(11, 2) = Sheets("记录").Cells(x, 10) '详细情况
Sheets("处理录入").Cells(12, 2) = Sheets("记录").Cells(x, 11) '回复情况
xx = x
End If
Range("B18").Select '选中单元格以便输入相关数据
Application.ScreenUpdating = True '开始屏幕刷新
End Sub
Sub 处理保存()
Application.ScreenUpdating = False '停止屏幕刷新
If Sheets("处理录入").Range("B8") = "" Then
Sheets("处理录入").Range("B21") = "请先选中要处理的记录"
Else
Dim x
x = xx
'首先判断有没有被处理过
If Sheets("记录").Cells(x, 16) <> "" Then
Sheets("处理录入").Range("B21") = "此记录已被处理,不能再次处理"
Else
'处理人必须输入
If Sheets("处理录入").Range("B20") = "" Then
Sheets("处理录入").Range("B21") = "处理人不能为空"
Else
Sheets("记录").Cells(x, 12) = Sheets("处理录入").Cells(16, 2) '处理日期
Sheets("记录").Cells(x, 13) = Sheets("处理录入").Cells(16, 5) '处理时间
Sheets("记录").Cells(x, 14) = Sheets("处理录入").Cells(18, 2) '处理情况
Sheets("记录").Cells(x, 15) = Sheets("处理录入").Cells(19, 2) '处理结果
Sheets("记录").Cells(x, 16) = Sheets("处理录入").Cells(20, 2) '处理人
Range("B18:B21").ClearContents '清除单元格内容
End If
End If
Range("B18").Select '选中单元格以便输入相关数据
Application.ScreenUpdating = True '开始屏幕刷新
End If
End Sub
Sub 处理清空()
Range("B4,B5,E4,E5,B8,D8,F8,B9,B10,B11,B12,B21,G6,G9,G12").ClearContents '清除单元格内容
End Sub

来电查询工作表,上面三个超链接,中间一些内容单元格,下面四个按钮,按钮对应的代码相信不用再过多介绍了,程序员被称为码农,因为一直做着重复的事情。
写在后面
EXCEL里面插入按钮,很多同学可能会觉得新鲜,估计学校都没有怎么教过。在这里给大家稍微普及一下,有兴趣的同学可以试试。希望这篇文章对各位有所作用。
vba是逻辑非常简单的代码,同时还由EXCEL提供了界面,连界面设计都省了,结合EXCEL自带的公式,是个非常好用的工具。
也提醒大家一下,vba可是啥都能做得到的哟,比方说关机按钮,比方说文件操作,数据库操作,磁盘操作,信息读取等等,杀毒软件厂商是很懂的,所以有宏病毒之说。不了解vba,可能打开一个office文档都会中招!
感谢各位的阅读,本公众号会持续分享实际的服务案例,若感兴趣请关注该公众号。
需要上门解决问题时,请及时联系我们!




