ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-27 09:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
danhanqing 发表于 2024-6-26 12:33
工作组两个人同工序,但表中的产量是两个人合计的,对应个人产值也就是1200/2*工价,小组的总产值也只是1 ...

如果40楼截图中的数据没有问题,我整理一下代码发给你。单位有加密软件,不能直接发文件,需要我说步骤,具体你来操作。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 09:39 | 显示全部楼层
边缘码农 发表于 2024-6-27 09:21
如果40楼截图中的数据没有问题,我整理一下代码发给你。单位有加密软件,不能直接发文件,需要我说步骤, ...

看了一下,没有问题!万分感谢!
您不可以直接上传到论坛里么?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 09:42 | 显示全部楼层
danhanqing 发表于 2024-6-27 09:39
看了一下,没有问题!万分感谢!
您不可以直接上传到论坛里么?

或者您直接把代码直接发到论坛里,注明是放在模块、thisworkbook、或是sheet里,我来组装

TA的精华主题

TA的得分主题

发表于 2024-6-27 10:27 | 显示全部楼层
danhanqing 发表于 2024-6-27 09:42
或者您直接把代码直接发到论坛里,注明是放在模块、thisworkbook、或是sheet里,我来组装

单位有加密软件,编辑过的excel文件是加密的,你打不开。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-27 11:09 | 显示全部楼层
边缘码农 发表于 2024-6-27 10:27
单位有加密软件,编辑过的excel文件是加密的,你打不开。

