Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: qinhuan66

[已解决]在sheet1表中提取每批160人的信息到sheet2表

[复制链接]
发表于 2013-4-10 20:47 | 显示全部楼层
不用客气,我只是问了下题意{:301:}

所以,你的问题就是:如何分批,确保每80人/天,是吗?
回复

使用道具 举报

 楼主| 发表于 2013-4-10 20:55 | 显示全部楼层
爱疯 发表于 2013-4-10 20:47
不用客气,我只是问了下题意

所以,你的问题就是:如何分批,确保每80人/天,是吗?

是的,不论怎么取,只要160人一批即可(2天),因为按160人一批(2天的话)一天去80人,另80人第二天去。

这样安排的话,就像一个单位8人,第一天去4人,留4人在上班。因为上班不能缺勤。谢谢
回复

使用道具 举报

发表于 2013-4-10 21:10 | 显示全部楼层
“这样安排的话,就像一个单位8人,第一天去4人,留4人在上班。因为上班不能缺勤”

可1楼之后的示例,如第2行:

10001        单位1        14

单位1所有人都体检去了?而不是先只去一半(7个)人呀?
回复

使用道具 举报

 楼主| 发表于 2013-4-10 21:14 | 显示全部楼层
爱疯 发表于 2013-4-10 21:10
“这样安排的话,就像一个单位8人,第一天去4人,留4人在上班。因为上班不能缺勤”

可1楼之后的示例,如 ...

是14人,后面D列体检时间是安排2天,最后我们会根据这个体检时间安排表附上个人姓名到底哪7个人是第一天,哪7个人是第2天的。谢谢
回复

使用道具 举报

发表于 2013-4-10 22:05 | 显示全部楼层
如果用正规解法,感觉会很麻烦吧;
如果取巧,即使不精确(达到160/批),也行啊。

问题是,从没做过这样的题,我都不会{:231:}


回复

使用道具 举报

 楼主| 发表于 2013-4-10 22:12 来自手机 | 显示全部楼层
爱疯 发表于 2013-4-10 22:05
如果用正规解法,感觉会很麻烦吧;
如果取巧,即使不精确(达到160/批),也行啊。


没事,不过还是谢谢您。谢谢
回复

使用道具 举报

发表于 2013-4-11 14:36 | 显示全部楼层
  1. Sub test()
  2.     Dim rng As Range
  3.     Dim A(), B()
  4.     Dim n%, i%, j%, x%, y%, s%, p%, MaxValue%, MaxIndex%


  5.     '1)初值
  6.     Sheets("sheet1").Select
  7.     Set rng = Range("A1").CurrentRegion
  8.     rng.Sort Key1:=Range("c1"), Order1:=xlDescending, Header:=xlYes
  9.     A = rng.Value
  10.     n = 160


  11.     '2)拆分人数>n 的记录
  12.     For i = 1 To UBound(A)
  13.         If i <> 1 And A(i, 3) > n Then
  14.             x = A(i, 3) \ n
  15.             y = A(i, 3) Mod n

  16.             '商
  17.             For j = 1 To x
  18.                 s = s + 1
  19.                 ReDim Preserve B(1 To 3, 1 To s)
  20.                 B(1, s) = A(i, 1) & "|" & j
  21.                 B(2, s) = A(i, 2) & "|" & j
  22.                 B(3, s) = n
  23.             Next j

  24.             '余数
  25.             If y <> 0 Then
  26.                 s = s + 1
  27.                 ReDim Preserve B(1 To 3, 1 To s)
  28.                 B(1, s) = A(i, 1) & "|" & j
  29.                 B(2, s) = A(i, 2) & "|" & j
  30.                 B(3, s) = y
  31.             End If
  32.         Else
  33.             s = s + 1
  34.             ReDim Preserve B(1 To 3, 1 To s)
  35.             For j = 1 To UBound(A, 2)
  36.                 B(j, s) = A(i, j)
  37.             Next j
  38.         End If
  39.     Next i
  40.     B = Application.Transpose(B)


  41.     '3)重建数据源
  42.     Sheets("sheet2").Select
  43.     Range("a:d").Clear
  44.     [a1].Resize(UBound(B), UBound(B, 2)) = B
  45.     Set rng = Range("a1:d" & UBound(B))
  46.     Erase B
  47.     rng.Sort Key1:=Range("c1"), Order1:=xlDescending, Header:=xlYes
  48.     A = rng.Value


  49.     '4)分批
  50.     s = 0
  51.     p = 0
  52.     For i = 2 To UBound(A) - 1
  53.         '1) 累计本次
  54.         p = p + 1
  55.         s = s + A(i, 3)

  56.         '2) 预测下次
  57.         Select Case s + A(i + 1, 3)
  58.         Case Is < n
  59.             '累计大值
  60.             p = p - 1
  61.         Case Is = n
  62.             '开始清算
  63.             s = 0
  64.         Case Is > n
  65.             '开始清算
  66.             '2)是否精确合适,不精确的话,凑一个最适合的小值
  67.             If s = n Then
  68.                 A(i, 4) = p
  69.                 s = 0
  70.             Else
  71.                 y = n - s
  72.                 For j = i + 1 To UBound(A)
  73.                     If A(j, 4) = "" Then
  74.                         If A(j, 3) <= y Then
  75.                             If A(j, 3) > MaxValue Then
  76.                                 MaxValue = A(j, 3)
  77.                                 MaxIndex = j
  78.                             End If
  79.                         End If
  80.                     End If
  81.                 Next j
  82.                 If A(MaxIndex, 4) = "" Then A(MaxIndex, 4) = p
  83.                 s = 0
  84.                 MaxValue = 0
  85.             End If
  86.         End Select

  87.         If A(i, 4) = "" Then A(i, 4) = p
  88.     Next i


  89.     '5)输出
  90.     A(1, 4) = "第几批"
  91.     A(UBound(A), 4) = p    '近似值
  92.     [a1].Resize(UBound(A), UBound(A, 2)) = A
  93.     rng.Sort Key1:=Range("d1"), Order1:=xlAscending, Header:=xlYes
  94.    
  95. End Sub
复制代码
体检时间安排表2.rar (29.56 KB, 下载次数: 6)

评分

参与人数 1 +1 收起 理由
qinhuan66 + 1 谢谢老师的帮忙谢谢

查看全部评分

回复

使用道具 举报

发表于 2013-4-11 15:50 | 显示全部楼层
因为
1)只凑一个小值
2)还没找到原因

通过按D列分类汇总,求和C列,
发现中间有些的过大(如240)或过小(7),再去想想。。。。。

{:231:}
回复

使用道具 举报

 楼主| 发表于 2013-4-11 17:47 | 显示全部楼层
爱疯 发表于 2013-4-11 14:36
不会做正规方法。
我这么做的,少数时候=160,多数时候只是接近160。

谢谢您了都是都是老师,我测试一下看看。谢谢
回复

使用道具 举报

发表于 2013-4-11 20:58 | 显示全部楼层
体检时间安排表4.rar (34.05 KB, 下载次数: 2)

评分

参与人数 1 +1 收起 理由
qinhuan66 + 1 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 13:25 , Processed in 0.479511 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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