Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3045|回复: 11

[已解决]求助:由两个数据源的统计

[复制链接]
发表于 2011-12-29 20:28 | 显示全部楼层 |阅读模式
本帖最后由 gmshe58 于 2011-12-30 08:54 编辑

求助老师帮忙:由两个数据源的统计。谢谢。 20111229.rar (10.21 KB, 下载次数: 15)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2011-12-30 08:48 | 显示全部楼层
本帖最后由 gmshe58 于 2011-12-30 08:56 编辑

这个求助太难了吗?我增加一个过渡表,估计用函数、数组就可以解决了。都是统计次数的。我还是想用VBA解决。
函数、数组也能加按钮吗? 20111229b.rar (11.69 KB, 下载次数: 6)
回复

使用道具 举报

发表于 2011-12-30 09:57 | 显示全部楼层
  1. Public d As New Dictionary, Mr&
  2. Sub j()
  3.     Dim Arr, i&, Ar, Rng As Range
  4.     Dim j As Byte, s$, arrt()
  5.     With Worksheets("数源1")
  6.         Arr = .Range("d9:g" & .Range("d9").End(4).Row).Value
  7.     End With
  8.     Ar = Array("迟到", "早退", "请假", "外出", "上班漏刷", "下班漏刷")
  9.     d.RemoveAll
  10.     For i = 0 To UBound(Ar)
  11.         d.Add Ar(i), IIf(i > 4, 4, i)
  12.     Next
  13.     For i = 1 To UBound(Arr)
  14.         If d.Exists(Arr(i, 1)) Then
  15.             Ar = d(Arr(i, 1))
  16.             Ar(d(Arr(i, 4))) = Ar(d(Arr(i, 4))) + 1
  17.             d(Arr(i, 1)) = Ar
  18.         Else
  19.             Ar = Array(0, 0, 0, 0, 0)
  20.             Ar(d(Arr(i, 4))) = Ar(d(Arr(i, 4))) + 1
  21.             d(Arr(i, 1)) = Ar
  22.         End If
  23.     Next i
  24.     With Worksheets("数源2")
  25.         Arr = .Range(.[a3], .[a3].End(4)).Value
  26.         s = "外出"
  27.         For i = 1 To UBound(Arr)
  28.             If d.Exists(Arr(i, 1)) Then
  29.                 Ar = d(Arr(i, 1))
  30.                 Ar(d(s)) = Ar(d(s)) + 1
  31.                 d(Arr(i, 1)) = Ar
  32.             Else
  33.                 Ar = Array(0, 0, 0, 0, 0)
  34.                 Ar(d(s)) = Ar(d(s)) + 1
  35.                 d(Arr(i, 1)) = Ar
  36.             End If
  37.         Next
  38.         Set Rng = .Cells.Find("请假、 记事")
  39.         If Not Rng Is Nothing Then
  40.             Arr = .Range(.Cells(Rng.Row + 1, 1), .Cells(Rng.Row + 1, 1).End(4)).Value
  41.             s = "请假"
  42.             For i = 1 To UBound(Arr)
  43.                 If d.Exists(Arr(i, 1)) Then
  44.                     Ar = d(Arr(i, 1))
  45.                     Ar(d(s)) = Ar(d(s)) + 1
  46.                     d(Arr(i, 1)) = Ar
  47.                 Else
  48.                     Ar = Array(0, 0, 0, 0, 0)
  49.                     Ar(d(s)) = Ar(d(s)) + 1
  50.                     d(Arr(i, 1)) = Ar
  51.                 End If
  52.             Next
  53.         End If
  54.     End With
  55.     With Worksheets("统计")
  56.         Mr = .Cells.Find("说明:", lookat:=xlPart).Row - 3
  57.         Call Fh(.Range("a3"))
  58.         Call Fh(.Range("i3"))
  59.         Call Fh(.Range("q3"))
  60.     End With
  61. End Sub
  62. Sub Fh(Rng As Range)
  63.     Dim arrt(), i&, j As Byte
  64.     Arr = Worksheets("统计").Range(Rng, Rng.End(4)).Value
  65.     ReDim arrt(1 To UBound(Arr), 1 To 6)
  66.     For i = 1 To UBound(Arr)
  67.         If d.Exists(Arr(i, 1)) Then
  68.             Ar = d(Arr(i, 1))
  69.             For j = 0 To 4
  70.                 arrt(i, j + 2) = Ar(j)
  71.             Next j
  72.             arrt(i, 1) = (arrt(i, 2) + arrt(i, 3) + arrt(i, 6)) * 0.5
  73.         End If
  74.     Next i
  75.     Rng.Offset(0, 2).Resize(Mr, 6).ClearContents
  76.     Rng.Offset(0, 2).Resize(UBound(arrt), 6) = arrt
  77. End Sub
复制代码
20111229.rar (26.16 KB, 下载次数: 7)
回复

使用道具 举报

 楼主| 发表于 2011-12-30 11:32 | 显示全部楼层
本帖最后由 gmshe58 于 2011-12-30 11:43 编辑
liuguansky 发表于 2011-12-30 09:57
请参看是否为附件效果。


谢谢,基本是这样的,但是,九年级、工作人员没有统计,该如何改?
要求:统计私事外出次数,私事请假次数,公事不统计。该如何改?
。每两次漏刷等于一次旷工,不加其它的(如请假、外出等不加入计算)

回复

使用道具 举报

 楼主| 发表于 2011-12-30 11:49 | 显示全部楼层
liuguansky 发表于 2011-12-30 09:57
请参看是否为附件效果。

要么把数据源2分开为2个:临时外出、请假记事(分私事,公事、学习开会、法定假、产假、忘记刷卡有录像等等)。
回复

使用道具 举报

发表于 2011-12-30 11:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 liuguansky 于 2011-12-30 12:03 编辑

  1. Public d As New Dictionary, Mr&
  2. Sub j()
  3.     Dim Arr, i&, Ar, Rng As Range
  4.     Dim j As Byte, s$, arrt()
  5.     With Worksheets("数源1")
  6.         Arr = .Range("d9:g" & .Range("d9").End(4).Row).Value
  7.     End With
  8.     Ar = Array("迟到", "早退", "请假", "外出", "上班漏刷", "下班漏刷")
  9.     d.RemoveAll
  10.     For i = 0 To UBound(Ar)
  11.         d.Add Ar(i), IIf(i > 4, 4, i)
  12.     Next
  13.     For i = 1 To UBound(Arr)
  14.         If d.Exists(Arr(i, 1)) Then
  15.             Ar = d(Arr(i, 1))
  16.             Ar(d(Arr(i, 4))) = Ar(d(Arr(i, 4))) + 1
  17.             d(Arr(i, 1)) = Ar
  18.         Else
  19.             Ar = Array(0, 0, 0, 0, 0)
  20.             Ar(d(Arr(i, 4))) = Ar(d(Arr(i, 4))) + 1
  21.             d(Arr(i, 1)) = Ar
  22.         End If
  23.     Next i
  24.     With Worksheets("数源2")
  25.         Arr = .Range(.[a3], .[e3].End(4)).Value
  26.         s = "外出"
  27.         For i = 1 To UBound(Arr)
  28.             If Arr(i, 5) Like "*私事*" Then
  29.                 If d.Exists(Arr(i, 1)) Then
  30.                     Ar = d(Arr(i, 1))
  31.                     Ar(d(s)) = Ar(d(s)) + 1
  32.                     d(Arr(i, 1)) = Ar
  33.                 Else
  34.                     Ar = Array(0, 0, 0, 0, 0)
  35.                     Ar(d(s)) = Ar(d(s)) + 1
  36.                     d(Arr(i, 1)) = Ar
  37.                 End If
  38.             End If
  39.         Next
  40.         Set Rng = .Cells.Find("请假、 记事")
  41.         If Not Rng Is Nothing Then
  42.             Arr = .Range(.Cells(Rng.Row + 1, 1), .Cells(Rng.Row + 1, 5).End(4)).Value
  43.             s = "请假"
  44.             For i = 1 To UBound(Arr)
  45.                 If Arr(i, 5) Like "*私事*" Then
  46.                     If d.Exists(Arr(i, 1)) Then
  47.                         Ar = d(Arr(i, 1))
  48.                         Ar(d(s)) = Ar(d(s)) + 1
  49.                         d(Arr(i, 1)) = Ar
  50.                     Else
  51.                         Ar = Array(0, 0, 0, 0, 0)
  52.                         Ar(d(s)) = Ar(d(s)) + 1
  53.                         d(Arr(i, 1)) = Ar
  54.                     End If
  55.                 End If
  56.             Next
  57.         End If
  58.     End With
  59.     With Worksheets("统计")
  60.         Mr = .Cells.Find("说明:", lookat:=xlPart).Row - 3
  61.         Call Fh(.Range("a3"))
  62.         Call Fh(.Range("i3"))
  63.         Call Fh(.Range("q3"))
  64.         Call Fh(.Range("y3"))
  65.         Call Fh(.Range("ag3"))
  66.     End With
  67. End Sub
  68. Sub Fh(Rng As Range)
  69.     Dim arrt(), i&, j As Byte
  70.     Arr = Worksheets("统计").Range(Rng, Rng.End(4)).Value
  71.     ReDim arrt(1 To UBound(Arr), 1 To 6)
  72.     For i = 1 To UBound(Arr)
  73.         If d.Exists(Arr(i, 1)) Then
  74.             Ar = d(Arr(i, 1))
  75.             For j = 0 To 4
  76.                 arrt(i, j + 2) = Ar(j)
  77.             Next j
  78.             arrt(i, 1) = (arrt(i, 2) + arrt(i, 3) + arrt(i, 6)) * 0.5
  79.         End If
  80.     Next i
  81.     Rng.Offset(0, 2).Resize(Mr, 6).ClearContents
  82.     Rng.Offset(0, 2).Resize(UBound(arrt), 6) = arrt
  83. End Sub
复制代码

已修正
有冻结窗口。最后表的说明没注意看,不好意思
20111229.rar (26.17 KB, 下载次数: 19)
回复

使用道具 举报

 楼主| 发表于 2011-12-30 16:24 | 显示全部楼层
liuguansky 发表于 2011-12-30 11:57
已修正
有冻结窗口。最后表的说明没注意看,不好意思

谢谢,辛苦了。顺便问两句:1.Public d As New Dictionary, Mr&   是什么意思?在同事的电脑室上说是:编辑错误 “找不到工程或库”,不运行。

点评

这里的字典对象前期绑定了。请在VBE工具下,引入SCRRUN.DLL  发表于 2011-12-30 16:45
回复

使用道具 举报

 楼主| 发表于 2011-12-30 23:00 | 显示全部楼层
SCRRUN.DLL  在哪里?
烦请明示,谢谢。
回复

使用道具 举报

发表于 2011-12-31 09:04 | 显示全部楼层
gmshe58 发表于 2011-12-30 23:00
SCRRUN.DLL  在哪里?
烦请明示,谢谢。

QQ截图20111231090453.png
回复

使用道具 举报

 楼主| 发表于 2011-12-31 09:39 | 显示全部楼层
liuguansky 发表于 2011-12-31 09:04

加载错误,可能是他的电脑装的时候是不完全的吧。没有解决办法的话,就让他用我的吧。以后再装时再说。谢谢。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-16 00:03 , Processed in 0.368292 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表