ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 我又来提出新的要求了!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:39 | 显示全部楼层
代码2:第4部分

  1.         '--------------------------------------
  2.         ' 计算:产值
  3.         For I = KSRow To JSRow
  4.             NowGxnr = MyArr(I, NrCol) '取出当前工作表当前行的工序内容描述:工序名称
  5.             Jsgx = False
  6.             If InStr(NowGxnr, "计时/") > 0 Then Jsgx = True
  7.             If Jsgx Then
  8.                 ' 是计时工序,此时产量列一定不是合并单元格,产值=时薪*工时
  9.                 For X = 1 To UBound(RsArr)
  10.                     If RsArr(X, getNum(RsArr, "姓名")) = MyArr(I, XmCol) Then
  11.                         NowSX = RsArr(X, getNum(RsArr, "时薪")) '取得当前行员工的时薪
  12.                         Exit For
  13.                     End If
  14.                 Next
  15.                 ' 计算计时工序的产值:时薪X工时,并回写
  16.                 .Cells(I, CzCol) = Application.Round(NowSX * MyArr(I, GsCol), Xsws)
  17.             Else
  18.                 '-----------------------------------------------
  19.                 ' 计算说明
  20.                 ' 不是计时工序,按照计件计算产值
  21.                 '
  22.                 ' 当:产量单元格不是合并单元格时,属于单人独自完成,产值="工时工价表"中工序名称对应的工价*产量
  23.                 '
  24.                 ' 当:产量是合并单元格时,则表示是多人以工作组的方式完成,则需要先核算出总产值:
  25.                 '      在产量合并单元格所占的行数和款号+工序所在列交叉的区域中,剔除重复的款号+工序名称;
  26.                 '      去重后的工序对应的工价*产量之和,是工作组总产值
  27.                 '      个人产值=总产值/工作小组人数。
  28.                 '      工作小组的人数=合并单元格的行数
  29.                 '-----------------------------------------------
  30.                 ' 将产量单元格赋给对象变量
  31.                 Set NowRng = .Cells(I, ClCol)
  32.                 TotalRow = 1
  33.                 ' 取得合并单元格的行数
  34.                 If NowRng.MergeCells Then
  35.                     ' 是合并单元格,按照合并单元格的行数循环处理
  36.                     TotalRow = NowRng.MergeArea.Rows.Count
  37.                 End If
  38.                 ' 按照产量合并单元格的行数进行循环,剔除款号+工序名称的重复项
  39.                 GxDict.RemoveAll ' 清空字典
  40.                 TotalCZ = 0 '工作组产值合计变量赋初值
  41.                 NowCL = NowRng.Value '取出当前工作表当前行的产量
  42.                 For J = 1 To TotalRow
  43.                     NowKh = MyArr(I + J - 1, KhCol) '取出当前款号
  44.                     NowGxnr = MyArr(I + J - 1, NrCol) '取出当前工作表当前行的工序内容描述:工序名称
  45.                     '根据款号、工作内容描述两个条件取得工价
  46.                     GxKey = NowKh & NowGxnr
  47.                     If Not GxDict.Exists(GxKey) Then
  48.                         ' 当前Key的值不在字典中
  49.                         ' 寻找当前Key对应的工价
  50.                         NowGJ = 0
  51.                         For X = 1 To UBound(GsArr) ' 按照工时工价表数组的成员数进行循环
  52.                             If GsArr(X, getNum(GsArr, "款号")) = NowKh Then
  53.                                 ' 当前工作表当前行款号=工时工价表中的款号
  54.                                 If GsArr(X, getNum(GsArr, "工序名称")) = NowGxnr Then
  55.                                     ' 当前工作表当前行工序名称=工时工价表中的工序名称
  56.                                     ' 符合两个条件,取得当期工价
  57.                                     NowGJ = GsArr(X, getNum(GsArr, "工价"))
  58.                                     Exit For
  59.                                 End If
  60.                             End If
  61.                         Next
  62.                         ' 将相关信息写入数组:款号、工序名称、工价、产量
  63.                          GxDict.Add GxKey, GxKey
  64.                          'Array(NowKh, NowGxnr, NowGJ, NowCL)
  65.                          TotalCZ = TotalCZ + NowGJ * NowCL
  66.                     End If
  67.                 Next
  68.                 For J = 1 To TotalRow
  69.                     If Not Jsgx Then
  70.                         ' 当前不是计时工序
  71.                         If TotalCZ = 0 Then
  72.                             ' 当前产值为0,则:当前工作表中的款号、工序名称和工时工价表中的不一致
  73.                             .Cells(I + J - 1, CzCol) = "有问题"
  74.                             ErrSL = ErrSL + 1
  75.                             ' 错误信息单元格着底色
  76.                             With .Cells(I + J - 1, CzCol).Interior
  77.                                 .Pattern = xlSolid
  78.                                 .PatternColorIndex = xlAutomatic
  79.                                 .ThemeColor = xlThemeColorAccent2
  80.                                 .TintAndShade = -0.249977111117893
  81.                                 .PatternTintAndShade = 0
  82.                             End With
  83.                         Else
  84.                             .Cells(I + J - 1, CzCol) = Application.Round(TotalCZ / TotalRow, Xsws)
  85.                         End If
  86.                     End If
  87.                 Next
  88.                 I = I + J - 2
  89.             End If
  90.         Next
  91.         '--------------------------------------
  92.         ' 计算:工资
  93.         ' 工资:等于人事总表中该员工对应的时薪*工时
  94.         For I = KSRow To JSRow
  95.             For X = 1 To UBound(RsArr)
  96.                 If RsArr(X, getNum(RsArr, "姓名")) = MyArr(I, XmCol) Then
  97.                     NowSX = RsArr(X, getNum(RsArr, "时薪")) '取得当前行员工的时薪
  98.                     Exit For
  99.                 End If
  100.             Next
  101.             .Cells(I, GzCol) = Application.Round(NowSX * MyArr(I, GsCol), Xsws)
  102.         Next
  103.         '--------------------------------------
  104.         ' 计算:实发
  105.         ' 实发:如果工作内容前面有“计时/”字样,工资就等于“人事总表”中该员工对应的时薪*工时;否则表示该员工是计件,工资就等于产值
  106.         For I = KSRow To JSRow
  107.             NowGxnr = MyArr(I, NrCol)  '取出当前工作表当前行的工序内容描述:工序名称
  108.             Jsgx = False
  109.             If InStr(NowGxnr, "计时/") > 0 Then Jsgx = True
  110.             If Jsgx Then
  111.                 ' 是计时工序,=工资
  112.                 .Cells(I, SfCol) = .Cells(I, GzCol)
  113.             Else
  114.                 ' 不是计时工序,=产值
  115.                 .Cells(I, SfCol) = .Cells(I, CzCol)
  116.                 If .Cells(I, SfCol) = "有问题" Then
  117.                     ErrSL = ErrSL + 1
  118.                     ' 错误信息单元格着底色
  119.                     With .Cells(I, SfCol).Interior
  120.                         .Pattern = xlSolid
  121.                         .PatternColorIndex = xlAutomatic
  122.                         .ThemeColor = xlThemeColorAccent2
  123.                         .TintAndShade = -0.249977111117893
  124.                         .PatternTintAndShade = 0
  125.                     End With
  126.                 End If
  127.             End If
  128.         Next
  129.         '--------------------------------------
  130.         ' 计算:绩效
  131.         ' 绩效:绩效=实发-工资
  132.         On Error Resume Next ' 开始错误处理,防止公式错误导致宏停止
  133.         For I = KSRow To JSRow
  134.             .Cells(I, JxCol) = .Cells(I, SfCol) - .Cells(I, GzCol)
  135.             ' 检查错误号,如果不为0,则公式出错
  136.             If Err.Number <> 0 Then
  137.                 ' 公式错误处理
  138.                 .Cells(I, JxCol) = "有问题"
  139.                 ErrSL = ErrSL + 1
  140.                 ' 错误信息单元格着底色
  141.                 With .Cells(I, JxCol).Interior
  142.                     .Pattern = xlSolid
  143.                     .PatternColorIndex = xlAutomatic
  144.                     .ThemeColor = xlThemeColorAccent2
  145.                     .TintAndShade = -0.249977111117893
  146.                     .PatternTintAndShade = 0
  147.                 End With
  148.                 Err.Clear ' 清除错误
  149.             End If
  150.         Next
  151.         '--------------------------------------
  152.         ' 计算结束
  153.     End With
  154.     ErrXX = "计算完成。        "
  155.     If ErrSL > 0 Then
  156.         ErrXX = ErrXX & Chr(10) & Chr(10) & "有 " & ErrSL & " 处错误,请修正相关数据后,重新执行刷新操作。"
  157.     End If
  158.     MsgBox ErrXX, vbInformation, "计算结果"
  159. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
danhanqing 发表于 2024-6-27 11:09
哦!那我听您安排吧!再次感谢!

已贴。

代码需要审核,可能要过一段时间。

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:43 | 显示全部楼层
代码2 共分解成4部分,依次复制过去。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 14:45 | 显示全部楼层
边缘码农 发表于 2024-6-27 12:43
代码2 共分解成4部分,依次复制过去。

2024年7月份明声日报表.rar (77.58 KB, 下载次数: 1)

执行核算是出错了,没检查出问题出在哪里,请老师看看!感谢!

TA的精华主题

TA的得分主题

发表于 2024-6-27 14:53 | 显示全部楼层
danhanqing 发表于 2024-6-27 14:45
执行核算是出错了,没检查出问题出在哪里,请老师看看!感谢!

我在46楼写的那些看了没有?第2行和第9行中的标题不能有空格。出问题的是第9行的“姓 名”,有空格。

现在的代码没有太多的错误检测,出现问题,一般就是数据的问题。

比如这个问题:在代码中可以查看出错行中变量的值
image.png

xmcol(姓名列)的值为0,是错误的。

TA的精华主题

TA的得分主题

发表于 2024-6-27 14:54 | 显示全部楼层
代码不是很完善,比如工时工价表的列次顺序就不能动。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 15:06 | 显示全部楼层
边缘码农 发表于 2024-6-27 14:53
我在46楼写的那些看了没有?第2行和第9行中的标题不能有空格。出问题的是第9行的“姓 名”,有空格。

...

我也检查了空格问题,还是没检查仔细,居然还有一个半角空格存在

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 15:06 | 显示全部楼层
边缘码农 发表于 2024-6-27 14:54
代码不是很完善,比如工时工价表的列次顺序就不能动。

非常详细了!那个列序不准她们动就是了。

TA的精华主题

TA的得分主题

发表于 2024-6-27 15:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
danhanqing 发表于 2024-6-27 15:06
我也检查了空格问题,还是没检查仔细,居然还有一个半角空格存在

这个空格被复合框挡住了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 05:07 , Processed in 0.047598 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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