一个派出所的朋友在调查一个案件的时候,遇到了这样的问题,找我帮忙。因为他不能提供原始数据来保密,就跟我谈了要求。目前,他们已经在一名嫌疑人的电话记录中纳入了N名新的嫌疑人,他们也拿到了每一名嫌疑人的电话记录。现在需要对这些电话记录进行统计,也就是同一个电话号码,每个嫌疑人打过多少次电话,有多少嫌疑人同时给同一个号码打过电话。
根据以上总结,Excel表格如下:
图1:原始数据表
图2:统计结果表
上图:
图1:用户1、用户2、用户3、用户4前面的数字是模拟电话号码;方向指的是主叫方还是被叫方,没有任何意义。
图2:用户正面的数字是手机被使用的次数。如果只有某个用户拨打了电话,则不会被计算在内。换句话说,统计结果表中的电话号码至少被两个用户呼叫过。
解决方案:
1.这种统计无法通过函数和数据透视表等普通方法解决。我用VBA编程实现统计。
首先,提取所有用户的电话(不重复,只重复一次)并存储在统计结果表中。这样,结果表中的电话是唯一的。
3.根据结果表的电话号码,统计每个用户使用该号码的次数,并将该用户下的统计结果存储在结果表中。
1.删除两个或更少用户使用同一电话号码的线路。
解决方案是:
1.因为用户数量未知,但是从2号栏已经可以得到,这样我们就可以通过循环进行统计。循环的条件是从第二列到第一行,并且单元格不为空。
1.每个用户的电话号码周期类似于1。
具体的程序源代码如下:
私有子命令Button1_Click()
床单(2)。rows(2):' 65536)=' '
床单(2)。列(' B:IV')=' '
Dim Ls,I,j,Isa,k,yhs
Isa=假
i=2
如果床单(1)。Cells(1,2)=" "那么
MsgBox '没有用户,不能计数!'vbOKOnly vbCritical,'错误提示'
出口接头
其他
当真实时做
如果床单(1)。单元格(1,I)“”然后
床单(2)。单元格(1,i)=工作表(1)。单元格(1,I)
i=i 1
其他
出口Do
如果…就会结束
环
yhs=i - 1
如果…就会结束
Ls=2
做While Sheets(1)。单元格(1,ls)' '
i=2
做While Sheets(1)。单元格(I,ls)' '
如果床单(2)。Cells(2,1)=" "那么
床单(2)。单元格(2,1)=工作表(1)。单元格(I,ls)
其他
j=2: Isa=False
做While Sheets(2)。单元格(j,1)' '
如果床单(2)。单元格(j,1)=工作表(1)。Cells(i,Ls) Then Isa=True: Exit Do
j=j 1
环
如果不是Isa,则表(2)。单元格(j,1)=工作表(1)。单元格(I,ls)
如果…就会结束
i=i 1
环
Ls=Ls 1
环
Ls=2
做While Sheets(2)。单元格(1,ls)' '
i=2
做While Sheets(2)。单元格(I,1)' '
j=2: k=0
做While Sheets(1)。单元格(j,ls)' '
如果床单(2)。单元格(I,1)=工作表(1)。单元格(j,ls)那么k=k-1
j=j 1
环
如果k 0,则Sheets(2)。单元格(I,Ls)=k
i=i 1
环
Ls=Ls 1
环
'===========================================
删除同一部电话上未被多个用户使用的线路。
'===========================================
i=2
做While Sheets(2)。单元格(I,1)' '
j=2: k=0
当j=yhs时做
如果床单(2)。Cells(i,j)' '那么k=k 1
j=j 1
环
如果CInt(k) 2,则
床单(2)。行(I)。删除Shift:=xlup '删除I行
其他
i=i 1
如果…就会结束
环
'===========================================
MsgBox“统计完毕!”,vbOKOnly vbInformation,'系统提示'
床单(2)。挑选
末端接头