哦!那我听您安排吧!再次感谢!

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
日报表体系整理要求
一、基础要求
1、需要进行计算的工作表的表名必须为1-31之间的数字。
2、名称为数字的工作表的结构完全一致(列数保持一致,行数可以不一致,各部分之间有明确的区分方法或标志)。
3、以工作表“1”为例:
(1)、第1行是报表名称行。
(2)、第2-7行汇总数据行区域,其中第2行是标题行,标题包括:款号、订单数、本日数、总完成、未完成、已出货、未出货、备注               
注意:
各标题名称中不能有空格。
各行的内容不能包含标题(比如B3单元格的内容中不能有“款号”二字)。
(3)、第9-47行为生产工人数据行区域,其中第9行是标题行,标题包括:款号、姓名、工作内容描述、工时、产量、产值、工资、实发、绩效、备注
注意:
各标题中不能有空格。
各行的内容不能包含标题(比如B10单元格的内容中不能有“款号”二字)。
(4)、第49-53行为非生产工人数据行区域,其标题行通用第9行。
(5)、第56行是合计行。B56单元格的内容必须是“合计:”。
(6)、第57行是备注行。B57单元格的内容必须以“备注:”开始。
(7)、文员输入内容中间不能有空格。
4、工作表各部分可以增加行,但不能删除行。
5、第9-47行生产工人数据行区域,B-G列的内容是其他人输入的,B-D这3列的数据用combobox选择输入。
B列款号的内容来自本表的2-7行汇总数据区域(该区域内容包含在“工时工价表”工作表的A列内容中,如果存在例外,则有错误。A+B列数据不能存在重复)。
C列姓名的内容来组“人事总表”工作表的B列姓名(该列数据不能存在重复)。
D列工作内容描述列的内容来自“工时工价表”工作表的C列,需要根据B列中下拉列表框款项当前选择的具体款号从“工时工价表”工作表的C列提取该款号对应的工序组成,增加到下拉框工作内容的列表项中。输入时要注意:如果该工序是计时的,则需要手工在工作内容的前面输入“计时/”。
二、具体操作
1、以帖子22楼压缩文件包中的Excel文件为准。
2、打开该文件,等载入刷新完毕后,删除名称为2-31的工作表。
下面针对工作表1进行操作:
3、清除H10:M37区域的数据,删除第2行和第9行各标题名称中的空格。
4、按组合键ALT+F11,进入VBE编辑环境。
5、双击左上角的“Sheet1(1)”,删除代码区的所有代码。
然后将下面的代码1复制到该代码区:
6、双击左上角的“ThisWorkbook”,删除代码区的所有代码。
7、双击左上角的“模块1”,删除代码区的所有代码。
然后将下面的代码2复制到该代码区。
8、F47、H47、J47、K47、L47单元格的公式是错误的,应该从第10行开始,修改一下。
L54单元格的公式是不是也有问题?K49:K53单元格区域缺少公式?
将上述提到的、以及自己发现的其他问题,尽数修改,然后执行下列的操作:
9、单击菜单栏【开发工具】,单击【宏】,在弹出的“宏对话框”中,选择“CopySht”,单击【执行】按钮,将工作表1复制到2-31。
10、测试:在不同的工作表中测试各种操作,看有没有出问题的情况。
11、可能存在其他考虑不周的情况,有问题在联系。

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:33 | 显示全部楼层
代码1:

  1. 'Option Explicit
  2. Private Sub 刷新_Click()
  3.     Call Compute
  4. End Sub
  5. Private Sub 款号_Change()
  6.     If 款号 = "" Then Exit Sub
  7.     Call 添加款号
  8.     Call 生成工作内容列表
  9.     款号 = ""
  10. End Sub
  11. Private Sub 姓名_Change()
  12.     If 姓名 = "" Then Exit Sub
  13.     Call 添加姓名
  14.     姓名 = ""
  15. End Sub
  16. Private Sub 工作内容_Change()
  17.     If 工作内容 = "" Then Exit Sub
  18.     Call 添加工作内容
  19.     工作内容 = ""
  20.     Range("F" & ActiveSheet.Range("B45").End(xlUp).Row).Select
  21. End Sub
  22. Sub 款号_DropButtonClick()
  23.     '---------------------------------
  24.     ' 填充款号复合框的列表项
  25.     ' 当在本工作表中单击输入款号的复合框右侧的下拉按钮时
  26.     '---------------------------------
  27.     ' 当本工作表的名称不是数字时,不执行本操作
  28.     If Not IsNumeric(ActiveSheet.Name) Then Exit Sub
  29.     On Error Resume Next
  30.     ' 定义字典对象
  31.     Dim d As Object
  32.     Set d = CreateObject("scripting.dictionary")
  33.     Dim Arrb, kc, I%, aa
  34.     ' 输出第1区域的所有款项
  35.     With ActiveSheet
  36.         Arrb = .Range("$B$3:$B$7")
  37.     End With
  38.     ' 生成款号名称连接的字符串
  39.     For I = 1 To UBound(Arrb)
  40.             aa = aa & Arrb(I, 1) & ","
  41.     Next I
  42.     ' 将款号名称字符串分割到数组
  43.     aa = Left(aa, Len(aa) - 1)
  44.     kc = Split(aa, ",")
  45.     ' 将分隔后的数组成员写入字典
  46.     For s = 0 To UBound(kc)
  47.          d(kc(s)) = ""
  48.      Next s
  49.      ' 将字典中的款号写到复合框中
  50.     ActiveSheet.款号.List = d.keys
  51.     Set d = Nothing
  52. End Sub
  53. Sub 姓名_DropButtonClick()
  54.     '---------------------------------
  55.     ' 填充姓名复合框的列表项
  56.     ' 当在本工作表中单击输入姓名的复合框右侧的下拉按钮时
  57.     '---------------------------------
  58.     ' 当本工作表的名称不是数字时,不执行本操作
  59.     If Not IsNumeric(ActiveSheet.Name) Then Exit Sub
  60.     On Error Resume Next
  61.     ' 定义字典对象
  62.     Dim d1 As Object
  63.     Set d1 = CreateObject("scripting.dictionary")
  64.     Dim Arrb1, Myrb1%, kc1, i1%, aa1
  65.     ' 将人事总表的B列姓名列写入数组
  66.     With Sheet33
  67.         Myrb1 = .[B65536].End(xlUp).Row
  68.         Arrb1 = .Range("$B$2:B" & Myrb1)
  69.     End With
  70.     ' 生成姓名连接的字符串
  71.     For I = 1 To UBound(Arrb1)
  72.         aa1 = aa1 & Arrb1(I, 1) & ","
  73.     Next I
  74.     ' 姓名字符串分隔到数组
  75.     aa1 = Left(aa1, Len(aa1) - 1)
  76.     kc1 = Split(aa1, ",")
  77.     ' 分割后的姓名数组写入复合框
  78.     For s = 0 To UBound(kc1)
  79.          d1(kc1(s)) = ""
  80.     Next s
  81.     ActiveSheet.姓名.List = d1.keys
  82.     Set d1 = Nothing
  83. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码2:因较长,要分几个帖子。

