鱼C论坛

 找回密码
 立即注册
查看: 349|回复: 11

[已解决]求助一个vba

[复制链接]
发表于 2024-12-27 16:02:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
考虑写一个excel工作表change的事件
如果行数大于3,当列数为B,C,D,E的单元格内容发生改变时候,
首先清空该行的H,I,J,K的单元格的数据
将变更单元格行的B,C,D,E的单元格的内容合并为一个字符串
对这个字符串进行分析,
分支选择如下
1.如果字符串包含以下字段组合,"无缝","钢管",且不含"锌"或者"zinc"或者"galv",将该单元格所在行的H列单元格赋值为"无缝钢管",此处是后续判断的基础,作为程序设计标记为"判断1.1"
在"判断1.1"的基础上增加判断,
  如果字符串包含"3405",将该单元格所在行的I列单元格赋值为"SH/T3405";
  如果字符串包含"36.10",将该单元格所在行的I列单元格赋值为"ASME B36.10";
  如果字符串包含"36.19",将该单元格所在行的I列单元格赋值为"ASME B36.19";
  如果字符串包含"20553"且含有"a",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅰa)";
  如果字符串包含"20553"且含有"b",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅰb)";
  如果字符串包含"20553"且含有"Ⅱ",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅱ)";
  如果字符串包含"17395"且含有"Ⅰ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅰ)";
  如果字符串包含"17395"且含有"Ⅱ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅱ)";
  如果字符串包含"17395"且含有"Ⅲ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅲ)";
在"判断1.1"的基础上增加判断,
  如果字符串包含"20"且含有"8163",将该单元格所在行的J列单元格赋值为"20-GB/T8163";
  如果字符串包含"20"且含有"9948",将该单元格所在行的J列单元格赋值为"20-GB/T9948";
  如果字符串包含"20"且含有"3087",将该单元格所在行的J列单元格赋值为"20-GB/T3087";
  如果字符串包含"20"且含有"5310",将该单元格所在行的J列单元格赋值为"20G-GB/T5310";
  如果字符串包含"15Cr"且不含有"9948",将该单元格所在行的J列单元格赋值为"15CrMoG-GB/T5310";
  如果字符串包含"12Cr",将该单元格所在行的J列单元格赋值为"12Cr1MoVG-GB/T5310";
  如果字符串包含"15CrMo"且含有"9948",将该单元格所在行的J列单元格赋值为"15CrMo-GB/T9948";S30403-GB/T14976
  如果字符串包含"30403",将该单元格所在行的J列单元格赋值为"S30403-GB/T14976";
  如果字符串包含"316",将该单元格所在行的J列单元格赋值为"S31603-GB/T14976";
  如果字符串包含"310",将该单元格所在行的J列单元格赋值为"S31008-GB/T14976";
  如果字符串包含"2205",将该单元格所在行的J列单元格赋值为"S22053-GB/T14976"
  如果字符串包含"304"且含有"13296",将该单元格所在行的J列单元格赋值为"S30408-GB/T13296"
  如果字符串包含"304"且含有"312",将该单元格所在行的J列单元格赋值为"TP304-A312"
  如果字符串包含"304且不含有包含"30403",将该单元格所在行的J列单元格赋值为"S30408-GB/T14976";

如果字符串包含以下字段组合,"无缝","钢管",且含"锌"或者"zinc"或者"galv",将该单元格所在行的H列单元格赋值为"无缝钢管(镀锌)"

