ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1079|回复: 3

知道一个合计数,按条件随机分布在18个格子里

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-26 23:48 | 显示全部楼层 |阅读模式
如图示,怎么快速把空白格填满!
例如第一个工日是16天,怎么在前面的18个空白格里随机填上16个1,使其求和等于16?
第二行加班总计是18小时,怎么在18个空格子里填上0到2范围的数字,使其求和等于18?
183442mkkdgwki0z0kkzjp.png

考勤登记表.rar

25.03 KB, 下载次数: 12

附件

TA的精华主题

TA的得分主题

发表于 2018-9-27 12:16 | 显示全部楼层
try this:
  1. Sub zz()
  2. Dim ar, a(), b, jjj, n%, t As Boolean, d As Object, nn%
  3. Set d = CreateObject("scripting.dictionary")
  4. ar = Range("e6:w" & [w65536].End(3).Row).Value
  5. For i = 1 To UBound(ar) Step 3
  6.     ReDim a(1 To 2, 1 To 18)
  7.     For j = 1 To UBound(a, 2)
  8.         a(2, j) = Rnd(): a(1, j) = j
  9.     Next
  10.     For j = 1 To UBound(a, 2) - 1
  11.         b = a(2, j)
  12.         For jj = j + 1 To UBound(a, 2)
  13.             If a(2, jj) < b Then t = True: jjj = jj: b = a(2, jj)
  14.         Next
  15.         If t Then
  16.             t = False
  17.             n = a(1, j): a(1, j) = a(1, jjj): a(1, jjj) = n:
  18.             a(2, jjj) = a(2, j): a(2, j) = b
  19.         End If
  20.     Next
  21.     For j = 1 To UBound(a, 2)
  22.         If Not a(1, j) > ar(i, 19) Then ar(i, j) = 1 Else ar(i, j) = ""
  23.     Next
  24. 1000
  25.     d.RemoveAll: n = 0: j = 0: jjj = 0: nn = IIf(Int(ar(i + 1, 19)) < 2, Int(ar(i + 1, 19)), 2)
  26.     Do
  27.         If d.count > 16 Then GoTo 1000
  28.         k = Application.WorksheetFunction.RandBetween(jjj, nn)
  29.         j = j + 1: n = n + k
  30.         d(j) = k
  31.     Loop Until n > Int(ar(i + 1, 19)) - 2
  32.     jj = j: m = n
  33. 2000
  34.     j = jj: n = m
  35.     Do
  36.         If d.count > 18 Then GoTo 2000
  37.         k = Application.WorksheetFunction.RandBetween(jjj, ar(i + 1, 19) - n)
  38.         j = j + 1: n = n + k
  39.         d(j) = k
  40.         If d.count > 18 Then jjj = jjj + 1: GoTo 1000
  41.     Loop Until n = Int(ar(i + 1, 19))
  42.     If ar(i + 1, 19) > Int(ar(i + 1, 19)) Then
  43.         j = Application.WorksheetFunction.RandBetween(0, d.count - 1)
  44.         k = d.keys
  45.         d(k(j)) = d(k(j)) + Round((ar(i + 1, 19) - Int(ar(i + 1, 19))), 1)
  46.     End If
  47.     For j = 1 To 18
  48.         ar(i + 1, j) = 0
  49.     Next
  50.     For Each k In d.keys
  51.         ar(i + 1, k) = d(k)
  52.     Next
  53. Next
  54. [e6].Resize(UBound(ar), UBound(a, 2)).ClearContents
  55. [e6].Resize(UBound(ar), UBound(a, 2)) = ar
  56. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-27 15:00 | 显示全部楼层

感谢大神,编了那么长的代码,我还不会用宏,我自己先试一下

TA的精华主题

TA的得分主题

发表于 2018-9-30 16:15 | 显示全部楼层
本帖最后由 zhang6029 于 2018-10-1 07:18 编辑

好好啊哈哦好
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 00:12 , Processed in 0.043148 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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