手工操作完成EXCEL表中客户手机号的划分
售后部门送来一张EXCEL表,包括了客户的姓名和所有在系统中登记过的联系电话,想让我把其中的联通号码筛选出来使用,看了一下,感觉使用EXCEL手工操作要比数据库、写代码要方便的多,现将过程记录下来,备查及分享。
样表如下:
从样表中可以看到,客户电话是用逗号来分隔的不定长的字段,而且类型很多,简单的看了一下就有多种情况:11位手机号、前面加0的手机号、前面加区号的手机号、座机号、加区号的座机号、区号和手机号(座机号)之间加了一个或多个“-”号的、手机号前面有“+”“-”“*”……看到这种情况,首先考虑正则表达式,后面忽然想到,使用EXCEL的话,根本就不需要用正则了。
首先,将所有手机号分开,使用“分列”功能就可以达到,需要注意的是,如果按表样的情况直接分列,将只能指定二列为文本格式,例如第九行的数据会分出七列,后面的五列就会变成数字格式,可能会导致后续操作的不便,因此我们需要将电话号码最多的一行放到第一行进行分列操作。
电话号码最多的行可能同时也是最长的行,使用“=len(c2)”就能得到字符串的长度,然后排序。但为了保险一些,我还是按C列中逗号最多的字符串来进行排序,例如D2的公式如下:“=LEN(C2)-LEN(SUBSTITUTE(C2,",",""))”。
排序完成后就可以开始进行“分列”操作了,点击“数据”——“分列……”——“分隔符号”——“逗号”,将“列数据格式”全部改成“文本”,完成后的情况如下图:
下一步,将客户电话改成需要的格式,我使用EXCEL里的VBA来进行操作,先从控件工具箱拖出一个按钮来,双击进入VBA编辑器,输入以下代码:
Private Sub CommandButton1_Click() Dim cc As Integer cc = 1 For i = 1 To 65000 If Sheet1.Cells(i, 1) = "" Then Exit For End If For k = 3 To 100 If Sheet1.Cells(i, k) = "" Then Exit For Else Sheet2.Cells(cc, 1) = Sheet1.Cells(i, 1) Sheet2.Cells(cc, 2) = Sheet1.Cells(i, 2) Sheet2.Cells(cc, 2) = Sheet1.Cells(i, k) cc = cc + 1 End If Next k Next i MsgBox "联系电话转换完成!共转换记录" & cc & "条!" End Sub
点击按钮执行,得到结果“共转换记录650条!”,下一步,将电话数据进行变换,使用了最简单的方法:直接取联系电话的最后11位。接下来,将号码是联通手机号的筛选出来。我一开始使用的是最笨的办法:“=IF(OR(LEFT(D2,3)= "130",LEFT(D2,3)="131",LEFT(D2,3)="132",LEFT(D2,3)="155",LEFT(D2,3)="156",LEFT(D2,3)="186"),"√","")”,后来找到一种更快的方法:大家可以参考使用:“=LOOKUP(LEFT(D2,3)*1,{130,131,132,133,134,135,136,137,138,139,150,151,152,153,155,156,157,158,159,180,185,186,187,188,189},{"联通","联通","联通","电信","移动","移动","移动","移动","移动","移动","移动","移动","联通","电信","联通","联通","移动","移动","移动","电信","联通","联通","移动","移动","电信"})”
最后一步,按运营商进行排序,将不是联通手机号的记录删除,结果还有一些手机号是重复的,需要将这些号码排除,步骤如下:1、复制刚才使用过公式的列,然后再用“选择性粘贴…”——“数值”,将公式去除;2、“数据”——“筛选”——“高级筛选”——“选择不重复的记录”,将筛选出来的数据复制后,粘贴到另一个工作表或工作薄,至此,所有工作完成。
看起来麻烦了些,但实际使用下来,除去输入VBA代码的时间外,三分钟就可以做完所有操作,而且比使用数据库或者其他程序设计要方便灵活很多,当然,如果有更好的处理方法,也请大家赐教。
这是第一篇使用Live Writer写的随笔,呵呵,也是看看效果吧。