要求该代码以VBA写,且重复得用sub,function进行封装简化,保证后续程序重复调用,并且充分得写注释
最佳答案
2024-12-27 16:02:58
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim changedRow As Long
  3.     Dim text As String

  4.     ' 监控范围:B, C, D, E 列
  5.     If Not Intersect(Target, Me.Range("B:E")) Is Nothing Then
  6.         changedRow = Target.Row

  7.         ' 如果行数大于3
  8.         If changedRow > 3 Then
  9.             ' 清空该行的H, I, J, K单元格的数据
  10.             Me.Range("H" & changedRow & ":K" & changedRow).ClearContents

  11.             ' 合并B, C, D, E列内容为一个字符串
  12.             text = Join(Application.Transpose(Application.Transpose(Me.Range("B" & changedRow & ":E" & changedRow).Value)), "")

  13.             ' 第一个判断:无缝钢管且不含锌
  14.             If CheckBasicCondition(text, False) Then
  15.                 Me.Cells(changedRow, "H").Value = "无缝钢管"
  16.                 ' 后续条件分析并赋值I, J列
  17.                 AssignStandards_I text, changedRow
  18.                 AssignMaterials_J text, changedRow
  19.             End If

  20.             ' 第二个判断:无缝钢管且含锌
  21.             If CheckBasicCondition(text, True) Then
  22.                 Me.Cells(changedRow, "H").Value = "无缝钢管(镀锌)"
  23.             End If
  24.         End If
  25.     End If
  26. End Sub

  27. Function CheckBasicCondition(ByVal text As String, ByVal containsZinc As Boolean) As Boolean
  28.     If InStr(text, "无缝") > 0 And InStr(text, "钢管") > 0 Then
  29.         If containsZinc Then
  30.             CheckBasicCondition = (InStr(text, "锌") > 0 Or InStr(text, "zinc") > 0 Or InStr(text, "galv") > 0)
  31.         Else
  32.             CheckBasicCondition = (InStr(text, "锌") = 0 And InStr(text, "zinc") = 0 And InStr(text, "galv") = 0)
  33.         End If
  34.     Else
  35.         CheckBasicCondition = False
  36.     End If
  37. End Function

  38. Sub AssignStandards_I(ByVal text As String, ByVal row As Long)
  39.     Select Case True
  40.         Case InStr(text, "3405") > 0
  41.             Cells(row, "I").Value = "SH/T3405"
  42.         Case InStr(text, "36.10") > 0
  43.             Cells(row, "I").Value = "ASME B36.10"
  44.         Case InStr(text, "36.19") > 0
  45.             Cells(row, "I").Value = "ASME B36.19"
  46.         Case InStr(text, "20553") > 0
  47.             If InStr(text, "a") > 0 Then
  48.                 Cells(row, "I").Value = "HG/T20553(Ⅰa)"
  49.             ElseIf InStr(text, "b") > 0 Then
  50.                 Cells(row, "I").Value = "HG/T20553(Ⅰb)"
  51.             ElseIf InStr(text, "Ⅱ") > 0 Then
  52.                 Cells(row, "I").Value = "HG/T20553(Ⅱ)"
  53.             End If
  54.         Case InStr(text, "17395") > 0
  55.             If InStr(text, "Ⅰ") > 0 Then
  56.                 Cells(row, "I").Value = "GB/T17395(Ⅰ)"
  57.             ElseIf InStr(text, "Ⅱ") > 0 Then
  58.                 Cells(row, "I").Value = "GB/T17395(Ⅱ)"
  59.             ElseIf InStr(text, "Ⅲ") > 0 Then
  60.                 Cells(row, "I").Value = "GB/T17395(Ⅲ)"
  61.             End If
  62.     End Select
  63. End Sub

  64. Sub AssignMaterials_J(ByVal text As String, ByVal row As Long)
  65.     Select Case True
  66.         Case InStr(text, "20") > 0 And InStr(text, "8163") > 0
  67.             Cells(row, "J").Value = "20-GB/T8163"
  68.         Case InStr(text, "20") > 0 And InStr(text, "9948") > 0
  69.             Cells(row, "J").Value = "20-GB/T9948"
  70.         Case InStr(text, "20") > 0 And InStr(text, "3087") > 0
  71.             Cells(row, "J").Value = "20-GB/T3087"
  72.         Case InStr(text, "20") > 0 And InStr(text, "5310") > 0
  73.             Cells(row, "J").Value = "20G-GB/T5310"
  74.         Case InStr(text, "15Cr") > 0 And InStr(text, "9948") = 0
  75.             Cells(row, "J").Value = "15CrMoG-GB/T5310"
  76.         Case InStr(text, "12Cr") > 0
  77.             Cells(row, "J").Value = "12Cr1MoVG-GB/T5310"
  78.         Case InStr(text, "15CrMo") > 0 And InStr(text, "9948") > 0
  79.             Cells(row, "J").Value = "15CrMo-GB/T9948"
  80.         Case InStr(text, "30403") > 0
  81.             Cells(row, "J").Value = "S30403-GB/T14976"
  82.         Case InStr(text, "316") > 0
  83.             Cells(row, "J").Value = "S31603-GB/T14976"
  84.         Case InStr(text, "310") > 0
  85.             Cells(row, "J").Value = "S31008-GB/T14976"
  86.         Case InStr(text, "2205") > 0
  87.             Cells(row, "J").Value = "S22053-GB/T14976"
  88.         Case InStr(text, "304") > 0 And InStr(text, "13296") > 0
  89.             Cells(row, "J").Value = "S30408-GB/T13296"
  90.         Case InStr(text, "304") > 0 And InStr(text, "312") > 0
  91.             Cells(row, "J").Value = "TP304-A312"
  92.         Case InStr(text, "304") > 0 And InStr(text, "30403") = 0
  93.             Cells(row, "J").Value = "S30408-GB/T14976"
  94.     End Select
  95. End Sub
复制代码