第1部分:

  1. 'Option Explicit
  2. Sub 生成工作内容列表()
  3.     On Error Resume Next
  4.     Dim d As Object
  5.     Set d = CreateObject("scripting.dictionary")
  6.     Dim Arrb, myrb%, kc, I%, aa, s%
  7.     With Sheet34
  8.         myrb = .[A65536].End(xlUp).Row
  9.         Arrb = .Range("$A$2:B" & myrb)
  10.     End With
  11.     For I = 1 To UBound(Arrb)
  12.         If Arrb(I, 1) = ActiveSheet.款号.Text Then
  13.             aa = aa & Arrb(I, 2) & ","
  14.         End If
  15.     Next I
  16.     aa = Left(aa, Len(aa) - 1)
  17.     kc = Split(aa, ",")
  18.     For s = 0 To UBound(kc)
  19.          d(kc(s)) = ""
  20.      Next s
  21.     ActiveSheet.工作内容.List = d.keys
  22.     Set d = Nothing
  23. End Sub
  24. Sub 添加款号()
  25.     Dim myrb
  26.     myrb = ActiveSheet.Range("B45").End(xlUp).Row
  27.     If ActiveSheet.Range("C" & myrb) = "" Then
  28.        ActiveSheet.Range("B" & myrb) = ActiveSheet.款号
  29.     Else
  30.        ActiveSheet.Range("B" & myrb + 1) = ActiveSheet.款号
  31.     End If
  32. End Sub
  33. Sub 添加姓名()
  34.     Dim myrb
  35.     myrb = ActiveSheet.Range("B45").End(xlUp).Row
  36.     ActiveSheet.Range("C" & myrb) = ActiveSheet.姓名
  37. End Sub
  38. Sub 添加工作内容()
  39.     Dim myrb
  40.     myrb = ActiveSheet.Range("B45").End(xlUp).Row
  41.    ActiveSheet.Range("D" & myrb) = ActiveSheet.工作内容
  42. End Sub
  43. Sub CopySht()
  44.     '---------------------------
  45.     ' 复制工作表,将1工作表复制30份,并更改工资表的名称
  46.     '---------------------------
  47.     ' 关闭屏幕更新
  48.     Application.ScreenUpdating = False
  49.     Dim I As Long
  50.     Dim MBSht As Worksheet
  51.     Dim CopyS As Boolean
  52.     Dim Tsxx As String
  53.     CopyS = True '默认复制工作表
  54.     With ThisWorkbook.Worksheets
  55.         For I = 1 To .Count
  56.             '按照工作表的数量进行循环
  57.             With Worksheets(I)
  58.                 If IsNumeric(.Name) Then
  59.                     ' 如果工作表的名称是数字
  60.                     If Val(.Name) > 1 Then
  61.                         ' 如果工作表名称大于1,则可能已经进行了复制操作。
  62.                         Tsxx = "工作簿中有多个名称为数字的工作表" & Chr(10) & Chr(10)
  63.                         Tsxx = Tsxx & "请手工删除除 1 之外的、其他以数字为名称的工作表,在执行复制操作。"
  64.                         MsgBox Tsxx, vbQuestion, "提醒"
  65.                         CopyS = False
  66.                         Exit For
  67.                     End If
  68.                 End If
  69.             End With
  70.         Next
  71.     End With
  72.     If CopyS Then
  73.         Set MBSht = ThisWorkbook.Worksheets("1")
  74.         For I = 2 To 31
  75.            ' 复制指定的工作表
  76.            MBSht.Copy Before:=Sheets(I)
  77.            ' 重命名新复制的工作表
  78.            ActiveSheet.Name = I
  79.         Next
  80.         MsgBox "执行完毕。"
  81.     End If
  82.     ' 恢复屏幕更新
  83.     Application.ScreenUpdating = True
  84. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-27 12:37 | 显示全部楼层
代码2,第2部分:
  1. Sub CheckDate()
  2.     '---------------------------------------
  3.     ' 检查数据
  4.     '---------------------------------------
  5.     Dim ErrXX As String '错误信息文本
  6.     Dim ErrXXTotal As String
  7.     Dim ShtNameList As String '要检测的工作表名称字符串
  8.     Dim ShtExist  As Boolean 'Ture=工作表存在
  9.     Dim ShtName() As String '各个工作表的名称数组
  10.     ' 定义行列数变量
  11.     Dim MaxRow As Long, MaxCol As Long
  12.     Dim RsArr() As Variant ' 定义基础数组:人事总表
  13.     Dim GjArr() As Variant ' 定义基础数组:工时工价表
  14.     Dim DateArr() As Variant ' 定义基础数组:当前工作表
  15.     Dim ListC As String

  16.     '---------------------------------------
  17.     ' 检查项1:检查工作表名称是否被修改。
  18.     ShtNameList = "人事总表、工时工价表"
  19.     ShtName = Split(ShtNameList, "、")
  20.     ShtExist = False
  21.     For I = 0 To UBound(ShtName)
  22.         For J = 1 To ThisWorkbook.Sheets.Count
  23.             If Sheets(J).Name = ShtName(I) Then
  24.                 ShtExist = True
  25.                 Exit For
  26.             End If
  27.         Next
  28.         If Not ShtExist Then
  29.             If ErrXX = "" Then ErrXX = "下列程序中使用的工作表名称被修改:  " & Chr(10)
  30.             ErrXX = ErrXX & Chr(10) & "     " & ShtName(I)
  31.         End If
  32.         ShtExist = False
  33.     Next
  34.     If ErrXX <> "" Then
  35.         MsgBox ErrXX, vbOKOnly + vbCritical, "数据校验"
  36.         End
  37.     End If
  38.     '---------------------------------------
  39.     ' 检查项2:检查工时工价表
  40.     '   其1:检查标题是否被修改
  41.     ' 将询证函信息导入数组
  42.     With Sheets("工时工价表")
  43.         MaxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column '第1行最后一列
  44.         MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row '第1列最后一行
  45.         '将原始数据导入数组
  46.         GjArr = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value
  47.     End With
  48.     TextList = "款号、工序名称、工序组成、工价"
  49.     For I = 1 To UBound(GjArr, 2)
  50.         If InStr(TextList, GjArr(1, I)) = 0 Then
  51.             ErrXX = ErrXX & GjArr(1, I) & "、"
  52.         End If
  53.     Next
  54.     If ErrXX <> "" Then
  55.         MsgBox "工时工价表的标题行存在错误:" & ErrXX, vbCritical, "数据校验"
  56.         End
  57.     End If
  58.     ErrXX = ""
  59.     ' 其2:检查工时工价表中是否存在错误:款号+工序名称存在重复
  60.     For I = 2 To UBound(GjArr)
  61.         If InStr(ListC, GjArr(I, 1) & GjArr(I, 2) & "结束#") > 0 Then
  62.             ' 当前款号+工序名称存在重复
  63.             ErrXX = ErrXX & GjArr(I, 1) & "," & GjArr(I, 2) & Chr(10)
  64.         Else
  65.             ' 当前款号+工序名称存不在重复时
  66.             ListC = ListC & GjArr(I, 1) & GjArr(I, 2) & "结束#" & ","
  67.         End If
  68.     Next
  69.     If ErrXX <> "" Then
  70.         ErrXX = "工时工价表中存在重复的款号+工序名称:" & Chr(10) & ErrXX
  71.         ErrXX = ErrXX & Chr(10) & "请修改。"
  72.         MsgBox ErrXX, vbCritical, "数据校验"
  73.         End
  74.     End If
  75.     ' 其3:检查工时工价表中是否存在错误:工价小于等于0
  76.     ErrXX = ""
  77.     For I = 2 To UBound(GjArr)
  78.         If GjArr(I, 4) <= 0 Then
  79.             ' 当前款号+工序名称的工价小于等于0,存在错误
  80.             ErrXX = ErrXX & GjArr(I, 1) & "," & GjArr(I, 2) & Chr(10)
  81.         End If
  82.     Next
  83.     If ErrXX <> "" Then
  84.         ErrXX = "工时工价表中存在款号+工序名称对应的工价错误情况:" & Chr(10) & ErrXX
  85.         ErrXX = ErrXX & Chr(10) & "请修改。"
  86.         MsgBox ErrXX, vbCritical, "数据校验"
  87.         End
  88.     End If
  89.     ErrXX = ""
  90.     '---------------------------------------
  91.     ' 检查项3:检查人事总表
  92.     '   其1:检查标题是否被修改
  93.     ' 将询证函信息导入数组
  94.     With Sheets("人事总表")
  95.         MaxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column '第1行最后一列
  96.         MaxRow = .Cells(.Rows.Count, 2).End(xlUp).Row '第2列最后一行
  97.         '将原始数据导入数组
  98.         RsArr = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value
  99.     End With
  100.     TextList = "工号、姓名、时薪"
  101.     For I = 1 To UBound(RsArr, 2)
  102.         If InStr(TextList, RsArr(1, I)) = 0 Then
  103.             ErrXX = ErrXX & RsArr(1, I) & "、"
  104.         End If
  105.     Next
  106.     If ErrXX <> "" Then
  107.         MsgBox "人事总表的标题行存在错误:" & ErrXX, vbCritical, "数据校验"
  108.         End
  109.     End If
  110.     ' 其2:检查姓名是否存在重复
  111.     ErrXX = ""
  112.     ListC = ""
  113.     For I = 2 To UBound(RsArr)
  114.         If InStr(ListC, RsArr(I, 2) & "结束#") > 0 Then
  115.             ' 当前姓名存在重复
  116.             ErrXX = ErrXX & RsArr(I, 1) & Chr(10)
  117.         Else
  118.             ' 当前款号+工序名称存不在重复时
  119.             ListC = ListC & RsArr(I, 1) & "结束#" & ","
  120.         End If
  121.     Next
  122.     If ErrXX <> "" Then
  123.         MsgBox "人数总表中存在重复的姓名:" & Chr(10) & ErrXX, vbCritical, "数据校验"
  124.         End
  125.     End If
  126.     ErrXX = ""
  127.     '---------------------------------------
  128.     ' 检查项4:检查当前工作表文员录入的数据:款号、姓名、工作内容描述(工序)
  129.     With ActiveSheet
  130.         '---------------------------------------
  131.         ' 提取基础数据
  132.         ' 确认文员输入区的起始行和结束行
  133.         MaxRow = .Cells(.Rows.Count, 2).End(xlUp).Row '第2列最后一行
  134.         For I = 9 To MaxRow
  135.             ' 规定生产工人数据行区域至少从第9行开始
  136.             If .Cells(I, 2) = "款号" Then
  137.                 KSRow = I + 1
  138.                 Exit For
  139.             End If
  140.         Next
  141.         MaxCol = .Cells(I, .Columns.Count).End(xlToLeft).Column '第i行最后一列
  142.         ' 将数据写入数组
  143.         DateArr = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value '将业绩表的内容导入到数组中
  144.         ' 取得生产工人数据区各列的列次
  145.         For J = 2 To MaxCol
  146.             Select Case .Cells(I, J)
  147.                 Case "款号"
  148.                     KhCol = J
  149.                 Case "姓名"
  150.                     XmCol = J
  151.                 Case "工作内容描述"
  152.                     NrCol = J
  153.             End Select
  154.         Next
  155.         ' 沿着 款号 列找到结束行
  156.         For J = KSRow To MaxRow
  157.             ' 沿着款号列向下,下一行为空或前两个字是小计,则本行是结束计算行
  158.             If .Cells(J + 1, KhCol) = "" Or Left(.Cells(J + 1, KhCol), 2) = "小计" Then
  159.                 JSRow = J
  160.                 Exit For
  161.             End If
  162.         Next
  163.         '---------------------------------------
  164.         ' 文员输入区(目前固定为B-D列)取消底色
  165.         With .Range(.Cells(KSRow, 2), .Cells(JSRow, 4)).Interior
  166.             .Pattern = xlNone
  167.             .TintAndShade = 0
  168.             .PatternTintAndShade = 0
  169.         End With
  170.         '---------------------------------------
  171.         ' 其1:检查款号列有无错误
  172.         For J = KSRow To JSRow
  173.             '  检查当前行的款号是否出现在工时工价表中
  174.             ErrXX = DateArr(J, KhCol)
  175.             For I = 1 To UBound(GjArr)
  176.                 If DateArr(J, KhCol) = GjArr(I, getNum(GjArr, "款号")) Then
  177.                     ErrXX = ""
  178.                 End If
  179.             Next
  180.             If ErrXX <> "" Then
  181.                 ErrXXTotal = "错误:第 " & J & "  行;" & "  款号:" & ErrXX
  182.                 ' 错误信息单元格着底色
  183.                 With .Cells(J, KhCol).Interior
  184.                     .Pattern = xlSolid
  185.                     .PatternColorIndex = xlAutomatic
  186.                     .ThemeColor = xlThemeColorAccent2
  187.                     .TintAndShade = -0.249977111117893
  188.                     .PatternTintAndShade = 0
  189.                 End With
  190.             End If
  191.         Next
  192.         '---------------------------------------
  193.         ' 其2:检查姓名列有无错误
  194.         For J = KSRow To JSRow
  195.             '  检查当前行的款号是否出现在工时工价表中
  196.             ErrXX = DateArr(J, XmCol)
  197.             For I = 1 To UBound(RsArr)
  198.                 If ErrXX = RsArr(I, getNum(RsArr, "姓名")) Then
  199.                     ErrXX = ""
  200.                 End If
  201.             Next
  202.             If ErrXX <> "" Then
  203.                 ErrXXTotal = ErrXXTotal & Chr(10) & "错误:第 " & J & "  行;" & "  姓名:" & ErrXX
  204.                 ' 错误信息单元格着底色
  205.                 With .Cells(J, XmCol).Interior
  206.                     .Pattern = xlSolid
  207.                     .PatternColorIndex = xlAutomatic
  208.                     .ThemeColor = xlThemeColorAccent2
  209.                     .TintAndShade = -0.249977111117893
  210.                     .PatternTintAndShade = 0
  211.                 End With
  212.             End If
  213.         Next
  214.         '---------------------------------------
  215.         ' 其3:检查工作内容描述列有无错误
  216.         For J = KSRow To JSRow
  217.             '  检查当前行的款号是否出现在工时工价表中
  218.             ErrXX = DateArr(J, NrCol)
  219.             If InStr(ErrXX, "计时/") > 0 Then
  220.                 ' 是计时工序,整理工序名称
  221.                 ErrXX = Split(ErrXX, "计时/")(1)
  222.             End If
  223.             For I = 1 To UBound(GjArr)
  224.                 If ErrXX = GjArr(I, getNum(GjArr, "工序名称")) Then
  225.                     ErrXX = ""
  226.                 End If
  227.             Next
  228.             If ErrXX <> "" Then
  229.                 ErrXXTotal = ErrXXTotal & Chr(10) & "错误:第 " & J & "  行;" & "  工序:" & ErrXX
  230.                 ' 错误信息单元格着底色
  231.                 With .Cells(J, NrCol).Interior
  232.                     .Pattern = xlSolid
  233.                     .PatternColorIndex = xlAutomatic
  234.                     .ThemeColor = xlThemeColorAccent2
  235.                     .TintAndShade = -0.249977111117893
  236.                     .PatternTintAndShade = 0
  237.                 End With
  238.             End If
  239.         Next
  240.         If ErrXXTotal <> "" Then
  241.             MsgBox ErrXXTotal & Chr(10) & Chr(10) & "已更改底色着重显示,请修改。"
  242.             End
  243.         End If
  244.     End With
  245. End Sub
