ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 对匹配的风险物质进行汇总(涉及合并单元格)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-3 07:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
化妆品中安全性风险物质危害识别表

这是不是每个配方表的表名中都有的内容?

TA的精华主题

TA的得分主题

发表于 2024-7-3 09:33 | 显示全部楼层
根据我的理解,修改一版。
附注的描述结构和描述词汇采用上次的单配方版本。

TA的精华主题

TA的得分主题

发表于 2024-7-3 09:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub 数据筛选()
  2.     '---------------------------
  3.     Dim List1 As String ' 产品列表
  4.     Dim ListCp As String ' 产品描述字符串
  5.     Dim ListYL As String ' 原料描述字符串
  6.     Dim Now() As String ' 当前单元格的内容数组,分割形成
  7.     Dim i As Long, J As Long, R As Long, X As Long '循环变量
  8.     Dim TotalRow As Long '合并单元格的行数
  9.     Dim Jgxh As Long ' 结果序号
  10.     Dim Ylxh As Long ' 原料序号
  11.     Dim Jg As String ' 最终描述结果
  12.     Dim NowRow As Long '当前行
  13.     Dim RngText As String ' 单元格类型
  14.     Dim NamePF() As String '配方名称数组,配方表名称分割形成
  15.     Dim PFName As String  '配方名称
  16.     Dim Pffx As Boolean '配方分析
  17.     '---------------------------
  18.     List1 = "二噁烷、游离甲醛、甲醇、石棉"
  19.     ' 删除工作表"附录 (新增)"中第3行及之后的数据
  20.     With Sheets("附录 (新增)")
  21.           TotalRow = .Cells(.Rows.Count, 3).End(xlUp).Row
  22.           If TotalRow > 2 Then .Range("b3:C" & TotalRow).ClearContents
  23.     End With
  24.     With Sheets("风险物质安评(新增)")
  25.         '---------------------
  26.         '  检测工作表"风险物质安评(新增)"
  27.         R = .Cells(Rows.Count, 3).End(xlUp).Row
  28.         If R < 8 Then
  29.             MsgBox "数据源为空!"
  30.             End      '退出
  31.         End If
  32.         '---------------------
  33.         Jgxh = 1
  34.         For i = 6 To R
  35.             ' 从第6行开始判断。要求工作表的格式固定,1-5行为固定的内容。
  36.             ' 因为数据量小,直接操作工作表。
  37.             '-------------------------------------
  38.             ' 判断当前单元格的类型
  39.             RngText = Merge(.Cells(i, 2))
  40.             If RngText = "1行多列合并" Then
  41.                 ' 当前单元格是1行多列合并,是配方表的名称。
  42.                 ' 取得配方名称
  43.                 NamePF = Split(Delkg(.Cells(i, 2)), " ")
  44.                 If UBound(NamePF) >= 2 Then
  45.                     ' 配方表名称分割后的数组成员数>=2,说明配方表名称有3部分组成,含有配方名称
  46.                     PFName = NamePF(1)
  47.                 Else
  48.                     PFName = ""
  49.                 End If
  50.                 If InStr(.Cells(i, 2), "合并") = 0 Then
  51.                     '配方表的名称中不包含“合并”二字,需要进行分析
  52.                     Pffx = True
  53.                 Else
  54.                     Pffx = False
  55.                 End If
  56.             End If
  57.             '-------------------------------------
  58.              If Pffx Then
  59.                 If IsNumeric(.Cells(i, 2)) Then
  60.                     ' 如果当前单元格的内容是数值
  61.                     TotalRow = 1
  62.                     ' 取得合并单元格的行数
  63.                     Ylxh = 0
  64.                     With .Cells(i, 2)
  65.                         If .MergeCells Then
  66.                             ' 是合并单元格,取得合并单元格的行数
  67.                             TotalRow = .MergeArea.Rows.Count
  68.                             If Ylxh = 0 Then Ylxh = .Value
  69.                         Else
  70.                             Ylxh = .Value
  71.                         End If
  72.                     End With
  73.                     For J = 1 To TotalRow
  74.                         ' 按照合并单元格的行数循环
  75.                         Debug.Print .Cells(i + J - 1, 4)
  76.                         If .Cells(i + J - 1, 4) <> "无" Then
  77.                             Now = Split(.Cells(i + J - 1, 4), "、") ' 取得当前行与C列交叉单元格的内容,分割到数组。
  78.                             For X = 0 To UBound(Now)
  79.                                 If InStr(List1, Now(X)) > 0 Then
  80.                                     ' 在产品列表中
  81.                                    ' ListCp = ListCp & Now(X) & "、"
  82.                                    If InStr(ListCp, Now(X)) = 0 Then ListCp = ListCp & Now(X) & "、"  '对同个原料中对应产品检验报告的风险物质去重
  83.                                 Else
  84.                                    ' ListYL = ListYL & Now(X) & "、"
  85.                                     If InStr(ListYL, Now(X)) = 0 Then ListYL = ListYL & Now(X) & "、"  '对同个原料中其他风险物质去重
  86.                                 End If
  87.                             Next
  88.                         End If
  89.                     Next
  90.                     If ListCp <> "" Then
  91.                         ListCp = Left(ListCp, Len(ListCp) - 1)
  92.                         Jg = Jg & "产品中" & ListCp & "含量的检验报告、"
  93.                     End If
  94.                     If ListYL <> "" Then
  95.                         ListYL = Left(ListYL, Len(ListYL) - 1)
  96.                         Jg = Jg & "原料中" & ListYL & "含量的原料质量规格证明资料。"
  97.                     End If
  98.                     If Jg <> "" Then
  99.                         With Sheets("附录 (新增)")
  100.                               NowRow = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
  101.                               .Cells(NowRow, 2) = Jgxh & "、"
  102.                               .Cells(NowRow, 3) = PFName & " 配方中" & Ylxh & "号原料:" & Jg
  103.                               Jg = ""
  104.                               ListCp = ""
  105.                               ListYL = ""
  106.                               Jgxh = Jgxh + 1
  107.                         End With
  108.                     End If
  109.                     i = i + J - 2
  110.                 End If
  111.             End If
  112.         Next i
  113.     End With
  114.     MsgBox "ok!"
  115. End Sub
  116. Function Merge(Rng As Range) As String
  117.     '-----------------------------------------------
  118.     ' 判断单元格是不是合并单元格,合并单元格的方向。
  119.     ' 返回值:
  120.     '       正常:非合并单元格
  121.     '       1列多行合并
  122.     '       1行多列合并
  123.     '       多行多列合并
  124.     '-----------------------------------------------
  125.     ' 定义单元格地址数组
  126.     Dim RngDZ() As String
  127.     Dim RngDZ1() As String
  128.     Dim RngDZ2() As String
  129.    
  130.     If Rng.MergeCells Then
  131.         ' 是合并单元格
  132.         RngDZ = Split(Rng.MergeArea.Address, ":")
  133.         RngDZ1 = Split(RngDZ(0), "$")
  134.         RngDZ2 = Split(RngDZ(1), "$")
  135.         If RngDZ1(1) = RngDZ2(1) Then
  136.             Merge = "1列多行合并"
  137.         Else
  138.             If RngDZ1(2) = RngDZ2(2) Then
  139.                 Merge = "1行多列合并"
  140.             Else
  141.                 Merge = "多行多列合并"
  142.             End If
  143.         End If
  144.     Else
  145.         ' 不是合并单元格
  146.         Merge = "正常"
  147.     End If
  148. End Function
  149. Function Delkg(Textlist As String) As String
  150.     '-----------------------------------------------
  151.     ' 删除多余的空格
  152.     '-----------------------------------------------
  153.     Dim i As Long ' 循环变量
  154.     Dim pp As String ' 是否空格
  155.    
  156.     pp = "否"
  157.     For i = 1 To Len(Textlist)
  158.         kk = Mid(Textlist, i, 1)
  159.         If kk = " " Then
  160.            If pp = "否" Then
  161.                 pp = "是"
  162.                 Delkg = Delkg & kk
  163.            End If
  164.         Else
  165.             pp = "否"
  166.             Delkg = Delkg & kk
  167.         End If
  168.     Next
  169. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-7-3 09:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