以上的VBA代码通过Worksheet_Change事件实现了所需的功能。代码将事件处理程序封装在各自的Sub和Function中,便于重复调用和简化代码结构。注释和函数命名提供了逻辑的清晰划分,可以帮助理解和维护代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-12-27 16:02:58 | 显示全部楼层    本楼为最佳答案   
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim changedRow As Long
  3.     Dim text As String

  4.     ' 监控范围:B, C, D, E 列
  5.     If Not Intersect(Target, Me.Range("B:E")) Is Nothing Then
  6.         changedRow = Target.Row

  7.         ' 如果行数大于3
  8.         If changedRow > 3 Then
  9.             ' 清空该行的H, I, J, K单元格的数据
  10.             Me.Range("H" & changedRow & ":K" & changedRow).ClearContents

  11.             ' 合并B, C, D, E列内容为一个字符串
  12.             text = Join(Application.Transpose(Application.Transpose(Me.Range("B" & changedRow & ":E" & changedRow).Value)), "")

  13.             ' 第一个判断:无缝钢管且不含锌
  14.             If CheckBasicCondition(text, False) Then
  15.                 Me.Cells(changedRow, "H").Value = "无缝钢管"
  16.                 ' 后续条件分析并赋值I, J列
  17.                 AssignStandards_I text, changedRow
  18.                 AssignMaterials_J text, changedRow
  19.             End If

  20.             ' 第二个判断:无缝钢管且含锌
  21.             If CheckBasicCondition(text, True) Then
  22.                 Me.Cells(changedRow, "H").Value = "无缝钢管(镀锌)"
  23.             End If
  24.         End If
  25.     End If
  26. End Sub

  27. Function CheckBasicCondition(ByVal text As String, ByVal containsZinc As Boolean) As Boolean
  28.     If InStr(text, "无缝") > 0 And InStr(text, "钢管") > 0 Then
  29.         If containsZinc Then
  30.             CheckBasicCondition = (InStr(text, "锌") > 0 Or InStr(text, "zinc") > 0 Or InStr(text, "galv") > 0)
  31.         Else
  32.             CheckBasicCondition = (InStr(text, "锌") = 0 And InStr(text, "zinc") = 0 And InStr(text, "galv") = 0)
  33.         End If
  34.     Else
  35.         CheckBasicCondition = False
  36.     End If
  37. End Function

  38. Sub AssignStandards_I(ByVal text As String, ByVal row As Long)
  39.     Select Case True
  40.         Case InStr(text, "3405") > 0
  41.             Cells(row, "I").Value = "SH/T3405"
  42.         Case InStr(text, "36.10") > 0
  43.             Cells(row, "I").Value = "ASME B36.10"
  44.         Case InStr(text, "36.19") > 0
  45.             Cells(row, "I").Value = "ASME B36.19"
  46.         Case InStr(text, "20553") > 0
  47.             If InStr(text, "a") > 0 Then
  48.                 Cells(row, "I").Value = "HG/T20553(Ⅰa)"
  49.             ElseIf InStr(text, "b") > 0 Then
  50.                 Cells(row, "I").Value = "HG/T20553(Ⅰb)"
  51.             ElseIf InStr(text, "Ⅱ") > 0 Then
  52.                 Cells(row, "I").Value = "HG/T20553(Ⅱ)"
  53.             End If
  54.         Case InStr(text, "17395") > 0
  55.             If InStr(text, "Ⅰ") > 0 Then
  56.                 Cells(row, "I").Value = "GB/T17395(Ⅰ)"
  57.             ElseIf InStr(text, "Ⅱ") > 0 Then
  58.                 Cells(row, "I").Value = "GB/T17395(Ⅱ)"
  59.             ElseIf InStr(text, "Ⅲ") > 0 Then
  60.                 Cells(row, "I").Value = "GB/T17395(Ⅲ)"
  61.             End If
  62.     End Select
  63. End Sub

  64. Sub AssignMaterials_J(ByVal text As String, ByVal row As Long)
  65.     Select Case True
  66.         Case InStr(text, "20") > 0 And InStr(text, "8163") > 0
  67.             Cells(row, "J").Value = "20-GB/T8163"
  68.         Case InStr(text, "20") > 0 And InStr(text, "9948") > 0
  69.             Cells(row, "J").Value = "20-GB/T9948"
  70.         Case InStr(text, "20") > 0 And InStr(text, "3087") > 0
  71.             Cells(row, "J").Value = "20-GB/T3087"
  72.         Case InStr(text, "20") > 0 And InStr(text, "5310") > 0
  73.             Cells(row, "J").Value = "20G-GB/T5310"
  74.         Case InStr(text, "15Cr") > 0 And InStr(text, "9948") = 0
  75.             Cells(row, "J").Value = "15CrMoG-GB/T5310"
  76.         Case InStr(text, "12Cr") > 0
  77.             Cells(row, "J").Value = "12Cr1MoVG-GB/T5310"
  78.         Case InStr(text, "15CrMo") > 0 And InStr(text, "9948") > 0
  79.             Cells(row, "J").Value = "15CrMo-GB/T9948"
  80.         Case InStr(text, "30403") > 0
  81.             Cells(row, "J").Value = "S30403-GB/T14976"
  82.         Case InStr(text, "316") > 0
  83.             Cells(row, "J").Value = "S31603-GB/T14976"
  84.         Case InStr(text, "310") > 0
  85.             Cells(row, "J").Value = "S31008-GB/T14976"
  86.         Case InStr(text, "2205") > 0
  87.             Cells(row, "J").Value = "S22053-GB/T14976"
  88.         Case InStr(text, "304") > 0 And InStr(text, "13296") > 0
  89.             Cells(row, "J").Value = "S30408-GB/T13296"
  90.         Case InStr(text, "304") > 0 And InStr(text, "312") > 0
  91.             Cells(row, "J").Value = "TP304-A312"
  92.         Case InStr(text, "304") > 0 And InStr(text, "30403") = 0
  93.             Cells(row, "J").Value = "S30408-GB/T14976"
  94.     End Select
  95. End Sub
复制代码


以上的VBA代码通过Worksheet_Change事件实现了所需的功能。代码将事件处理程序封装在各自的Sub和Function中,便于重复调用和简化代码结构。注释和函数命名提供了逻辑的清晰划分,可以帮助理解和维护代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-27 16:20:56 | 显示全部楼层
考虑写一个excel工作表change的事件
如果行数大于3,当列数为B,C,D,E的单元格内容发生改变时候,
首先清空该行的H,I,J,K的单元格的数据
将变更单元格行的B,C,D,E的单元格的内容合并为一个字符串
对这个字符串进行分析,
分支选择如下
1.如果字符串包含以下字段组合,"无缝","钢管",且不含"锌"或者"zinc"或者"galv",将该单元格所在行的H列单元格赋值为"无缝钢管",此处是后续判断的基础,作为程序设计标记为"判断1.1"
在"判断1.1"的基础上增加判断,
  如果字符串包含"3405",将该单元格所在行的I列单元格赋值为"SH/T3405";
  如果字符串包含"36.10",将该单元格所在行的I列单元格赋值为"ASME B36.10";
  如果字符串包含"36.19",将该单元格所在行的I列单元格赋值为"ASME B36.19";
  如果字符串包含"20553"且含有"a",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅰa)";
  如果字符串包含"20553"且含有"b",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅰb)";
  如果字符串包含"20553"且含有"Ⅱ",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅱ)";
  如果字符串包含"17395"且含有"Ⅰ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅰ)";
  如果字符串包含"17395"且含有"Ⅱ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅱ)";
  如果字符串包含"17395"且含有"Ⅲ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅲ)";
