ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何利用vba代码根据特征字符对工序进行分类?

如何利用vba代码根据特征字符对工序进行分类?

作者:绿色风 分类: 时间:2022-08-17 浏览:77
楼主
kevinchengcw
Q: 如何利用vba代码根据特征字符对工序进行分类?
A: 规则如下:

 
实现代码如下:
  1. Sub test()
  2. Dim Rules, Dic As Object, Arr, Result, N&, I%, T%, Str$
  3. Rules = Split("数控,清,|数控|机器人,清,|机器人|划,卧铣,|卧铣|划,立铣,|立铣|割,清,|割|划,钻,钳,|钻|划,钻,|钻|钻,钳,|钻|划,镗,|镗|划,镗,钳,|镗|拼装,定位焊,|拼装", "|")   '设定规则数组
  4.     '规则样式:
  5.     '工作中心1,工作中心2,|新工作中心
  6.     '"|"前面是工序组合,每个工序后面要加个",","|"后面是在新工作中心中的名称,以上为一组,每组之间再以"|"分隔
  7. Set Dic = CreateObject("scripting.dictionary")  '创建字典项目,用于装载规则,加快处理速度
  8. For N = LBound(Rules) To UBound(Rules) Step 2  '循环将规则添加到字典中
  9.     Dic(Rules(N)) = Rules(N + 1)
  10. Next N
  11. Arr = Range("A2:F" & Cells(Rows.Count, "F").End(3).Row).Value  '读取源数据区域到数组中
  12. ReDim Result(LBound(Arr) To UBound(Arr), 1 To 1)  '重定义结果数组与源数据区行数相同
  13. For N = LBound(Arr) To UBound(Arr)  '循环源数据区各行
  14.     If Trim(Arr(N, 6)) = "矫" Then  '如果当前工作中心文本是"矫"字,则查看字典中是否存在该物料编号,有则将次数加1,无则添加
  15.         If Dic.exists(Arr(N, 1)) Then
  16.             Dic(Arr(N, 1)) = Dic(Arr(N, 1)) + 1
  17.         Else
  18.             Dic(Arr(N, 1)) = 1
  19.         End If
  20.         Result(N, 1) = WorksheetFunction.Text(Dic(Arr(N, 1)), "[DBNum1]d矫")  '根据当前字典计数值转换成中文大写数字写入结果数组对应项目中
  21.     Else  '如果不是"矫"字,则
  22.         For T = 2 To 0 Step -1  '循环三次,从三个组合到一个,以匹配最长组合结果
  23.             Str = ""  '初始化字符串为空值
  24.             For I = 0 To T  '循环提取数组中对应项目
  25.                 If N + I <= UBound(Arr) Then  '如果未超出源数据数组范围,则串接项目内容并以","分隔
  26.                     Str = Str & Trim(Arr(N + I, 6)) & ","
  27.                 Else  '否则退出循环
  28.                     Exit For
  29.                 End If
  30.             Next I
  31.             If Dic.exists(Str) Then  '如果字典中有当前字符串项目存在,则将对应的item内容写入对应的结果数组项目中
  32.                 For I = 0 To T
  33.                     If N + I <= UBound(Arr) Then
  34.                         Result(N + I, 1) = Dic(Str)
  35.                     Else
  36.                         Exit For
  37.                     End If
  38.                 Next I
  39.                 N = N + T  '跳过已处理好的数据区
  40.                 Exit For  '跳出循环
  41.             End If
  42.         Next T
  43.     End If
  44. Next N
  45. With [i2]  '清空目标区内容,并写入结果
  46.     .EntireColumn.ClearContents
  47.     .Resize(UBound(Result)) = Result
  48. End With
  49. Set Dic = Nothing  '清空字典项目
  50. End Sub

详见附件及素材源帖。
工序合并.rar
2楼
zzmjxxy
感谢版主采用我的案例!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap