如果一个镇在10天内有3例相同的传染病则该镇发生了传染病暴发!
Application.ScreenUpdating = False '关闭屏幕更新,2000版结尾不用复原
Dim i&, j&, c&, k&, p&, a3&, a2&, arr2(), arr3() '声明变量
p = [a65536].End(xlUp).Row '取得末尾行
arr = Range("a2:c" & p) '将原数据存入数祖
Range("a1:c" & p).Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2"), Order2:=xlAscending, Key3:=Range("C2"), Order3:=xlAscending, Header:=xlGuess
'按地名、病明、时间排序,注意对表按一定格式排序是一种非常实用的方法,经常能化繁为简,提高效率
arr1 = Range("a2:c" & p) '将排序后的表存入另一个数祖
ReDim arr2(1 To p - 1, 1 To 4), arr3(1 To p - 1, 1 To 3) '重新定义2个数组用于存放发病情况和发病明细
i = 1: q = 1: n = 1
a3 = 1: a2 = 1 '设定循环中的变量初值
Do While i < p - 2 '数组共p-1行,而末尾2行数据不可能组成符合条件的行,因为满足条件至少需要连续3行记录,所以i只需要循环到p-3
If arr1(i, 1) = arr1(i + 2, 1) And arr1(i, 2) = arr1(i + 2, 2) And arr1(i + 2, 3) - arr1(i, 3) < 11 Then '因为数据行按升序排列,所以该if语句用于判断符合爆发条件的地区和疾病,注意arr1(i + 2, 3)-arr1(i, 3)<11决定i只需要判断到p-3即可
For j = i To 1 Step -1 '满足爆发条件的话可循着该记录向前找到该地区(疾病)的首记录,用于确定初始时间和病例数
If arr1(j, 1) = arr1(i, 1) And arr1(j, 2) = arr1(i, 2) Then '这是判断的条件
q = j '首记录行数
Else
Exit For '找到即退出循环
End If
Next j
For n = q To p - 1 '该循环用于查找满足爆发条件的地区(疾病)的末记录.同时对数组赋值
If arr1(n, 1) = arr1(n + 1, 1) And arr1(n, 2) = arr1(n + 1, 2) Then '记录疾病明细数据
arr3(a3, 1) = arr1(n, 1) '地区
arr3(a3, 2) = arr1(n, 2) '疾病
arr3(a3, 3) = arr1(n, 3) '发病时间
a3 = a3 + 1 '增加记录标记
Else '一旦不满足条件可判断该记录已为末记录
arr3(a3, 1) = arr1(n, 1) '明细数据
arr3(a3, 2) = arr1(n, 2) '明细数据
arr3(a3, 3) = arr1(n, 3) '明细数据
a3 = a3 + 1
x1 = arr1(q, 3) '始发生时间
x2 = arr1(n, 3) '末发生时间
arr2(a2, 1) = arr1(n, 1) '发病情况
arr2(a2, 2) = arr1(n, 2) '发病情况
arr2(a2, 3) = n - j '病例数
arr2(a2, 4) = x1 & "至" & x2 '时间范围
a2 = a2 + 1 '增加记录标记
Exit For '找到末记录自然对出循环
End If
Next n
i = n + 1 '找到满足条件的记录则跳到另一个地区(疾病),避免了重复记数
End If
i = i + 1 '未满足条件则判断下一记录
Loop '循环i
Range("a2:c" & p) = arr '复原排序前的数据
Sheets("发病情况").Range("a2:d" & p) = arr2 '输出发病情况
Sheets("发病明细").Range("a2:c" & p) = arr3 '输出发病明细
'---END---
oa5r7C2T.rar
(10.88 KB, 下载次数: 98)
|