在"判断1.1"的基础上增加判断,
  如果字符串包含"20"且含有"8163",将该单元格所在行的J列单元格赋值为"20-GB/T8163";
  如果字符串包含"20"且含有"9948",将该单元格所在行的J列单元格赋值为"20-GB/T9948";
  如果字符串包含"20"且含有"3087",将该单元格所在行的J列单元格赋值为"20-GB/T3087";
  如果字符串包含"20"且含有"5310",将该单元格所在行的J列单元格赋值为"20G-GB/T5310";
  如果字符串包含"15Cr"且不含有"9948",将该单元格所在行的J列单元格赋值为"15CrMoG-GB/T5310";
  如果字符串包含"12Cr",将该单元格所在行的J列单元格赋值为"12Cr1MoVG-GB/T5310";
  如果字符串包含"15CrMo"且含有"9948",将该单元格所在行的J列单元格赋值为"15CrMo-GB/T9948";S30403-GB/T14976
  如果字符串包含"30403",将该单元格所在行的J列单元格赋值为"S30403-GB/T14976";
  如果字符串包含"316",将该单元格所在行的J列单元格赋值为"S31603-GB/T14976";
  如果字符串包含"310",将该单元格所在行的J列单元格赋值为"S31008-GB/T14976";
  如果字符串包含"2205",将该单元格所在行的J列单元格赋值为"S22053-GB/T14976"
  如果字符串包含"304"且含有"13296",将该单元格所在行的J列单元格赋值为"S30408-GB/T13296"
  如果字符串包含"304"且含有"312",将该单元格所在行的J列单元格赋值为"TP304-A312"
  如果字符串包含"304且不含有包含"30403",将该单元格所在行的J列单元格赋值为"S30408-GB/T14976";

在"判断1.1"的基础上增加判断,
如果字符串包含类似于"Φ133x4","Φ133x4.5","Φ45*4.5"这些类型的数据,将该单元格所在行的K列单元格赋值为"Φ??*??"数据;



如果字符串包含以下字段组合,"无缝","钢管",且含"锌"或者"zinc"或者"galv",将该单元格所在行的H列单元格赋值为"无缝钢管(镀锌)"

要求该代码以VBA写,且重复得用sub,function进行封装简化,保证后续程序重复调用,并且充分得写注释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-27 16:21:52 | 显示全部楼层
颂风侯 发表于 2024-12-27 16:20
考虑写一个excel工作表change的事件
如果行数大于3, ...

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim changedRow As Long
  3.     Dim text As String

  4.     ' 监控范围:B, C, D, E 列
  5.     If Not Intersect(Target, Me.Range("B:E")) Is Nothing Then
  6.         changedRow = Target.Row

  7.         ' 如果行数大于3
  8.         If changedRow > 3 Then
  9.             ' 清空该行的H, I, J, K单元格的数据
  10.             Me.Range("H" & changedRow & ":K" & changedRow).ClearContents
  11.             
  12.             ' 合并B, C, D, E列内容为一个字符串
  13.             text = Join(Application.Transpose(Application.Transpose(Me.Range("B" & changedRow & ":E" & changedRow).Value)), "")
  14.             
  15.             ' 第一分支选择逻辑
  16.             Call BasicConditionCheck(text, changedRow)
  17.         End If
  18.     End If
  19. End Sub

  20. Sub BasicConditionCheck(ByVal text As String, ByVal row As Long)
  21.     ' 判断字符串中是否包含 "无缝", "钢管" 且不包含 "锌", "zinc", "galv"
  22.     If InStr(text, "无缝") > 0 And InStr(text, "钢管") > 0 Then
  23.         If InStr(text, "锌") = 0 And InStr(text, "zinc") = 0 And InStr(text, "galv") = 0 Then
  24.             Cells(row, "H").Value = "无缝钢管"
  25.             
  26.             ' 后续判定并赋值I, J, K列
  27.             AssignStandards_I text, row
  28.             AssignMaterials_J text, row
  29.             AssignDimensions_K text, row
  30.         ElseIf InStr(text, "锌") > 0 Or InStr(text, "zinc") > 0 Or InStr(text, "galv") > 0 Then
  31.             Cells(row, "H").Value = "无缝钢管(镀锌)"
  32.         End If
  33.     End If
  34. End Sub

  35. Sub AssignStandards_I(ByVal text As String, ByVal row As Long)
  36.     Select Case True
  37.         Case InStr(text, "3405") > 0
  38.             Cells(row, "I").Value = "SH/T3405"
  39.         Case InStr(text, "36.10") > 0
  40.             Cells(row, "I").Value = "ASME B36.10"
  41.         Case InStr(text, "36.19") > 0
  42.             Cells(row, "I").Value = "ASME B36.19"
  43.         Case InStr(text, "20553") > 0
  44.             If InStr(text, "a") > 0 Then
  45.                 Cells(row, "I").Value = "HG/T20553(Ⅰa)"
  46.             ElseIf InStr(text, "b") > 0 Then
  47.                 Cells(row, "I").Value = "HG/T20553(Ⅰb)"
  48.             ElseIf InStr(text, "Ⅱ") > 0 Then
  49.                 Cells(row, "I").Value = "HG/T20553(Ⅱ)"
  50.             End If
  51.         Case InStr(text, "17395") > 0
  52.             If InStr(text, "Ⅰ") > 0 Then
  53.                 Cells(row, "I").Value = "GB/T17395(Ⅰ)"
  54.             ElseIf InStr(text, "Ⅱ") > 0 Then
  55.                 Cells(row, "I").Value = "GB/T17395(Ⅱ)"
  56.             ElseIf InStr(text, "Ⅲ") > 0 Then
  57.                 Cells(row, "I").Value = "GB/T17395(Ⅲ)"
  58.             End If
  59.     End Select
  60. End Sub

  61. Sub AssignMaterials_J(ByVal text As String, ByVal row As Long)
  62.     Select Case True
  63.         Case InStr(text, "20") > 0 And InStr(text, "8163") > 0
  64.             Cells(row, "J").Value = "20-GB/T8163"
  65.         Case InStr(text, "20") > 0 And InStr(text, "9948") > 0
  66.             Cells(row, "J").Value = "20-GB/T9948"
  67.         Case InStr(text, "20") > 0 And InStr(text, "3087") > 0
  68.             Cells(row, "J").Value = "20-GB/T3087"
  69.         Case InStr(text, "20") > 0 And InStr(text, "5310") > 0
  70.             Cells(row, "J").Value = "20G-GB/T5310"
  71.         Case InStr(text, "15Cr") > 0 And InStr(text, "9948") = 0
  72.             Cells(row, "J").Value = "15CrMoG-GB/T5310"
  73.         Case InStr(text, "12Cr") > 0
  74.             Cells(row, "J").Value = "12Cr1MoVG-GB/T5310"
  75.         Case InStr(text, "15CrMo") > 0 And InStr(text, "9948") > 0
  76.             Cells(row, "J").Value = "15CrMo-GB/T9948"
  77.         Case InStr(text, "30403") > 0
  78.             Cells(row, "J").Value = "S30403-GB/T14976"
  79.         Case InStr(text, "316") > 0
  80.             Cells(row, "J").Value = "S31603-GB/T14976"
  81.         Case InStr(text, "310") > 0
  82.             Cells(row, "J").Value = "S31008-GB/T14976"
  83.         Case InStr(text, "2205") > 0
  84.             Cells(row, "J").Value = "S22053-GB/T14976"
  85.         Case InStr(text, "304") > 0 And InStr(text, "13296") > 0
  86.             Cells(row, "J").Value = "S30408-GB/T13296"
  87.         Case InStr(text, "304") > 0 And InStr(text, "312") > 0
  88.             Cells(row, "J").Value = "TP304-A312"
  89.         Case InStr(text, "304") > 0 And InStr(text, "30403") = 0
  90.             Cells(row, "J").Value = "S30408-GB/T14976"
  91.     End Select
  92. End Sub

  93. Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
  94.     Dim pattern As String
  95.     Dim match As Object
  96.     Dim regex As Object

  97.     ' 正则表达式查找形如 "Φ133x4", "Φ133x4.5", "Φ45*4.5"
  98.     pattern = "Φ\d+[\*x]\d+\.?\d*"
  99.    
  100.     Set regex = CreateObject("VBScript.RegExp")
  101.     With regex
  102.         .Pattern = pattern
  103.         .Global = False
  104.         .IgnoreCase = True
  105.     End With

  106.     If regex.Test(text) Then
  107.         Set match = regex.Execute(text)(0)
  108.         Cells(row, "K").Value = match.Value
  109.     End If
  110. End Sub
复制代码


此代码通过事件处理和分支判断实现了所需功能。其中:

- `Worksheet_Change` 事件函数用于监控特定列的变化,触发相应的操作。
- `BasicConditionCheck` 用于基础条件判断,并调用其他子程序对特定列进行操作。
- `AssignStandards_I` 和 `AssignMaterials_J` 用于在满足条件时填充I和J列。
- `AssignDimensions_K` 使用正则表达式查找特定格式的数据并赋值K列。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-27 16:35:44 | 显示全部楼层
考虑写一个excel工作表change的事件
如果行数大于3,当列数为B,C,D,E的单元格内容发生改变时候,
首先清空该行的H,I,J,K的单元格的数据
将变更单元格行的B,C,D,E的单元格的内容合并为一个字符串
对这个字符串进行分析,
分支选择如下
1.如果字符串包含以下字段组合,"无缝","钢管",且不含"锌"或者"zinc"或者"galv",将该单元格所在行的H列单元格赋值为"无缝钢管",此处是后续判断的基础,作为程序设计标记为"判断1.1"
在"判断1.1"的基础上增加判断,
  如果字符串包含"3405",将该单元格所在行的I列单元格赋值为"SH/T3405";
  如果字符串包含"36.10",将该单元格所在行的I列单元格赋值为"ASME B36.10";
  如果字符串包含"36.19",将该单元格所在行的I列单元格赋值为"ASME B36.19";
  如果字符串包含"20553"且含有"a",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅰa)";
  如果字符串包含"20553"且含有"b",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅰb)";
  如果字符串包含"20553"且含有"Ⅱ",将该单元格所在行的I列单元格赋值为"HG/T20553(Ⅱ)";
  如果字符串包含"17395"且含有"Ⅰ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅰ)";
  如果字符串包含"17395"且含有"Ⅱ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅱ)";
  如果字符串包含"17395"且含有"Ⅲ",将该单元格所在行的I列单元格赋值为"GB/T17395(Ⅲ)";
在"判断1.1"的基础上增加判断,
  如果字符串包含"20"且含有"8163",将该单元格所在行的J列单元格赋值为"20-GB/T8163";
  如果字符串包含"20"且含有"9948",将该单元格所在行的J列单元格赋值为"20-GB/T9948";
  如果字符串包含"20"且含有"3087",将该单元格所在行的J列单元格赋值为"20-GB/T3087";
  如果字符串包含"20"且含有"5310",将该单元格所在行的J列单元格赋值为"20G-GB/T5310";
  如果字符串包含"15Cr"且不含有"9948",将该单元格所在行的J列单元格赋值为"15CrMoG-GB/T5310";
  如果字符串包含"12Cr",将该单元格所在行的J列单元格赋值为"12Cr1MoVG-GB/T5310";
  如果字符串包含"15CrMo"且含有"9948",将该单元格所在行的J列单元格赋值为"15CrMo-GB/T9948";S30403-GB/T14976
  如果字符串包含"30403",将该单元格所在行的J列单元格赋值为"S30403-GB/T14976";
  如果字符串包含"316",将该单元格所在行的J列单元格赋值为"S31603-GB/T14976";
  如果字符串包含"310",将该单元格所在行的J列单元格赋值为"S31008-GB/T14976";
  如果字符串包含"2205",将该单元格所在行的J列单元格赋值为"S22053-GB/T14976"
  如果字符串包含"304"且含有"13296",将该单元格所在行的J列单元格赋值为"S30408-GB/T13296"
  如果字符串包含"304"且含有"312",将该单元格所在行的J列单元格赋值为"TP304-A312"
  如果字符串包含"304且不含有包含"30403",将该单元格所在行的J列单元格赋值为"S30408-GB/T14976";

在"判断1.1"的基础上增加判断,
如果字符串包含类似于"Φ133x4","Φ133x4.5","Φ45*4.5","φ45*4.5"这些类型的数据,将该单元格所在行的K列单元格赋值为"Φ??*??"数据;



如果字符串包含以下字段组合,"无缝","钢管",且含"锌"或者"zinc"或者"galv",将该单元格所在行的H列单元格赋值为"无缝钢管(镀锌)"

要求该代码以VBA写,且重复得用sub,function进行封装简化,保证后续程序重复调用,并且充分得写注释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-27 16:36:24 | 显示全部楼层
颂风侯 发表于 2024-12-27 16:35
考虑写一个excel工作表change的事件
如果行数大于3, ...

  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim changedRow As Long
  3.     Dim concatenatedText As String

  4.     ' 仅监听列B, C, D, E的修改
  5.     If Not Intersect(Target, Me.Range("B:E")) Is Nothing Then
  6.         changedRow = Target.Row

  7.         ' 确保所改变的行大于3
  8.         If changedRow > 3 Then
  9.             ' 清空H, I, J, K列
  10.             Me.Range("H" & changedRow & ":K" & changedRow).ClearContents
  11.             
  12.             ' 合并B, C, D, E列内容为单个字符串
  13.             concatenatedText = Join(Application.Transpose(Application.Transpose(Me.Range("B" & changedRow & ":E" & changedRow).Value)), "")
  14.             
  15.             ' 条件判断和赋值
  16.             If CheckSeamlessPipe(concatenatedText) Then
  17.                 Me.Cells(changedRow, "H").Value = "无缝钢管"
  18.                 AssignStandards_I concatenatedText, changedRow
  19.                 AssignMaterials_J concatenatedText, changedRow
  20.                 AssignDimensions_K concatenatedText, changedRow
  21.             ElseIf CheckGalvanizedPipe(concatenatedText) Then
  22.                 Me.Cells(changedRow, "H").Value = "无缝钢管(镀锌)"
  23.             End If
  24.         End If
  25.     End If
  26. End Sub

  27. Function CheckSeamlessPipe(ByVal text As String) As Boolean
  28.     ' 检查是否为无缝钢管且不含锌
  29.     CheckSeamlessPipe = InStr(text, "无缝") > 0 And InStr(text, "钢管") > 0 And _
  30.                         InStr(text, "锌") = 0 And InStr(text, "zinc") = 0 And InStr(text, "galv") = 0
  31. End Function

  32. Function CheckGalvanizedPipe(ByVal text As String) As Boolean
  33.     ' 检查是否为镀锌无缝钢管
  34.     CheckGalvanizedPipe = InStr(text, "无缝") > 0 And InStr(text, "钢管") > 0 And _
  35.                           (InStr(text, "锌") > 0 Or InStr(text, "zinc") > 0 Or InStr(text, "galv") > 0)
  36. End Function

  37. Sub AssignStandards_I(ByVal text As String, ByVal row As Long)
  38.     ' 设置I列标准
  39.     Select Case True
  40.         Case InStr(text, "3405") > 0
  41.             Cells(row, "I").Value = "SH/T3405"
  42.         Case InStr(text, "36.10") > 0
  43.             Cells(row, "I").Value = "ASME B36.10"
  44.         Case InStr(text, "36.19") > 0
  45.             Cells(row, "I").Value = "ASME B36.19"
  46.         Case InStr(text, "20553") > 0
  47.             If InStr(text, "a") > 0 Then
  48.                 Cells(row, "I").Value = "HG/T20553(Ⅰa)"
  49.             ElseIf InStr(text, "b") > 0 Then
  50.                 Cells(row, "I").Value = "HG/T20553(Ⅰb)"
  51.             ElseIf InStr(text, "Ⅱ") > 0 Then
  52.                 Cells(row, "I").Value = "HG/T20553(Ⅱ)"
  53.             End If
  54.         Case InStr(text, "17395") > 0
  55.             If InStr(text, "Ⅰ") > 0 Then
  56.                 Cells(row, "I").Value = "GB/T17395(Ⅰ)"
  57.             ElseIf InStr(text, "Ⅱ") > 0 Then
  58.                 Cells(row, "I").Value = "GB/T17395(Ⅱ)"
  59.             ElseIf InStr(text, "Ⅲ") > 0 Then
  60.                 Cells(row, "I").Value = "GB/T17395(Ⅲ)"
  61.             End If
  62.     End Select
  63. End Sub

  64. Sub AssignMaterials_J(ByVal text As String, ByVal row As Long)
  65.     ' 设置J列材料
  66.     Select Case True
  67.         Case InStr(text, "20") > 0 And InStr(text, "8163") > 0
  68.             Cells(row, "J").Value = "20-GB/T8163"
  69.         Case InStr(text, "20") > 0 And InStr(text, "9948") > 0
  70.             Cells(row, "J").Value = "20-GB/T9948"
  71.         Case InStr(text, "20") > 0 And InStr(text, "3087") > 0
  72.             Cells(row, "J").Value = "20-GB/T3087"
  73.         Case InStr(text, "20") > 0 And InStr(text, "5310") > 0
  74.             Cells(row, "J").Value = "20G-GB/T5310"
  75.         Case InStr(text, "15Cr") > 0 And InStr(text, "9948") = 0
  76.             Cells(row, "J").Value = "15CrMoG-GB/T5310"
  77.         Case InStr(text, "12Cr") > 0
  78.             Cells(row, "J").Value = "12Cr1MoVG-GB/T5310"
  79.         Case InStr(text, "15CrMo") > 0 And InStr(text, "9948") > 0
  80.             Cells(row, "J").Value = "15CrMo-GB/T9948"
  81.         Case InStr(text, "30403") > 0
  82.             Cells(row, "J").Value = "S30403-GB/T14976"
  83.         Case InStr(text, "316") > 0
  84.             Cells(row, "J").Value = "S31603-GB/T14976"
  85.         Case InStr(text, "310") > 0
  86.             Cells(row, "J").Value = "S31008-GB/T14976"
  87.         Case InStr(text, "2205") > 0
  88.             Cells(row, "J").Value = "S22053-GB/T14976"
  89.         Case InStr(text, "304") > 0 And InStr(text, "13296") > 0
  90.             Cells(row, "J").Value = "S30408-GB/T13296"
  91.         Case InStr(text, "304") > 0 And InStr(text, "312") > 0
  92.             Cells(row, "J").Value = "TP304-A312"
  93.         Case InStr(text, "304") > 0 And InStr(text, "30403") = 0
  94.             Cells(row, "J").Value = "S30408-GB/T14976"
  95.     End Select
  96. End Sub

  97. Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
  98.     Dim pattern As String
  99.     Dim regex As Object
  100.     Dim matches As Object

  101.     ' 使用正则表达式匹配类似"Φ133x4","Φ133x4.5","Φ45*4.5","φ45*4.5"的模式
  102.     pattern = "Φ[\d.]+x[\d.]+|Φ[\d.]+\*[\d.]+|φ[\d.]+x[\d.]+|φ[\d.]+\*[\d.]+"
  103.     Set regex = CreateObject("VBScript.RegExp")
  104.    
  105.     ' 配置正则对象
  106.     With regex
  107.         .Pattern = pattern
  108.         .Global = False
  109.         .IgnoreCase = True
  110.     End With

  111.     ' 如果符合匹配条件,则赋值K列
  112.     If regex.Test(text) Then
  113.         Set matches = regex.Execute(text)
  114.         Cells(row, "K").Value = matches(0).Value
  115.     End If
  116. End Sub
复制代码


以上代码实现了所需逻辑,包括:
1. 根据内容在H列进行基本判断。
2. 在满足基本判断的基础上将特定内容赋值到I列和J列。
3. 使用正则表达式将特定格式(如Φ133x4)的内容赋值到K列。
4. 各功能通过封装成独立的Sub或Function来实现,以便代码复用和维护。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-27 16:40:45 | 显示全部楼层
Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
  Dim pattern As String
  Dim match As Object
  Dim regex As Object

  ' 正则表达式查找形如 "Φ133x4", "Φ133x4.5", "Φ45*4.5"
  pattern = "Φ[\d.]+x[\d.]+|Φ[\d.]+\*[\d.]+|φ[\d.]+x[\d.]+|φ[\d.]+\*[\d.]+"

  Set regex = CreateObject("VBScript.RegExp")
  With regex
  .pattern = pattern
  .Global = False
  .IgnoreCase = True
  End With

  If regex.Test(text) Then
  Set match = regex.Execute(text)(0)
  Cells(row, "K").Value = match.Value
  End If
End Sub

这里错误,提示运行时错误1004
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-27 16:41:00 | 显示全部楼层
颂风侯 发表于 2024-12-27 16:40
Sub AssignDimensions_K(ByVal text As String, ByVal ...


整理正则表达式用法有误。正则表达式的`Pattern`应该能够准确匹配字符串中的格式。在这一问题中,我们需要寻找的模式可以描述为“一个大写或小写的Φ(或φ)后面跟随一组数字,然后是x或*,再跟随一组数字”。正则表达式模式中也需要适当调整以确保大写和小写的匹配。

请尝试以下调整后的代码:

  1. Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
  2.     Dim pattern As String
  3.     Dim matches As Object
  4.     Dim regex As Object

  5.     ' 正则表达式查找形如 "Φ133x4", "Φ133x4.5", "Φ45*4.5", "φ45*4.5"
  6.     pattern = "Φ\d+x\d+(\.\d+)?|φ\d+\*\d+(\.\d+)?"

  7.     Set regex = CreateObject("VBScript.RegExp")
  8.     With regex
  9.         .Pattern = pattern
  10.         .Global = False
  11.         .IgnoreCase = True
  12.     End With

  13.     If regex.Test(text) Then
  14.         Set matches = regex.Execute(text)
  15.         Cells(row, "K").Value = matches(0).Value
  16.     End If
  17. End Sub
复制代码


注意:
1. 使用`\d+`以匹配一个或多个数字。
2. `(\.\d+)?`表示可选的小数部分匹配。
3. 确保对于大小写不同的Φ(phi)使用正确的字符"Φ"和"φ"。

以上修正应解决代码中的错误,并正确匹配所需的字符串格式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-27 17:24:16 | 显示全部楼层
Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
    Dim pattern As String
    Dim matches As Object
    Dim regex As Object

     ' 正则表达式查找形如 "Φ133x4", "Φ133x4.5", "Φ45*4.5", "φ45*4.5"
    pattern = "Φ\d+x\d+(\.\d+)?|φ\d+\*\d+(\.\d+)?"

    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .pattern = pattern
        .Global = False
        .IgnoreCase = True
    End With

    If regex.Test(text) Then
        Set matches = regex.Execute(text)
        Cells(row, "K").Value = matches(0).Value
    End If
End Sub
还是错误的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-27 17:24:31 | 显示全部楼层
颂风侯 发表于 2024-12-27 17:24
Sub AssignDimensions_K(ByVal text As String, ByVal ...


出现运行时错误的原因可能是正则表达式没有正确匹配您的数据格式。我们需要确保正则表达式能够匹配到正确格式的数据。在此例中,我们要搜索的数据类型为“Φ133x4”、“Φ133x4.5”、“φ45*4.5”等,正则表达式的模式应该准确捕获这些格式。

请尝试以下调整后的代码,它旨在捕获您指定的数据格式:

  1. Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
  2.     Dim pattern As String
  3.     Dim matches As Object
  4.     Dim regex As Object

  5.     ' 正则表达式查找形如 "Φ133x4", "Φ133x4.5", "Φ45*4.5", "φ45*4.5"
  6.     pattern = "[Φφ]\d+(\.\d+)?[x\*]\d+(\.\d+)?"

  7.     Set regex = CreateObject("VBScript.RegExp")
  8.     With regex
  9.         .Pattern = pattern
  10.         .Global = False
  11.         .IgnoreCase = True
  12.     End With

  13.     If regex.Test(text) Then
  14.         Set matches = regex.Execute(text)
  15.         Cells(row, "K").Value = matches(0).Value
  16.     End If
  17. End Sub
复制代码


### 说明:
1. `"[Φφ]\d+(\.\d+)?[x\*]\d+(\.\d+)?"` 用于匹配:
   - `[Φφ]`:匹配“Φ”或“φ”。
   - `\d+`:匹配一个或多个数字。
   - `(\.\d+)?`:匹配可选的小数部分。
   - `[x\*]`:匹配字母'x'或字符'*'。
   - 结尾的 `\d+(\.\d+)?` 与前面的格式对称,捕获最后的数字或小数。

2. 请确保输入数据格式正确,并确认是否含有指定字符。

这段代码在单元格内执行正则表达式并将匹配到的内容显示在 K 列。确保 `text` 包含目标字符串,以便正则表达式成功提取并显示结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-27 17:33:09 | 显示全部楼层
在"判断1.1"的基础上增加判断,
如果字符串包含类似于"133x4","133x4.5","45*4.5"这些类型的数据,将该单元格所在行的K列单元格赋值为"Φ??*??"数据;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-27 17:44:33 | 显示全部楼层
颂风侯 发表于 2024-12-27 17:33
在"判断1.1"的基础上增加判断,
如果字符串包含类似 ...


明白了,如果要匹配类似于“133x4”、“133x4.5”或“45*4.5”的数据,并将其格式化为“Φ??*??”并赋值到K列,可以使用以下代码:

  1. Sub AssignDimensions_K(ByVal text As String, ByVal row As Long)
  2.     Dim pattern As String
  3.     Dim matches As Object
  4.     Dim regex As Object
  5.     Dim formattedValue As String

  6.     ' 正则表达式查找形如 "133x4", "133x4.5", "45*4.5"
  7.     pattern = "\d+(\.\d+)?[x*]\d+(\.\d+)?"

  8.     Set regex = CreateObject("VBScript.RegExp")
  9.     With regex
  10.         .Pattern = pattern
  11.         .Global = False
  12.         .IgnoreCase = True
  13.     End With

  14.     If regex.Test(text) Then
  15.         Set matches = regex.Execute(text)
  16.         formattedValue = Replace(matches(0).Value, "x", "*")
  17.         formattedValue = Replace(formattedValue, "X", "*")
  18.         Cells(row, "K").Value = "Φ" & formattedValue
  19.     End If
  20. End Sub
复制代码


### 说明:

1. **正则表达式模式** (`pattern`):
   - `\d+(\.\d+)?`: 匹配一个或多个数字,可以有可选的小数部分。
   - `[x*]`: 在"x"或"*"两个字符之间进行匹配。
   - 第二个`\d+(\.\d+)?`用于匹配"x"或"*"之后的数字或小数。

2. **代码逻辑**:
   - 使用正则表达式匹配 `text` 中是否含有指定的数字-分隔符-数字模式。
   - 使用 `Replace` 函数确保"x"和"X"都被替换为"*",以标准化输出格式。
   - 将结果格式化为“Φ??*??”并赋值到相应行的K列。

确认输入数据格式遵循上述描述以确保成功匹配并处理。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 05:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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