ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何进行疾病的漏报分类统计?

如何进行疾病的漏报分类统计?

作者:绿色风 分类: 时间:2022-08-17 浏览:77
楼主
liuguansky
Q;如何进行疾病的漏报分类统计?

A:用如下代码可以实现:

  1. Sub justtest()
  2.     Dim dic, arr, i&, j&, k&, t&, m&, n&, x&, y&, arrt(), arrre()'定义名称
  3.     Set dic = CreateObject("scripting.dictionary")'创建字典项目
  4.     t = Cells(Rows.Count, "f").End(3).Row - 3'获取F列最后非空单元格行号,-3为去除表头
  5.     arr = Cells(4, "f").Resize(t, 6).Value'把汇总数据源装入数组,用于内存调用
  6.     For i = 1 To t'在数组中循环
  7.         If dic.exists(arr(i, 1)) Then' 如果是存在的病名即之前已做字典添加的项目,则
  8.             j = dic(arr(i, 1))'获取该病名所对应的ITEM值,即在生成的汇总数组中的行号,把它赋值给变量J
  9.             arrt(2, j) = arrt(2, j) + 1'对人数进行累加1
  10.             If arr(i, 6) <> "" Then arrt(3, j) = arrt(3, j) + 1'如果为漏报,刚累加1
  11.             Else: k = k + 1: ReDim Preserve arrt(1 To 3, 1 To k): dic.Add arr(i, 1), k'如果病名第一次出现,刚
  12. '添加到字典项目,同时汇总记录数组也扩展一位,同时定义动态数组,用来返回汇总数组:注意K标识位的运用
  13.             arrt(1, k) = arr(i, 1): arrt(2, k) = 1'同时对病名赋值,人数初始化1
  14.             If arr(i, 3) <> "" Then arrt(3, k) = 1'如果为漏报,人数初始化1
  15.         End If结束判断
  16.     Next i'进入循环下一次
  17.     Set dic = Nothing'清空字典内存
  18.     j = Int(k / 2) + IIf(k Mod 2, 1, 0)'返回依实际汇总格式的行数
  19.     ReDim arrre(1 To j, 1 To 6)'定义汇总格式数组
  20.     For i = 1 To k Step 2'在汇总数组中循环,STEP2是因为汇总格式为两列返回。
  21.         x = x + arrt(2, i) + arrt(2, i + 1)'累加总人数
  22.         y = y + arrt(3, i) + arrt(3, i + 1)'累加总漏人数
  23.         m = (i + 1) / 2'返回汇总数组对应的汇总格式数组对应的列
  24.         For t = 0 To 3 Step 3'因为一条记录三列,所以STEP3.只有两列,所以只循环两次
  25.             n = i + t / 3'返回汇总格式数组对应的汇总数组的列数[这里因为一行有两条记录,所以为t/3返回0,1]
  26.             arrre(m, t + 1) = arrt(1, n): arrre(m, t + 2) = arrt(2, n)'对不需判断的直接赋值
  27.             If arrt(3, n) <> "" Then
  28.                 arrre(m, t + 3) = arrt(3, n) & "(" & Format(arrt(3, n) / arrt(2, n), "0.00%") & ")"
  29.             End If '对漏报人数进行判断,如果没有就对应第三列返回空,如果有,就进行百分比运算。
  30.         Next t
  31.     Next i
  32.     With Sheet2'获取汇总格式表
  33.         .Range("a4:f" & Rows.Count).ClearContents'清除数据,避免影响
  34.         .Cells(4, 1).Resize(j, 6) = arrre'对区域赋值汇总格式数组
  35.          With .Cells(j + 5, 4)'生成表尾的合计行。
  36.             .Value = "合计"
  37.             .Offset(0, 1).Value = x
  38.             .Offset(0, 2).Value = y
  39.         End With
  40.         .Activate
  41.     End With
  42.     MsgBox "统计结束."'友好提示。
  43. End Sub

具体示例文件如下:
2楼
wjc2090742
留个位置,这个题目是我学excel的理由的题目的第二步。等完成第一步了再来学习。
3楼
nothingwmm
花花的代码写的很工整,条理很清晰,很值得学习呀,
4楼
liuguansky
已作注解,请指点。
5楼
gwfzh
谢谢老师的帮助!但如将sheet1表的f列的疾病进行调整的话,总是在 x = x + arrt(2, i) + arrt(2, i + 1)(下面红色字体)处出现“下标越界”的错误?另外总漏报数不对,统计的是42例,排序后得出的是24例,望老师能继续帮助!予以解惑,先谢谢了!祝圣诞快乐!
下标越界.rar

Sub justtest()
    Dim dic, arr, i&, j&, k&, t&, m&, n&, x&, y&, arrt(), arrre()
    Set dic = CreateObject("scripting.dictionary")
    t = Cells(Rows.Count, "f").End(3).Row - 3
    arr = Cells(4, "f").Resize(t, 6).Value
    For i = 1 To t
        If dic.exists(arr(i, 1)) Then
            j = dic(arr(i, 1))
            arrt(2, j) = arrt(2, j) + 1
            If arr(i, 6) <> "" Then arrt(3, j) = arrt(3, j) + 1
            Else: k = k + 1: ReDim Preserve arrt(1 To 3, 1 To k): dic.Add arr(i, 1), k
            arrt(1, k) = arr(i, 1): arrt(2, k) = 1
            If arr(i, 3) <> "" Then arrt(3, k) = 1
        End If
    Next i
    Set dic = Nothing
    j = Int(k / 2) + IIf(k Mod 2, 1, 0)
    ReDim arrre(1 To j, 1 To 6)
    For i = 1 To k Step 2
       x = x + arrt(2, i) + arrt(2, i + 1)      
        y = y + arrt(3, i) + arrt(3, i + 1)
        m = (i + 1) / 2
        For t = 0 To 3 Step 3
            n = i + t / 3
            arrre(m, t + 1) = arrt(1, n): arrre(m, t + 2) = arrt(2, n)
            If arrt(3, n) <> "" Then
                arrre(m, t + 3) = arrt(3, n) & "(" & Format(arrt(3, n) / arrt(2, n), "0.00%") & ")"
            End If
        Next t
    Next i
    With Sheet2
        .Range("a4:f" & Rows.Count).ClearContents
        .Cells(4, 1).Resize(j, 6) = arrre
         With .Cells(j + 5, 4)
            .Value = "合计"
            .Offset(0, 1).Value = x
            .Offset(0, 2).Value = y
        End With
        .Activate
    End With
    MsgBox "统计结束."
End Sub

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap