ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 工时分配工时

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-10-16 16:17 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 cherry1314 于 2024-10-16 16:25 编辑

各位老师:请问如何将一个总工时,随机分配到一个月除周日的每一天,且每一天分配的工时不能超过8小时,请问这个能用公式实现吗?

求助.zip

22.49 KB, 下载次数: 11

TA的精华主题

TA的得分主题

发表于 2024-10-16 17:25 | 显示全部楼层
建议用VBA处理!

TA的精华主题

TA的得分主题

发表于 2024-10-16 17:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA实现
  1. Sub DistributeHours()
  2.     Dim ws As Worksheet
  3.     Dim totalHours As Long
  4.     Dim workDays As Long
  5.     Dim dayIndex As Long
  6.     Dim currentDay As Long
  7.     Dim remainingHours As Long
  8.     Dim dailyHours As Long
  9.    
  10.     ' 设置工作表
  11.     Set ws = ThisWorkbook.Sheets("Sheet1")
  12.    
  13.     ' 清空之前的记录
  14.     ws.Range("B3:B40").ClearContents
  15.    
  16.     ' 获取总工时和工作日数量
  17.     totalHours = ws.Range("D2").Value
  18.     workDays = ws.Range("F2").Value
  19.    
  20.     ' 检查总工时是否超出每天8小时的限制
  21.     If totalHours > workDays * 8 Then
  22.         MsgBox "总工时过长,请重新分配!"
  23.         Exit Sub
  24.     End If
  25.    
  26.     ' 初始化每天的工作时间为0
  27.     For currentDay = 1 To workDays
  28.         ws.Cells(currentDay + 2, 2).Value = 0 ' B4开始记录
  29.     Next currentDay
  30.    
  31.     ' 分配工时
  32.     remainingHours = totalHours
  33.     Do While remainingHours > 0
  34.         For currentDay = 1 To workDays
  35.             If remainingHours = 0 Then Exit For
  36.             ' 随机生成每天的工作时间,不超过8小时
  37.             dailyHours = Application.WorksheetFunction.Min(Int((remainingHours / (workDays - currentDay + 1)) * Rnd + 1), 8)
  38.             If ws.Cells(currentDay + 2, 2).Value + dailyHours <= 8 Then
  39.                 ws.Cells(currentDay + 2, 2).Value = ws.Cells(currentDay + 2, 2).Value + dailyHours
  40.                 remainingHours = remainingHours - dailyHours
  41.             Else
  42.                 ' 如果超出了最大值,选择一个较小的值
  43.                 dailyHours = Application.WorksheetFunction.Min(remainingHours, 8 - ws.Cells(currentDay + 2, 2).Value)
  44.                 If dailyHours > 0 Then
  45.                     ws.Cells(currentDay + 2, 2).Value = ws.Cells(currentDay + 2, 2).Value + dailyHours
  46.                     remainingHours = remainingHours - dailyHours
  47.                 End If
  48.             End If
  49.         Next currentDay
  50.     Loop
  51. End Sub
复制代码



image.jpg

工作日工时分配器.zip

17.88 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-17 12:02 | 显示全部楼层

请问老师,我有很多个项目的工时,能否加一个循环语句把所有项目的工时都分配了

TA的精华主题

TA的得分主题

发表于 2024-10-17 17:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cherry1314 发表于 2024-10-17 12:02
请问老师,我有很多个项目的工时,能否加一个循环语句把所有项目的工时都分配了

你是希望这个分配模板能多个项目使用吗?   还是希望重设模板 填入总工时、项目数,总工时自动分配所有项目?

TA的精华主题

TA的得分主题

发表于 2024-10-17 17:53 | 显示全部楼层
cherry1314 发表于 2024-10-17 12:02
请问老师,我有很多个项目的工时,能否加一个循环语句把所有项目的工时都分配了

刚才重新看了下,发现我题目理解错了,以我新发的这个为准

image.jpg
  1. Sub DistributeHours()
  2.     Dim ws As Worksheet
  3.     Dim inputMonth As String
  4.     Dim totalHours As Long
  5.     Dim workDays As Long
  6.     Dim dayIndex As Long
  7.     Dim currentDay As Long
  8.     Dim remainingHours As Long
  9.     Dim dailyHours As Long
  10.     Dim monthStart As Date
  11.     Dim monthEnd As Date
  12.     Dim currentDate As Date
  13.     Dim workDayCount As Long
  14.    
  15.     ' 设置工作表
  16.     Set ws = ThisWorkbook.Sheets("Sheet1")
  17.    
  18.     ' 清空之前的记录
  19.     ws.Range("B3:B40").ClearContents
  20.    
  21.     ' 获取输入的月份和总工时
  22.     inputMonth = ws.Range("D2").Value
  23.     totalHours = ws.Range("F2").Value
  24.    
  25.     ' 检查输入格式是否正确
  26.     On Error Resume Next
  27.     monthStart = CDate(inputMonth & "/01/2024") ' 假设2024年,实际可以根据需要调整
  28.     On Error GoTo 0
  29.    
  30.     If IsError(monthStart) Then
  31.         MsgBox "请输入正确的月份格式(如:10)。"
  32.         Exit Sub
  33.     End If
  34.    
  35.     ' 计算该月最后一天
  36.     monthEnd = DateSerial(Year(monthStart), Month(monthStart) + 1, 0)
  37.    
  38.     ' 计算工作日数量
  39.     workDayCount = 0
  40.     currentDate = monthStart
  41.     Do While currentDate <= monthEnd
  42.         If Weekday(currentDate) <> vbSunday Then ' 排除周日
  43.             workDayCount = workDayCount + 1
  44.         End If
  45.         currentDate = currentDate + 1
  46.     Loop
  47.    
  48.     ' 检查总工时是否超出每天8小时的限制
  49.     If totalHours > workDayCount * 8 Then
  50.         MsgBox "总工时过长,请重新分配!"
  51.         Exit Sub
  52.     End If
  53.    
  54.     ' 初始化每天的工作时间为0
  55.     For currentDay = 1 To workDayCount
  56.         ws.Cells(currentDay + 2, 2).Value = 0 ' B4开始记录
  57.     Next currentDay
  58.    
  59.     ' 分配工时
  60.     remainingHours = totalHours
  61.     Do While remainingHours > 0
  62.         For currentDay = 1 To workDayCount
  63.             If remainingHours = 0 Then Exit For
  64.             ' 随机生成每天的工作时间,不超过8小时
  65.             dailyHours = Application.WorksheetFunction.Min(Int((remainingHours / (workDayCount - currentDay + 1)) * Rnd + 1), 8)
  66.             If ws.Cells(currentDay + 2, 2).Value + dailyHours <= 8 Then
  67.                 ws.Cells(currentDay + 2, 2).Value = ws.Cells(currentDay + 2, 2).Value + dailyHours
  68.                 remainingHours = remainingHours - dailyHours
  69.             Else
  70.                 ' 如果超出了最大值,选择一个较小的值
  71.                 dailyHours = Application.WorksheetFunction.Min(remainingHours, 8 - ws.Cells(currentDay + 2, 2).Value)
  72.                 If dailyHours > 0 Then
  73.                     ws.Cells(currentDay + 2, 2).Value = ws.Cells(currentDay + 2, 2).Value + dailyHours
  74.                     remainingHours = remainingHours - dailyHours
  75.                 End If
  76.             End If
  77.         Next currentDay
  78.     Loop
  79. End Sub
复制代码


工作日工时分配器.zip

19.37 KB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-18 13:48 | 显示全部楼层
Excel_muke 发表于 2024-10-17 17:53
刚才重新看了下,发现我题目理解错了,以我新发的这个为准

老师,现在这个模版只是针对分配一个项目工时的,我有80多个项目的工时,就是能不能根据我有多少个项目,然后按照现在这个模式每个项目都自动分配,不知道我这样说,您是否能理解?

TA的精华主题

TA的得分主题

发表于 2024-10-18 15:59 | 显示全部楼层
cherry1314 发表于 2024-10-18 13:48
老师,现在这个模版只是针对分配一个项目工时的,我有80多个项目的工时,就是能不能根据我有多少个项目, ...

这种OK?

image.jpg
  1. Sub DistributeHoursForMultipleProjects()
  2.     Dim ws As Worksheet
  3.     Dim inputMonth As String
  4.     Dim totalHours As Long
  5.     Dim workDayCount As Long
  6.     Dim currentDay As Long
  7.     Dim remainingHours As Long
  8.     Dim dailyHours As Long
  9.     Dim monthStart As Date
  10.     Dim monthEnd As Date
  11.     Dim currentDate As Date
  12.     Dim projectRow As Long
  13.     Dim lastRow As Long
  14.     Dim outputCol As Long
  15.    
  16.     ' 设置工作表
  17.     Set ws = ThisWorkbook.Sheets("Sheet1")
  18.    
  19.     ' 清空之前的记录
  20.     ws.Range("C5:AG40").ClearContents
  21.    
  22.     ' 获取输入的月份
  23.     inputMonth = ws.Range("A2").Value
  24.    
  25.     ' 获取最后一行
  26.     lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
  27.    
  28.     ' 遍历每个项目
  29.     For projectRow = 5 To lastRow ' 假设项目从A5开始
  30.         ' 获取对应项目的总工时
  31.         totalHours = ws.Cells(projectRow, 2).Value
  32.         
  33.         ' 检查输入格式是否正确
  34.         On Error Resume Next
  35.         monthStart = CDate(inputMonth & "/01/2024") ' 假设2024年,实际可以根据需要调整
  36.         On Error GoTo 0
  37.         
  38.         If IsError(monthStart) Then
  39.             MsgBox "请输入正确的月份格式(如:10)在A2。"
  40.             Exit Sub
  41.         End If
  42.         
  43.         ' 计算该月最后一天
  44.         monthEnd = DateSerial(Year(monthStart), Month(monthStart) + 1, 0)
  45.         
  46.         ' 计算工作日数量
  47.         workDayCount = 0
  48.         currentDate = monthStart
  49.         Do While currentDate <= monthEnd
  50.             If Weekday(currentDate) <> vbSunday Then ' 排除周日
  51.                 workDayCount = workDayCount + 1
  52.             End If
  53.             currentDate = currentDate + 1
  54.         Loop
  55.         
  56.         ' 检查总工时是否超出每天8小时的限制
  57.         If totalHours > workDayCount * 8 Then
  58.             ws.Cells(projectRow, 3).Value = "该项目总工时过长,请重新修改总工时!" ' 在C列提示错误信息
  59.             GoTo NextProject ' 跳过当前项目,继续下一个项目
  60.         End If
  61.         
  62.         ' 初始化每天的工作时间为0
  63.         outputCol = 3 ' C列开始输出
  64.         For currentDay = 1 To workDayCount
  65.             ws.Cells(projectRow, outputCol).Value = 0
  66.             outputCol = outputCol + 1
  67.         Next currentDay
  68.         
  69.         ' 分配工时
  70.         remainingHours = totalHours
  71.         Do While remainingHours > 0
  72.             outputCol = 3 ' 重置列位置
  73.             For currentDay = 1 To workDayCount
  74.                 If remainingHours = 0 Then Exit For
  75.                 ' 随机生成每天的工作时间,不超过8小时
  76.                 dailyHours = Application.WorksheetFunction.Min(Int((remainingHours / (workDayCount - currentDay + 1)) * Rnd + 1), 8)
  77.                 If ws.Cells(projectRow, outputCol).Value + dailyHours <= 8 Then
  78.                     ws.Cells(projectRow, outputCol).Value = ws.Cells(projectRow, outputCol).Value + dailyHours
  79.                     remainingHours = remainingHours - dailyHours
  80.                 Else
  81.                     ' 如果超出了最大值,选择一个较小的值
  82.                     dailyHours = Application.WorksheetFunction.Min(remainingHours, 8 - ws.Cells(projectRow, outputCol).Value)
  83.                     If dailyHours > 0 Then
  84.                         ws.Cells(projectRow, outputCol).Value = ws.Cells(projectRow, outputCol).Value + dailyHours
  85.                         remainingHours = remainingHours - dailyHours
  86.                     End If
  87.                 End If
  88.                 outputCol = outputCol + 1
  89.             Next currentDay
  90.         Loop
  91. NextProject:
  92.     Next projectRow
  93. End Sub

复制代码


工作日工时分配器.zip

22.89 KB, 下载次数: 6

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-22 08:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

非常ok,感谢老师
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 08:52 , Processed in 0.042795 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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