回复的代码在审核中。
代码中直接引用了工作表的名称,要确保工作表的名称和代码中的一致。
没有进行错误判断。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-3 22:13 | 显示全部楼层
边缘码农 发表于 2024-7-3 09:35
回复的代码在审核中。
代码中直接引用了工作表的名称,要确保工作表的名称和代码中的一致。
没有进行错误 ...

感谢大佬的相助,刚测试了一下,就是需要的效果!
非常感谢!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-9 13:02 | 显示全部楼层
边缘码农 发表于 2024-7-2 07:38
If InStr(ListCp, Now(X)) = 0 Then ListCp = ListCp & Now(X) & "、"

If InStr(ListYL, Now(X)) = 0 Th ...

再次请教大佬,这个代码是模糊去重的,比如同一个原料(多个组分对应多种风险物质)中有风险物质“苯”、“苯酚”,会将“苯”去重了,只剩下“苯酚”,请问要怎么样才可以精准去重了?

TA的精华主题

TA的得分主题

发表于 2024-7-9 17:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
山海风云轩 发表于 2024-7-9 13:02
再次请教大佬,这个代码是模糊去重的,比如同一个原料(多个组分对应多种风险物质)中有风险物质“苯”、 ...

把运行结果和基础数据截一下图,或者把附件发上来,我现在不清楚基础资料是什么状况。我这边模拟了一下,应该没问题。

TA的精华主题

TA的得分主题

发表于 2024-7-9 17:27 | 显示全部楼层
找我有事,用回复,不然可能会漏掉。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-9 20:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
边缘码农 发表于 2024-7-9 17:27
找我有事,用回复,不然可能会漏掉。

好的,大佬,我发附件上来,已经模拟好情形了
举例.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-7-9 20:23 | 显示全部楼层
这里是附件

000合并单元格对应的汇总-多配方.zip

30.38 KB, 下载次数: 4

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

本版积分规则

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

GMT+8, 2024-11-18 01:37 , Processed in 0.044095 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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