复制代码

TA的精华主题

TA的得分主题

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

  1. Function getNum(csArr, csStr As String) As Long
  2.     '---------------------------
  3.     ' 根据接收的参数文本,在接收的参数数组中寻找参数文本是第几个成员,并返回
  4.     '
  5.     ' csArr:二维数组,要检查的数据
  6.     ' csStr:文本数据,要检查的列次名称,该名称存在于csArr数组的第一行中
  7.     '---------------------------
  8.     Dim I As Long
  9.     For I = 1 To UBound(csArr, 2)
  10.         If csArr(1, I) = csStr Then
  11.             getNum = I
  12.         End If
  13.     Next I
  14. End Function
  15. Sub Compute()
  16.     '---------------------------------------
  17.     ' 计算当前工作表
  18.     ' 计算内容:产值、工资、实发、绩效
  19.     '---------------------------------------
  20.     ' 定义行列数变量
  21.     Dim MaxRow As Long, MaxCol As Long
  22.     ' 定义循环变量
  23.     Dim I As Long, J As Long, X As Long
  24.     ' 定义待计算项在第几列变量:产值、工资、实发、绩效
  25.     Dim CzCol As Long, GzCol As Long, SfCol As Long, JxCol As Long
  26.     ' 定义款号、姓名、工作内容描述、工时、产量所在的列
  27.     Dim KhCol As Long, XmCol As Long, NrCol As Long, GsCol As Long, ClCol As Long
  28.     Dim KSRow As Long '计算的开始行
  29.     Dim JSRow As Long '计算的结束行
  30.     Dim MyArr() As Variant ' 定义基础数组
  31.     Dim GsArr() As Variant ' 定义工时工价表数组
  32.     Dim RsArr() As Variant ' 定义人事总表数组
  33.     Dim NowRng As Range '当前处理的单元格
  34.     Dim TotalRow As Long
  35.     Dim TotalCZ As Double '产值
  36.     Dim NowGxnr As String '当前正在处理的行的工作内容描述(工序)
  37.     Dim NowKh As String '当前正在处理的行的款号
  38.     Dim NowGJ As Double '当前正在处理的行对应的工价
  39.     Dim NowCL As Double  '当前产量
  40.     Dim NowSX As Double '当前时薪
  41.     Dim Jsgx As Boolean '计时工序
  42.     Dim Xsws As Long '小数位数
  43.     Dim GxDict As Object '工序字典
  44.     Dim GxKey As String
  45.     Dim ErrSL As Long '计算过程中出现错误的数量
  46.     '---------------------------------------
  47.     Call CheckDate '校验数据
  48.     '---------------------------------------
  49.     Xsws = 2
  50.     Set GxDict = CreateObject("Scripting.Dictionary")
  51.     ' 取得工时工价表数据
  52.     With Sheets("工时工价表")
  53.         MaxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column '第1行最后一列
  54.         MaxRow = .Cells(.Rows.Count, 1).End(xlUp).Row '第1列最后一行
  55.         '将原始数据导入数组
  56.         GsArr = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value
  57.     End With
  58.     '---------------------------------------
  59.     ' 取得人事总表数据:时薪
  60.     With Sheets("人事总表")
  61.         MaxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column '第1行最后一列
  62.         MaxRow = .Cells(.Rows.Count, 2).End(xlUp).Row '第2列最后一行
  63.         '将原始数据导入数组
  64.         RsArr = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value
  65.     End With
  66.     '---------------------------------------
  67.     With ActiveSheet
  68.         MaxRow = .Cells(.Rows.Count, 2).End(xlUp).Row '第2列最后一行
  69.         For I = 9 To MaxRow
  70.             ' 规定生产工人数据行区域至少从第9行开始
  71.             If .Cells(I, 2) = "款号" Then
  72.                 KSRow = I + 1
  73.                 Exit For
  74.             End If
  75.         Next
  76.         MaxCol = .Cells(I, .Columns.Count).End(xlToLeft).Column '第i行最后一列
  77.         ' 取消底色
  78.         With .Range(.Cells(KSRow, 2), .Cells(MaxRow, MaxCol)).Interior
  79.             .Pattern = xlNone
  80.             .TintAndShade = 0
  81.             .PatternTintAndShade = 0
  82.         End With
  83.         ' 将数据写入数组
  84.         MyArr = .Range(.Cells(1, 1), .Cells(MaxRow, MaxCol)).Value '将业绩表的内容导入到数组中
  85.         ' 取得生产工人数据区各列的列次
  86.         For J = 2 To MaxCol
  87.             Select Case .Cells(I, J)
  88.                 Case "产值"
  89.                     CzCol = J
  90.                 Case "工资"
  91.                     GzCol = J
  92.                 Case "实发"
  93.                     SfCol = J
  94.                 Case "绩效"
  95.                     JxCol = J
  96.                 Case "款号"
  97.                     KhCol = J
  98.                 Case "姓名"
  99.                     XmCol = J
  100.                 Case "工作内容描述"
  101.                     NrCol = J
  102.                 Case "工时"
  103.                     GsCol = J
  104.                 Case "产量"
  105.                     ClCol = J
  106.             End Select
  107.         Next
  108.         ' 沿着 款号 列找到结束行
  109.         For J = KSRow To MaxRow
  110.             ' 沿着款号列向下,下一行为空或前两个字是小计,则本行是结束计算行
  111.             If .Cells(J + 1, KhCol) = "" Or Left(.Cells(J + 1, KhCol), 2) = "小计" Then
  112.                 JSRow = J
  113.                 Exit For
  114.             End If
  115.         Next
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-29 07:20 , Processed in 0.036723 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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