对于连续非零数行的数据处理算法:
具体见baidu知道中我提的问题。
http://zhidao.baidu.com/question/59092196.html
下面给出我自己写的算法(VB宏,excel2003)
'处理后,空值单元格的去除方法
'选中所要去除空值的区域,“编辑”-“定位”-“定位条件”- 选择“空值”
'右键快捷菜单"删除"-“下方单元格上移”。 至此,所需的数据表格构建完成!
Sub Freq()
'
' Freq Macro
' 宏由 Hank 录制,时间: 2008-7-2
Sheets("Sheet2").Select '表格选择
Const line = 25 '处理行数
Dim j, t, m, n As Integer
Dim k(100) As Integer
j = 0 '连续非零行的长度
t = 0 '暂存j值
m = 0 'm为最长连续行长度
n = 0 '连续零行的长度
k(100) = 0 'k(t) ——连续t个非零行在序列中出现的次数。该数组的数据至关重要。
For i = 2 To line
If ActiveSheet.Cells(i, 2) <> 0 Then '判断第i行第2列是否为零,若非零则拷贝数据置新列
ActiveSheet.Cells(i, 3) = ActiveSheet.Cells(i, 1)
ActiveSheet.Cells(i, 4) = ActiveSheet.Cells(i, 2)
j = j + 1 '用来累计连续非零行的长度
t = j '暂存j的值,当下一行为零时,将其输出
n = 0 '连续零行的长度
If t >= m Then 'm为最长连续行的长度,输出数组时使用
m = t
End If
Else
j = 0 '当第i行为零时,停止非零行累计
n = n + 1 '开始连续零行累计
If n < 2 Then '只在第一个零时,对上一个非零行数据进行累加
k(t) = k(t) + 1
ActiveSheet.Cells(i - 1, 5) = k(t) '数据拷贝
ActiveSheet.Cells(i - 1, 6) = t
End If
End If
Next i
For a = 1 To m '输出数组中 1到m个元素,即连续1个…到…连续m个非零行,每个组合出现的次数。这样可以有效去除冗余元素。
ActiveSheet.Cells(a + 1, 7) = k(a)
Next a
ActiveSheet.Cells(2, 8) = m '输出m值
End Sub