鱼C论坛

 找回密码
 立即注册
查看: 217|回复: 2

vba代码报错过程太大

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
10鱼币
  1. '已完成,作用:当表格执行删除行操作时候,标记isdeleteoperation为true,这样后续触发表变更事件会先写个代码判断跳过操作
  2. Function IsDeleteOperation(Target As Range) As Boolean
  3.     ' 修正工作表的引用方式("报价输入页"是当前表名)
  4.     With ThisWorkbook.Sheets("报价输入页")
  5.         ' 特征1:检查是否选择整行
  6.         If Target.Rows.Count > 1 And Target.Columns.Count = .Columns.Count Then
  7.             IsDeleteOperation = True
  8.             Exit Function
  9.         End If
  10.     End With

  11.     ' 特征2:撤消列表中包含"删除"
  12.     On Error Resume Next
  13.     Dim lastAction As String
  14.     lastAction = Application.CommandBars("Standard").Controls("撤消").List(1)
  15.     If InStr(lastAction, "删除") > 0 Then IsDeleteOperation = True
  16.     On Error GoTo 0

  17.     ' 特征3:检查整行是否为空
  18.     Dim r As Range
  19.     For Each r In Target.Rows
  20.         If WorksheetFunction.CountA(r.EntireRow) = 0 Then
  21.             IsDeleteOperation = True
  22.             Exit For
  23.         End If
  24.     Next r
  25. End Function

  26. '已完成
  27. Function IsDeletionCausedChange() As Boolean
  28.     ' 原有逻辑(根据实际情况调整)
  29.     IsDeletionCausedChange = False
  30. End Function

  31. ' 已完成,函数:在材料类型,材质,壁厚发生变更时,返回材料价格
  32. Function Find_Mat_Price(ByVal cCellValue As String, ByVal dCellValue As String, ByVal fCellValue As Double, ByVal db2Sheet As Worksheet) As Double
  33.     Dim i As Long
  34.     Dim db2AValue As String
  35.     Dim db2BValue As String
  36.     Dim db2DValue As Double
  37.     Dim db2EValue As Double
  38.     Dim db2FValue As Double
  39.     Dim lastRow As Long
  40.     Dim matchRow As Long

  41.     lastRow = db2Sheet.Cells(db2Sheet.Rows.Count, 1).End(xlUp).row
  42.     matchRow = 0 ' 默认返回 0,表示未找到匹配行

  43.     For i = 3 To lastRow
  44.         db2AValue = db2Sheet.Cells(i, 1).Value
  45.         db2BValue = db2Sheet.Cells(i, 2).Value
  46.         db2DValue = db2Sheet.Cells(i, 4).Value
  47.         db2EValue = db2Sheet.Cells(i, 5).Value
  48.         db2FValue = db2Sheet.Cells(i, 6).Value

  49.         ' 确保 db2DValue 和 db2EValue 是数值类型
  50.         If IsNumeric(db2DValue) And IsNumeric(db2EValue) Then
  51.             db2DValue = CDbl(db2DValue)
  52.             db2EValue = CDbl(db2EValue)
  53.         Else
  54.             Debug.Print "db2DValue or db2EValue is not numeric: " & db2DValue & ", " & db2EValue
  55.             Exit Function
  56.         End If

  57.         ' 检查是否符合条件
  58.         If db2AValue = cCellValue And db2BValue = dCellValue Then
  59.             If fCellValue >= db2DValue And fCellValue <= db2EValue Then
  60.                 matchRow = i
  61.                 Exit For
  62.             End If
  63.         End If
  64.     Next i

  65.     ' 如果找到匹配行,返回材料单价
  66.     If matchRow > 0 Then
  67.         Find_Mat_Price = db2Sheet.Cells(matchRow, 6).Value
  68.     Else
  69.         Find_Mat_Price = Empty ' 如果未找到匹配行,返回 -1
  70.     End If
  71. End Function

  72. '已完成,功能是在列外径或宽度,壁厚,长度发生变更的时候,根据内容修改体积的数值,用来计算体积的函数,
  73. Function calculate_volume(ByVal D As Double, ByVal T As Double, ByVal L As Double, ByVal name As String, ByVal density As Double) As Variant
  74.     Dim volume As Double

  75.     ' 根据名称判断类型并计算体积
  76.     If InStr(LCase(name), "管子") > 0 Then
  77.         ' 如果外径、壁厚和长度均大于0,则执行计算
  78.         If D > 0 And T > 0 And L > 0 Then
  79.             volume = (D - T) * 3.1416 * L * T / 1000 / 1000
  80.         Else
  81.             volume = Empty
  82.         End If
  83.         
  84.     ElseIf InStr(LCase(name), "封头") > 0 Then
  85.         Dim Df As Double
  86.         If D > 0 And T > 0 And L > 0 Then
  87.             Df = 1.213 * D + 1.5 * L * 1000 + 2 * T
  88.             volume = Df * Df * 3.1416 / 4 * T / 1000 / 1000 / 1000
  89.         Else
  90.             volume = Empty
  91.         End If
  92.         
  93.     ElseIf InStr(LCase(name), "板") > 0 Then
  94.         If D > 0 And T > 0 And L > 0 Then
  95.             volume = D * L * T / 1000 / 1000
  96.         Else
  97.             volume = Empty
  98.         End If
  99.         
  100.     Else
  101.         ' 如果名称不符合条件,则返回空值
  102.         volume = Empty
  103.     End If

  104.     ' 返回计算结果
  105.     calculate_volume = volume
  106. End Function

  107. '计算锅筒拍片总数
  108. Function count_numbers_shot(ByVal OD As Variant, ByVal length As Variant, ByVal quantity As Variant) As Variant
  109.     ' 检查壁厚、长度和数量是否为数值且大于0
  110.     If IsNumeric(OD) And OD > 0 And _
  111.        IsNumeric(length) And length > 0 And _
  112.        IsNumeric(quantity) And quantity > 0 Then
  113.         ' 如果所有条件满足,返回三列数值之和
  114.         count_numbers_shot = Int((CDbl(OD) * 3.14 * (CDbl(quantity) + 1) + CDbl(length) * CDbl(quantity) * 1000) / 280) + 10
  115.     Else
  116.         ' 如果任何条件不满足,返回空值
  117.         count_numbers_shot = Empty
  118.     End If
  119. End Function

  120. '抽取无损检测信息
  121. Function NDT(ByVal row As Long) As Variant
  122.     Dim baseValue As Double
  123.     Dim discount As Double
  124.     Dim proportion As String
  125.     Dim pricePerShot As Double
  126.     Dim actualShots As Long
  127.     Dim ndtCost As Double
  128.     Dim results(1) As Variant

  129.     ' 获取拍片总数
  130.     If IsNumeric(Me.Range("拍片总数").Cells(row, 1).Value) Then
  131.         baseValue = Me.Range("拍片总数").Cells(row, 1).Value
  132.     Else
  133.         baseValue = 0
  134.     End If

  135.     ' 获取拍片比例并转换为数值
  136.     proportion = Me.Range("拍片比例").Cells(row, 1).Value
  137.     If IsNumeric(Replace(proportion, "%", "")) Then
  138.         discount = CDbl(Replace(proportion, "%", "")) / 100
  139.     Else
  140.         discount = 1 ' 默认为 100%
  141.     End If

  142.     ' 获取拍片单价
  143.     If IsNumeric(Me.Range("拍片单价").Cells(row, 1).Value) And Me.Range("拍片单价").Cells(row, 1).Value > 0 Then
  144.         pricePerShot = Me.Range("拍片单价").Cells(row, 1).Value
  145.     Else
  146.         pricePerShot = 0
  147.     End If

  148.     ' 计算实际拍片数量和无损检测费
  149.     actualShots = Int(baseValue * discount)
  150.     ndtCost = baseValue * pricePerShot * discount

  151.     ' 返回结果
  152.     results(0) = actualShots
  153.     results(1) = ndtCost
  154.     NDT = results
  155. End Function

  156. '测试,抽取封头外加工费用,碳钢部分
  157. Function cap_out_cost(ByVal D As Double, ByVal T As Double, ByVal mat As String, ByVal db7Sheet As Worksheet) As Variant
  158.     Dim i As Long
  159.     Dim matchRow As Long
  160.     matchRow = 0
  161.         ' 在DB7表中查找符合条件的行
  162.         For i = 3 To db7Sheet.Cells(db7Sheet.Rows.Count, 1).End(xlUp).row
  163.             Dim col1 As Double
  164.             Dim col2 As Double
  165.             Dim col3 As Double
  166.             Dim col4 As Double

  167.             ' 强制转换为Double类型
  168.             col1 = CDbl(db7Sheet.Cells(i, 1).Value)
  169.             col2 = CDbl(db7Sheet.Cells(i, 2).Value)
  170.             col3 = CDbl(db7Sheet.Cells(i, 3).Value)
  171.             col4 = CDbl(db7Sheet.Cells(i, 4).Value)

  172.             ' 比较条件
  173.             If D > col1 And D < col2 And T > col3 And T < col4 Then
  174.                 matchRow = i
  175.                 Exit For
  176.             End If
  177.         Next i

  178.         ' 如果找到匹配的行,返回第五列的值
  179.         If matchRow > 0 Then
  180.                       ' 检查材质是否包含 "31" 或 "30"
  181.             If InStr(mat, "31") > 0 Or InStr(mat, "30") > 0 Then
  182.                 cap_out_cost = db7Sheet.Cells(matchRow, 6).Value
  183.             ElseIf Not IsEmpty(mat) Then
  184.                 cap_out_cost = db7Sheet.Cells(matchRow, 5).Value
  185.             Else
  186.                 ' 如果材质不包含 "31" 或 "30",返回空值
  187.                 cap_out_cost = Empty
  188.             End If
  189.             
  190.         Else
  191.             cap_out_cost = Empty
  192.         End If
  193.    
  194. End Function

  195. '计算制作费总和
  196. Function production_cost(ByVal row As Long, ByVal ws As Worksheet) As Double
  197.     Dim weldingCost As Double
  198.     Dim cuttingPaintingCost As Double
  199.     Dim materialCost As Double
  200.     Dim heatTreatmentCost As Double
  201.     Dim nonDestructiveTestingCost As Double
  202.     Dim outsourcingCost As Double
  203.     Dim machiningCost As Double
  204.     Dim weldingCost_hand As Double

  205.     weldingCost = 0
  206.     cuttingPaintingCost = 0
  207.     materialCost = 0
  208.     heatTreatmentCost = 0
  209.     nonDestructiveTestingCost = 0
  210.     outsourcingCost = 0
  211.     machiningCost = 0
  212.     weldingCost_hand = 0

  213.     ' 检查装焊人工费
  214.     If IsNumeric(ws.Range("装焊人工费").Cells(row, 1).Value) Then
  215.         weldingCost = CDbl(ws.Range("装焊人工费").Cells(row, 1).Value)
  216.     End If

  217.     ' 检查下料油漆费
  218.     If IsNumeric(ws.Range("下料油漆人工费").Cells(row, 1).Value) Then
  219.         cuttingPaintingCost = CDbl(ws.Range("下料油漆人工费").Cells(row, 1).Value)
  220.     End If

  221.     ' 检查辅材费
  222.     If IsNumeric(ws.Range("辅材费").Cells(row, 1).Value) Then
  223.         materialCost = CDbl(ws.Range("辅材费").Cells(row, 1).Value)
  224.     End If

  225.     ' 检查热处理费
  226.     If IsNumeric(ws.Range("热处理费").Cells(row, 1).Value) Then
  227.         heatTreatmentCost = CDbl(ws.Range("热处理费").Cells(row, 1).Value)
  228.     End If

  229.     ' 检查无损检测费
  230.     If IsNumeric(ws.Range("无损检测费").Cells(row, 1).Value) Then
  231.         nonDestructiveTestingCost = CDbl(ws.Range("无损检测费").Cells(row, 1).Value)
  232.     End If

  233.     ' 检查外协加工费
  234.     If IsNumeric(ws.Range("外协加工费").Cells(row, 1).Value) Then
  235.         outsourcingCost = CDbl(ws.Range("外协加工费").Cells(row, 1).Value)
  236.     End If

  237.     ' 检查机加工费
  238.     If IsNumeric(ws.Range("机加工费").Cells(row, 1).Value) Then
  239.         machiningCost = CDbl(ws.Range("机加工费").Cells(row, 1).Value)
  240.     End If
  241.    
  242.       ' 检查焊口人工费
  243.     If IsNumeric(ws.Range("焊口人工费").Cells(row, 1).Value) Then
  244.         weldingCost_hand = CDbl(ws.Range("焊口人工费").Cells(row, 1).Value)
  245.     End If

  246.     ' 计算总和
  247.     production_cost = weldingCost + cuttingPaintingCost + materialCost + heatTreatmentCost + nonDestructiveTestingCost + outsourcingCost + machiningCost + weldingCost_hand
  248. End Function

  249. '计算生产成本,材料费加制作费
  250. Function calculate_production_cost(ByVal row As Long, ByVal ws As Worksheet) As Double
  251.     Dim materialCost As Double
  252.     Dim productionCost As Double

  253.     materialCost = 0
  254.     productionCost = 0

  255.     ' 检查材料费
  256.     If IsNumeric(ws.Range("材料费").Cells(row, 1).Value) Then
  257.         materialCost = CDbl(ws.Range("材料费").Cells(row, 1).Value)
  258.     End If

  259.     ' 检查制作费
  260.     If IsNumeric(ws.Range("制作费").Cells(row, 1).Value) Then
  261.         productionCost = CDbl(ws.Range("制作费").Cells(row, 1).Value)
  262.     End If

  263.     ' 计算总和
  264.     calculate_production_cost = materialCost + productionCost
  265. End Function


  266. '已完成,用于选中时提供下拉列表供选择
  267. ' 已完成,用于选中时提供下拉列表供选择
  268. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  269.     Dim db1Sheet As Worksheet
  270.     Dim db2Sheet As Worksheet
  271.     Set db1Sheet = ThisWorkbook.Sheets("DB1类别")
  272.     Set db2Sheet = ThisWorkbook.Sheets("DB2材料及单价")
  273.    
  274.     Dim targetCell As Range
  275.     Dim cellBelow As Range
  276.     Dim validationList As String
  277.     Dim cellValue As String
  278.     Dim i As Long ' 将Integer改为Long以避免循环溢出
  279.     Dim uniqueValues As Object
  280.     Dim lastRow As Long
  281.     lastRow = Me.Range("序号").Cells(Me.Rows.Count, 1).End(xlUp).row
  282.    
  283.     ' 修改:Target.Count -> Target.CountLarge
  284.     If Not Intersect(Target, Me.Range("名称").Resize(Me.Rows.Count - 3).Offset(3, 0)) Is Nothing Then
  285.         If Target.CountLarge = 1 Then ' 使用CountLarge
  286.             Set targetCell = Target
  287. '            Set cellBelow = Me.Cells(targetCell.row + 1, targetCell.Column)
  288.             Set cellBelow = Me.Cells(targetCell.row + 1, 1)
  289.             Set cellBefore = Me.Cells(targetCell.row, 1)
  290.             If IsEmpty(cellBelow.Value) And IsEmpty(cellBefore.Value) Then
  291.                 targetCell.Validation.Delete
  292.                 Dim dbLastRow As Long
  293.                 dbLastRow = db1Sheet.Cells(db1Sheet.Rows.Count, 1).End(xlUp).row
  294.                 validationList = ""
  295.                
  296.                 For i = 2 To dbLastRow
  297.                     cellValue = db1Sheet.Cells(i, 1).Value
  298.                     If cellValue <> "" Then
  299.                         validationList = IIf(validationList = "", cellValue, validationList & "," & cellValue)
  300.                     End If
  301.                 Next i
  302.                
  303.                 If validationList <> "" Then
  304.                     With targetCell.Validation
  305.                         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  306.                              Operator:=xlBetween, Formula1:=validationList
  307.                         .IgnoreBlank = True
  308.                         .InCellDropdown = True
  309.                     End With
  310.                 End If
  311.             End If
  312.         End If
  313.     End If
  314.    

  315. ' 新增功能:当单元格值包含“换热管(下拉选择)”时,提供特定下拉列表“换热管1,换热管2”
  316.     ' 当单元格值包含“钢钉(下拉选择)”时,提供特定下拉列表,内容取自“DB11钢钉重量及价格”表的第三行到最后一行的第2列的内容去重
  317.     If Not Intersect(Target, Me.Range("名称").Resize(Me.Rows.Count - 3).Offset(3, 0)) Is Nothing Then
  318.         If Target.CountLarge = 1 Then ' 使用CountLarge
  319.             Set targetCell = Target
  320.             If InStr(targetCell.Value, "换热管(下拉选择)") > 0 Then
  321.                 targetCell.Validation.Delete
  322.                 With targetCell.Validation
  323.                     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  324.                          Operator:=xlBetween, Formula1:="蛇形换热管,换热管+弯头"
  325.                     .IgnoreBlank = True
  326.                     .InCellDropdown = True
  327.                 End With
  328.             ElseIf InStr(targetCell.Value, "钢钉(下拉选择)") > 0 Then
  329.                 targetCell.Validation.Delete
  330.                 Dim dbSheet As Worksheet
  331.                 Set dbSheet = ThisWorkbook.Sheets("DB11钢钉重量及价格")
  332. '                Dim lastRow As Long
  333.                 lastRow = dbSheet.Cells(dbSheet.Rows.Count, 2).End(xlUp).row
  334. '                Dim validationList As String
  335.                 Dim dict As Object
  336.                 Set dict = CreateObject("Scripting.Dictionary")
  337.                
  338.                 ' 读取并去重
  339.                 For i = 3 To lastRow
  340. '                    Dim cellValue As String
  341.                     cellValue = dbSheet.Cells(i, 2).Value
  342.                     If cellValue <> "" And Not dict.exists(cellValue) Then
  343.                         dict(cellValue) = True
  344.                     End If
  345.                 Next i
  346.                
  347.                 ' 构建下拉列表
  348.                 validationList = Join(dict.keys, ",")
  349.                
  350.                 If validationList <> "" Then
  351.                     With targetCell.Validation
  352.                         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  353.                              Operator:=xlBetween, Formula1:=validationList
  354.                         .IgnoreBlank = True
  355.                         .InCellDropdown = True
  356.                     End With
  357.                 End If
  358.             End If
  359.         End If
  360.     End If


  361.    
  362. '    ' 修改:Target.Count -> Target.CountLarge
  363. '    If Not Intersect(Target, Me.Range("材质").Resize(Me.Rows.Count - 3).Offset(3, 0)) Is Nothing Then
  364. '        If Target.CountLarge = 1 Then ' 使用CountLarge
  365. '            Set targetCell = Target
  366. '            If targetCell.row > 3 Then
  367. '                If InStr(Me.Cells(targetCell.row, 1).Value, ".") > 0 Then
  368. '                    targetCell.Validation.Delete
  369. '                    cCellValue = Me.Range("材料规格").Cells(targetCell.row, 1).Value
  370. '
  371. '                    Set uniqueValues = CreateObject("Scripting.Dictionary")
  372. '                    For i = 2 To db2Sheet.Cells(db2Sheet.Rows.Count, 1).End(xlUp).row
  373. '                        If db2Sheet.Cells(i, 1).Value = cCellValue Then
  374. '                            cellValue = db2Sheet.Cells(i, 2).Value
  375. '                            If cellValue <> "" And Not uniqueValues.exists(cellValue) Then
  376. '                                uniqueValues.Add cellValue, Nothing
  377. '                            End If
  378. '                        End If
  379. '                    Next i
  380. '
  381. '                    validationList = Join(uniqueValues.keys, ",")
  382. '                    If validationList <> "" Then
  383. '                        With targetCell.Validation
  384. '                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  385. '                                 Operator:=xlBetween, Formula1:=validationList
  386. '                            .IgnoreBlank = True
  387. '                        End With
  388. '                    End If
  389. '                End If
  390. '            End If
  391. '        End If
  392. '    End If
  393.    
  394.    
  395.     ' 修改:Target.Count -> Target.CountLarge
  396.     If Not Intersect(Target, Me.Range("材质").Resize(Me.Rows.Count - 3).Offset(3, 0)) Is Nothing Then
  397.         If Target.CountLarge = 1 Then ' 使用CountLarge
  398.             Set targetCell = Target
  399.             If targetCell.row > 3 Then
  400.                 ' 检查名称单元格是否包含“钢钉”
  401. '                If InStr(Me.Cells(targetCell.row, 1).Value, "钢钉") > 0 Then
  402.                 If InStr(Me.Range("名称").Cells(targetCell.row, 1).Value, "钢钉") > 0 Then
  403.                     targetCell.Validation.Delete
  404.                     ' 从“DB11钢钉重量及价格”表的第3列获取去重后的值
  405. '                    Dim dbSheet As Worksheet
  406.                     Set dbSheet = ThisWorkbook.Sheets("DB11钢钉重量及价格")
  407. '                    Dim lastRow As Long
  408.                     lastRow = dbSheet.Cells(dbSheet.Rows.Count, 3).End(xlUp).row
  409. '                    Dim uniqueValues As Object
  410.                     Set uniqueValues = CreateObject("Scripting.Dictionary")
  411.                     
  412.                     ' 读取并去重
  413.                     For i = 3 To lastRow
  414. '                        Dim cellValue As String
  415.                         cellValue = dbSheet.Cells(i, 3).Value
  416.                         If cellValue <> "" And Not uniqueValues.exists(cellValue) Then
  417.                             uniqueValues.Add cellValue, Nothing
  418.                         End If
  419.                     Next i
  420.                     
  421.                     ' 构建下拉列表
  422. '                    Dim validationList As String
  423.                     validationList = Join(uniqueValues.keys, ",")
  424.                     
  425.                     If validationList <> "" Then
  426.                         With targetCell.Validation
  427.                             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  428.                                  Operator:=xlBetween, Formula1:=validationList
  429.                             .IgnoreBlank = True
  430.                             .InCellDropdown = True
  431.                         End With
  432.                     End If
  433.                     
  434.                   ElseIf InStr(Me.Range("名称").Cells(targetCell.row, 1).Value, "销钉") > 0 Then
  435.                     targetCell.Validation.Delete
  436.                     ' 从“DN14销钉重量及价格”表的第3列获取去重后的值
  437. '                    Dim dbSheet As Worksheet
  438.                     Set dbSheet = ThisWorkbook.Sheets("DB14销钉重量及价格")
  439. '                    Dim lastRow As Long
  440.                     lastRow = dbSheet.Cells(dbSheet.Rows.Count, 3).End(xlUp).row
  441. '                    Dim uniqueValues As Object
  442.                     Set uniqueValues = CreateObject("Scripting.Dictionary")
  443.                     
  444.                     ' 读取并去重
  445. '                    Dim i As Long
  446. '                    Dim cellValue As String
  447.                     For i = 3 To lastRow
  448.                         cellValue = dbSheet.Cells(i, 3).Value
  449.                         If cellValue <> "" And Not uniqueValues.exists(cellValue) Then
  450.                             uniqueValues.Add cellValue, Nothing
  451.                         End If
  452.                     Next i
  453.                     
  454.                     ' 构建下拉列表
  455. '                    Dim validationList As String
  456.                     validationList = Join(uniqueValues.keys, ",")
  457.                     
  458.                     If validationList <> "" Then
  459.                         With targetCell.Validation
  460.                             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  461.                                  Operator:=xlBetween, Formula1:=validationList
  462.                             .IgnoreBlank = True
  463.                             .InCellDropdown = True
  464.                         End With
  465.                     End If
  466.                     
  467.                     
  468.                     
  469.                     
  470.                 ElseIf InStr(Me.Cells(targetCell.row, 1).Value, ".") > 0 Then
  471.                     targetCell.Validation.Delete
  472.                     cCellValue = Me.Range("材料规格").Cells(targetCell.row, 1).Value
  473.                     
  474.                     Set uniqueValues = CreateObject("Scripting.Dictionary")
  475. '                    Dim db2Sheet As Worksheet
  476. '                    Set db2Sheet = ThisWorkbook.Sheets("DB2材料及单价")
  477.                     For i = 2 To db2Sheet.Cells(db2Sheet.Rows.Count, 1).End(xlUp).row
  478.                         If db2Sheet.Cells(i, 1).Value = cCellValue Then
  479.                             cellValue = db2Sheet.Cells(i, 2).Value
  480.                             If cellValue <> "" And Not uniqueValues.exists(cellValue) Then
  481.                                 uniqueValues.Add cellValue, Nothing
  482.                             End If
  483.                         End If
  484.                     Next i
  485.                     
  486.                     validationList = Join(uniqueValues.keys, ",")
  487.                     If validationList <> "" Then
  488.                         With targetCell.Validation
  489.                             .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  490.                                  Operator:=xlBetween, Formula1:=validationList
  491.                             .IgnoreBlank = True
  492.                         End With
  493.                     End If
  494.                 End If
  495.             End If
  496.         End If
  497.     End If
  498.    
  499.    
  500.    
  501.    
  502.    
  503.    
  504.    
  505.    
  506.     ' 修改:Target.Count -> Target.CountLarge
  507.     If Not Intersect(Target, Me.Range("拍片比例").Resize(Me.Rows.Count - 3).Offset(3, 0)) Is Nothing Then
  508.         If Target.CountLarge = 1 Then ' 使用CountLarge
  509.             Set targetCell = Target
  510.             If targetCell.row > 3 Then
  511.                 targetCell.Validation.Delete
  512.                 Dim name2 As String
  513.                 name2 = Me.Range("名称").Cells(targetCell.row, 1).Value
  514.                
  515.                 If InStr(name2, "筒节") > 0 And Me.Range("拍片总数").Cells(targetCell.row, 1).Value > 0 Then
  516.                     validationList = "100%,20%,10%"
  517.                 ElseIf InStr(name2, "换热管") > 0 And Me.Range("拍片总数").Cells(targetCell.row, 1).Value > 0 Then
  518.                     validationList = "100%,50%,10%,0"
  519.                 Else
  520.                     validationList = ""
  521.                 End If
  522.                
  523.                 If validationList <> "" Then
  524.                     With targetCell.Validation
  525.                         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  526.                              Operator:=xlBetween, Formula1:=validationList
  527.                         .IgnoreBlank = True
  528.                     End With
  529.                 End If
  530.             End If
  531.         End If
  532.     End If
  533. End Sub


  534. Private Sub Worksheet_Change(ByVal Target As Range)
  535. ' ------ 修正后的删除行判断逻辑 ------
  536.     If IsDeleteOperation(Target) Then Exit Sub  ' 直接退出不修改事件状态
  537.     ' -----------------------------------

  538.     ' 原有的删除行移动检查(根据需求可选保留)
  539.     If IsDeletionCausedChange() Then Exit Sub

  540.     ' 保持原有的事件禁用检查
  541.     If Not Application.EnableEvents Then Exit Sub
  542.     Dim targetCell As Range
  543.     Dim cellValue As String
  544.     Dim matchRow As Long
  545.     Dim lastCol As Long
  546.     Dim sourceRange As Range
  547.     Dim destRow As Long
  548.     Dim i As Integer
  549.     Dim maxNumber As Double
  550.     Dim currentRow As Long
  551.     Dim isAllEmpty As Boolean
  552.     Dim seqNumber As Double
  553.     Dim db3MatchRow As Long
  554.     Dim validationList As String
  555.     Dim uniqueValues As Object
  556.     Dim cCellValue As String
  557.     Dim matPrice As Double
  558.    
  559.     ' 设置目标工作表
  560.     Dim dbSheet As Worksheet
  561.     Set dbSheet = ThisWorkbook.Sheets("DB1类别")
  562.     Dim db2Sheet As Worksheet
  563.     Set db2Sheet = ThisWorkbook.Sheets("DB2材料及单价")
  564.     Dim db3Sheet As Worksheet
  565.     Set db3Sheet = ThisWorkbook.Sheets("DB3产品类型对应材料类型")
  566.     Dim db4Sheet As Worksheet
  567.     Set db4Sheet = ThisWorkbook.Sheets("DB4车间生产价格表")
  568.     Dim db5Sheet As Worksheet
  569.     Set db5Sheet = ThisWorkbook.Sheets("DB5无损检测价格")
  570.     Dim db6Sheet As Worksheet
  571.     Set db6Sheet = ThisWorkbook.Sheets("DB6热处理要求")
  572.     Dim db7Sheet As Worksheet
  573.     Set db7Sheet = ThisWorkbook.Sheets("DB7封头冲压价格表")
  574.     Dim db10Sheet As Worksheet
  575.     Set db10Sheet = ThisWorkbook.Sheets("DB10焊口价格表")
  576.     Dim db11Sheet As Worksheet
  577.     Set db11Sheet = ThisWorkbook.Sheets("DB11钢钉重量及价格")
  578.     Dim db12Sheet As Worksheet
  579.     Set db12Sheet = ThisWorkbook.Sheets("DB12标准件价格")
  580.     Dim db14Sheet As Worksheet
  581.     Set db14Sheet = ThisWorkbook.Sheets("DB14销钉重量及价格")
  582.    
  583.     '把外径,壁厚,长度,密度,体积放这里
  584.     Dim D As Double  ' 外径或宽度
  585.     Dim T As Double  ' 壁厚
  586.     Dim L As Double  ' 长度
  587.     Dim name As String  ' 名称
  588.     Dim density As Double  ' 密度
  589.     Dim volume As Variant  ' 体积
  590.    
  591.     Dim upperRow As Long
  592.     Dim lowerRow As Long
  593.     Dim totalValue As Double
  594.     Dim checkRow As Long
  595.    
  596.     Dim quantity As Variant
  597.     Dim weight As Double
  598.     Dim outsourceCost As Variant
  599.     Dim productionCost As Double
  600.    
  601.     Dim weldingCost As Double
  602.     Dim cuttingPaintingCost As Double
  603.     Dim totalShopManagementCost As Double
  604.     Dim man_weld As Double '焊口人工费定义
  605.    
  606.     Dim totalShots As Variant ' 拍片总数,放最前面定义
  607.    
  608.     Dim db4Row As Long
  609.     Dim db4MatchRow As Long
  610.     Dim allEmpty As Boolean
  611.    
  612.     Dim lastRow As Long
  613.     lastRow = Me.Range("名称").Cells(Me.Rows.Count, 1).End(xlUp).row ' 动态计算最后一行
  614.     Dim totalManufacturingCost As Double
  615.    
  616.     ' 已完成,检查是否在“名称”列且行号大于3,生成框架,填充序号,并直接调用生成了材料规格
  617.     If Not Intersect(Target, Me.Range("名称").Rows("4:" & lastRow)) Is Nothing Then
  618.         If Target.Count = 1 Then ' 确保是单个单元格被选中
  619.             Set targetCell = Target
  620.             
  621.             ' 找到匹配的行
  622.             matchRow = 0
  623.             For i = 2 To lastRow
  624.                 If dbSheet.Cells(i, 1).Value = targetCell.Value Then
  625.                     matchRow = i
  626.                     Exit For
  627.                 End If
  628.             Next i
  629.             
  630.             ' 如果找到匹配的行
  631.             If matchRow > 0 Then
  632.                 ' 找到最后一列有内容的单元格
  633.                 lastCol = dbSheet.Cells(matchRow, dbSheet.Columns.Count).End(xlToLeft).Column
  634.                 ' 设置源范围
  635.                 Set sourceRange = dbSheet.Range(dbSheet.Cells(matchRow, 2), dbSheet.Cells(matchRow, lastCol))
  636.                 ' 设置目标起始行(从当前单元格的下一格开始)
  637.                 destRow = targetCell.row + 1
  638.                 ' 向下复制数据
  639.                 For i = 1 To sourceRange.Cells.Count
  640.                     Me.Cells(destRow, targetCell.Column).Value = sourceRange.Cells(1, i).Value
  641.                     
  642.                     '如果包含下拉这个提示词,颜色标黄色提醒下拉
  643.                     If InStr(Me.Cells(destRow, targetCell.Column).Value, "下拉") > 0 Then
  644.                         Me.Range("名称").Cells(destRow, 1).Interior.Color = RGB(255, 255, 0)
  645.                     End If
  646.                     
  647.                     If InStr(Me.Cells(destRow, targetCell.Column).Value, "钢钉") > 0 Or InStr(Me.Cells(destRow, targetCell.Column).Value, "销钉") > 0 Then
  648.                         Me.Range("材质").Cells(destRow, 1).Interior.Color = RGB(255, 255, 0)
  649.                     End If
  650.                     
  651.                     
  652.                     If InStr(Me.Cells(destRow, targetCell.Column).Value, "下拉") > 0 Then
  653.                        Me.Range("数量").Cells(destRow, 1).Interior.Color = xlNone
  654.                     ElseIf InStr(Me.Cells(destRow, targetCell.Column).Value, "筒节") > 0 Or _
  655.                        InStr(Me.Cells(destRow, targetCell.Column).Value, "换热管") > 0 Or _
  656.                        InStr(Me.Cells(destRow, targetCell.Column).Value, "集箱") > 0 Then
  657.                         Me.Range("数量").Cells(destRow, 1).Interior.Color = RGB(255, 255, 0)
  658.                     End If
  659.                     
  660.                     destRow = destRow + 1
  661.                 Next i
  662.                
  663.                 ' 检查A列单元格的值
  664.                 currentRow = targetCell.row
  665.                 maxNumber = 0
  666.                 isAllEmpty = True
  667.                
  668.                 For j = currentRow To 3 Step -1
  669.                     If Not IsEmpty(Me.Range("序号").Cells(j, 1).Value) Then
  670.                         isAllEmpty = False
  671.                         If IsNumeric(Me.Range("序号").Cells(j, 1).Value) Then
  672.                             If Me.Range("序号").Cells(j, 1).Value > maxNumber Then
  673.                                 maxNumber = Me.Range("序号").Cells(j, 1).Value
  674.                             End If
  675.                         End If
  676.                     End If
  677.                 Next j
  678.                
  679.                 ' 根据条件设置A列单元格的值
  680.                 If isAllEmpty Then
  681.                     Me.Range("序号").Cells(currentRow, 1).Value = 1
  682.                 Else
  683.                     ' 确保 maxNumber 是整数
  684.                     Me.Range("序号").Cells(currentRow, 1).Value = Int(maxNumber) + 1
  685.                 End If
  686.                
  687.                 ' 对2步骤复制填充的单元格,依次填入当前单元格所在行A列得到的值加上.1,.2,.3这样的序列,填写在当前单元格向下一行朝下填充
  688.                 seqNumber = Me.Cells(currentRow, 1).Value
  689.                 destRow = targetCell.row + 1 ' 重新设置目标起始行
  690.                 For i = 1 To sourceRange.Cells.Count
  691.                     Me.Range("序号").Cells(destRow, 1).Value = seqNumber + i / 100
  692.                     destRow = destRow + 1
  693.                 Next i
  694.                
  695.                 '增加一个汇总行
  696.                 Me.Range("序号").Cells(destRow, 1).Value = seqNumber & "汇总"
  697.                 Me.Range("材料规格").Cells(destRow, 1).Value = Target.Value
  698.                
  699.                 ' 在第2步骤,当复制填充单元格的时候,根据复制的内容,去sheet名称为“DB3产品类型对应材料类型”查找是否有符合内容的
  700.                
  701.                 Dim db3LastRow As Long
  702.                 db3LastRow = db3Sheet.Cells(db3Sheet.Rows.Count, 1).End(xlUp).row ' 动态计算最后一行
  703.                 destRow = targetCell.row + 1 ' 重新设置目标起始行
  704.                 For i = 1 To sourceRange.Cells.Count
  705.                     db3MatchRow = 0
  706.                     For j = 2 To db3LastRow
  707.                         If db3Sheet.Cells(j, 1).Value = sourceRange.Cells(1, i).Value Then
  708.                             db3MatchRow = j
  709.                             Exit For
  710.                         End If
  711.                     Next j
  712.                     If db3MatchRow > 0 Then
  713.                         '如果能找到对应的,就把材料规格和类型放上去,其实后面做java可以完全不理,这里主要边做边看方便
  714.                         Me.Range("材料规格").Cells(destRow, 1).Value = db3Sheet.Cells(db3MatchRow, 2).Value
  715.                         Me.Range("材料类型").Cells(destRow, 1).Value = db3Sheet.Cells(db3MatchRow, 5).Value
  716.                     End If
  717.                     destRow = destRow + 1
  718.                 Next i
  719.                
  720.                 ' 完成操作后清除下拉列表
  721.                 targetCell.Validation.Delete
  722.                
  723.                 ' 添加边框
  724.                 Dim borderRange As Range
  725.                 Set borderRange = Me.Range(Me.Cells(targetCell.row + 1, 1), Me.Cells(destRow - 1, 10))
  726.                 With borderRange.Borders
  727.                     .LineStyle = xlContinuous
  728.                     .Color = RGB(0, 0, 0)
  729.                     .weight = xlThin
  730.                 End With
  731.                
  732.             End If
  733.         End If
  734.     End If
  735.    
  736.    
  737.     ' 新增功能:无论何时“名称”列的内容发生变化,都要执行以下代码
  738.     If Not Intersect(Target, Me.Range("名称").Rows("4:" & lastRow)) Is Nothing Then
  739.         db3LastRow = db3Sheet.Cells(db3Sheet.Rows.Count, 1).End(xlUp).row ' 动态计算最后一行
  740.         For Each cell In Target
  741.             db3MatchRow = 0
  742.             For j = 2 To db3LastRow
  743.                 If db3Sheet.Cells(j, 1).Value = cell.Value Then
  744.                     db3MatchRow = j
  745.                     Exit For
  746.                 End If
  747.             Next j
  748.             If db3MatchRow > 0 Then
  749.                 '如果能找到对应的,就把材料规格和类型放上去
  750.                 Me.Range("材料规格").Cells(cell.row, 1).Value = db3Sheet.Cells(db3MatchRow, 2).Value
  751.                 Me.Range("材料类型").Cells(cell.row, 1).Value = db3Sheet.Cells(db3MatchRow, 5).Value
  752.             End If
  753.             
  754.             Me.Range("名称").Cells(cell.row, 1).Interior.Color = xlNone
  755.         Next cell
  756.     End If
  757.    
  758.    
  759.     '用材料类型来控制后续单元格的变色,提醒填写
  760.         If Not Intersect(Target, Me.Range("材料类型").Rows("4:" & lastRow)) Is Nothing Then
  761.         If Target.Count = 1 Then ' 确保是单个单元格被选中
  762. '            Dim changedCell As Range
  763.             Set changedCell = Target(1)
  764.             
  765.             ' 检查第一列的单元格是否包含 ".",如果有就执行,这代表组件
  766.              If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, ".") > 0 Then
  767.                 ' 检查D列、E列、F列、G列的值
  768.                 Dim colsToCheck As Variant
  769.                 '目前是认为对于封头只要把4,5,6列填了就行,如果是其它,4,5,6,7都要变色。
  770.                 If InStr(LCase(Me.Cells(changedCell.row, Me.Range("材料类型").Column).Value), "封头") > 0 Then
  771.                   Me.Range("材质").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  772.                   Me.Range("外径或宽度").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  773.                   Me.Range("壁厚").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  774.                   Me.Range("长度").Cells(changedCell.row, 1).Value = 0.05 '默认封头直边长50mm
  775.                   Me.Range("数量").Cells(changedCell.row, 1).Value = 2  '默认封头数量2
  776.                   
  777.                 ElseIf InStr(LCase(Me.Cells(changedCell.row, Me.Range("材料类型").Column).Value), "管子") > 0 Then
  778.                   Me.Range("材质").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  779.                   Me.Range("外径或宽度").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  780.                   Me.Range("壁厚").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  781.                   Me.Range("长度").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  782.                   
  783.                 ElseIf InStr(LCase(Me.Cells(changedCell.row, Me.Range("材料类型").Column).Value), "板") > 0 Then
  784.                   Me.Range("材质").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  785.                   Me.Range("外径或宽度").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  786.                   Me.Range("壁厚").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  787.                   Me.Range("长度").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  788.                   
  789.                   
  790.                 ElseIf InStr(LCase(Me.Cells(changedCell.row, Me.Range("材料类型").Column).Value), "按件标准件") > 0 Then
  791.                   Me.Range("数量").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  792.                   
  793.                 ElseIf InStr(LCase(Me.Cells(changedCell.row, Me.Range("材料类型").Column).Value), "按吨加工件") > 0 Then
  794.                   Me.Range("材质").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  795.                   Me.Range("净重").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  796.                   
  797.                   
  798.                   
  799.                 End If
  800.              End If
  801.         End If
  802.     End If
  803.    
  804.    
  805.    ' 已完成,材质列变更的相应变动,调动单价,查找密度
  806.     If Not Intersect(Target, Me.Range("材质").Rows("4:" & lastRow)) Is Nothing Then
  807.         If Target.Count = 1 Then ' 确保是单个单元格被选中
  808.            Set changedCell = Target
  809.             Set targetSheet = Me
  810.             ' 获取选中的值
  811.             selectedValue = changedCell.Value
  812.             ' 查找“DB2材料及单价”表中对应的行
  813.             matchRow = 0
  814.             For i = 3 To db2Sheet.Cells(db2Sheet.Rows.Count, 1).End(xlUp).row
  815.                 If db2Sheet.Cells(i, 2).Value = selectedValue Then
  816.                     matchRow = i
  817.                     Exit For
  818.                 End If
  819.             Next i
  820.             
  821.             ' 如果找到匹配的行,复制对应的C列值到L列
  822.             If matchRow > 0 Then
  823.                 Me.Range("密度").Cells(changedCell.row, 1).Value = db2Sheet.Cells(matchRow, 3).Value
  824.                 changedCell.Interior.ColorIndex = xlNone ' 清除背景颜色
  825.             End If
  826.             
  827.             
  828.             '增加改变材料重新查价格
  829.             If changedCell.Count = 1 And changedCell.row > 3 Then
  830.                 ' 检查是否输入了非空值
  831.                 If Not IsEmpty(changedCell.Value) Then
  832.                     ' 清除背景颜色
  833.                     changedCell.Interior.ColorIndex = xlNone
  834.                     cCellValue = Me.Range("材料规格").Cells(changedCell.row, 1).Value
  835.                     dCellValue = Me.Range("材质").Cells(changedCell.row, 1).Value
  836.                     fCellValue = Me.Range("壁厚").Cells(changedCell.row, 1).Value

  837.                     ' 确保 fCellValue 是数值类型
  838.                     If Not IsNumeric(fCellValue) Then
  839.                         Debug.Print "fCellValue is not numeric: " & fCellValue
  840.                         GoTo NextIteration
  841.                     End If

  842.                     fCellValue = CDbl(fCellValue)

  843.                     ' 在 DB2 材料及单价表中查找符合条件的行并获取材料单价
  844.                     matPrice = Find_Mat_Price(cCellValue, dCellValue, fCellValue, db2Sheet)
  845.                     ' 输出测试信息
  846.                     If matPrice > 0 Then
  847.                         Debug.Print "Match found, Material Price: " & matPrice
  848.                         Me.Range("材料单价").Cells(changedCell.row, 1).Value = matPrice
  849.                     Else
  850.                         Me.Range("材料单价").Cells(changedCell.row, 1).Value = Empty
  851.                     End If
  852.                 Else
  853.                     ' 如果输入为空,设置背景颜色为黄色
  854.                     changedCell.Interior.Color = RGB(255, 255, 0)
  855.                 End If
  856.             End If
  857.             
  858.         End If
  859.     End If
  860.    
  861.     ' 已完成,当外径宽度列发生变化,去核对修改体积
  862.        If Not Intersect(Target, Me.Range("外径或宽度").Rows("4:" & lastRow)) Is Nothing Then
  863.         For Each changedCell In Intersect(Target, Me.Range("外径或宽度").Rows("4:" & lastRow))
  864.             If changedCell.Count = 1 And changedCell.row > 3 And Not IsEmpty(changedCell.Value) Then
  865.                 ' 获取相关列的值
  866.                 D = CDbl(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value)
  867.                 T = CDbl(Me.Range("壁厚").Cells(changedCell.row, 1).Value)
  868.                 L = CDbl(Me.Range("长度").Cells(changedCell.row, 1).Value)
  869.                 name = Me.Range("材料类型").Cells(changedCell.row, 1).Value
  870.                 density = CDbl(Me.Range("密度").Cells(changedCell.row, 1).Value)
  871.                 ' 调用函数计算体积
  872.                 volume = calculate_volume(D, T, L, name, density)
  873.                 ' 更新体积单元格的值
  874.                 If Not IsEmpty(volume) Then
  875.                     Me.Range("体积").Cells(changedCell.row, 1).Value = volume
  876.                     Me.Range("体积").Cells(changedCell.row, 1).NumberFormat = "0.000"
  877.                 Else
  878.                     Me.Range("体积").Cells(changedCell.row, 1).Value = ""
  879.                 End If
  880.                
  881.                
  882.                 ' 调用函数计算外协加工费
  883. '                Dim outsourceCost As Variant
  884.                 If InStr(name, "封头") > 0 Then
  885.                     outsourceCost = cap_out_cost(D, T, Me.Range("材质").Cells(changedCell.row, 1).Value, db7Sheet)
  886.                     ' 更新外协加工费单元格的值
  887.                     If Not IsEmpty(outsourceCost) Then
  888.                         Me.Range("外协加工费").Cells(changedCell.row, 1).Value = outsourceCost * Me.Range("数量").Cells(changedCell.row, 1).Value
  889.                         Me.Range("外协加工费").Cells(changedCell.row, 1).NumberFormat = "0"
  890.                     Else
  891.                         Me.Range("外协加工费").Cells(changedCell.row, 1).Value = ""
  892.                     End If
  893.                 End If
  894.                 '外协加工计算到此结束
  895.                
  896.                
  897.                     ' 调用函数计算拍片总数,拍片总数已在前面定义
  898.                 If Me.Range("名称").Cells(changedCell.row, 1).Value = "筒节" Then
  899.                     totalShots = count_numbers_shot(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value, _
  900.                                                     Me.Range("长度").Cells(changedCell.row, 1).Value, _
  901.                                                     Me.Range("数量").Cells(changedCell.row, 1).Value)
  902.                     ' 更新拍片总数单元格的值
  903.                     Me.Range("拍片总数").Cells(changedCell.row, 1).Value = totalShots
  904.                 End If
  905.                  ' 结束调用函数计算拍片总数的代码段
  906.                 ' 去除当前单元格颜色
  907.                 changedCell.Interior.ColorIndex = xlNone
  908.             
  909.         Else
  910.             Me.Range("体积").Cells(changedCell.row, 1).Value = Empty
  911.             Me.Range("拍片总数").Cells(changedCell.row, 1).Value = Empty
  912.         End If
  913.             
  914.         Next changedCell
  915.     End If

  916.    
  917.     ' 已完成,壁厚变更,重新查找材料价格,并变更材料体积,壁厚相关项:材料价格,材料体积
  918.    If Not Intersect(Target, Me.Range("壁厚").Rows("4:" & lastRow)) Is Nothing Then
  919.         For Each changedCell In Intersect(Target, Me.Range("壁厚").Rows("4:" & lastRow))
  920.             If changedCell.Count = 1 And changedCell.row > 3 Then
  921.                 ' 检查是否输入了非空值
  922.                 If Not IsEmpty(changedCell.Value) Then
  923.                     ' 清除背景颜色
  924.                     changedCell.Interior.ColorIndex = xlNone

  925.                     cCellValue = Me.Range("材料规格").Cells(changedCell.row, 1).Value
  926.                     dCellValue = Me.Range("材质").Cells(changedCell.row, 1).Value
  927.                     fCellValue = Me.Range("壁厚").Cells(changedCell.row, 1).Value

  928.                     ' 确保 fCellValue 是数值类型
  929.                     If Not IsNumeric(fCellValue) Then
  930.                         Debug.Print "fCellValue is not numeric: " & fCellValue
  931.                         GoTo NextIteration
  932.                     End If

  933.                     fCellValue = CDbl(fCellValue)

  934.                     ' 在 DB2 材料及单价表中查找符合条件的行并获取材料单价
  935. '                    Dim matPrice As Double
  936.                     matPrice = Find_Mat_Price(cCellValue, dCellValue, fCellValue, db2Sheet)

  937.                     ' 输出测试信息
  938.                     If matPrice > 0 Then
  939.                         Debug.Print "Match found, Material Price: " & matPrice
  940.                         Me.Range("材料单价").Cells(changedCell.row, 1).Value = matPrice
  941.                     Else
  942.                         Me.Range("材料单价").Cells(changedCell.row, 1).Value = Empty
  943.                     End If
  944.                 Else
  945.                     ' 如果输入为空,设置背景颜色为黄色
  946.                     changedCell.Interior.Color = RGB(255, 255, 0)
  947.                 End If
  948.                
  949. '               '增加壁厚变动,重新计算体积

  950.                 D = CDbl(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value)
  951.                 T = CDbl(Me.Range("壁厚").Cells(changedCell.row, 1).Value)
  952.                 L = CDbl(Me.Range("长度").Cells(changedCell.row, 1).Value)
  953.                 name = Me.Range("材料类型").Cells(changedCell.row, 1).Value
  954.                 density = CDbl(Me.Range("密度").Cells(changedCell.row, 1).Value)
  955.    
  956.                 ' 调用函数计算体积
  957.                 volume = calculate_volume(D, T, L, name, density)
  958.    
  959.                 ' 更新体积单元格的值
  960.                 If Not IsEmpty(volume) Then
  961.                     Me.Range("体积").Cells(changedCell.row, 1).Value = volume
  962.                     Me.Range("体积").Cells(changedCell.row, 1).NumberFormat = "0.000"
  963.                 Else
  964.                     Me.Range("体积").Cells(changedCell.row, 1).Value = ""
  965.                 End If
  966.                
  967.                                 ' 调用函数计算外协加工费
  968. '                Dim outsourceCost As Variant
  969.                
  970.                 If InStr(name, "封头") > 0 Then
  971.                     outsourceCost = cap_out_cost(D, T, Me.Range("材质").Cells(changedCell.row, 1).Value, db7Sheet)
  972.                     ' 更新外协加工费单元格的值
  973.                     If Not IsEmpty(outsourceCost) Then
  974.                         Me.Range("外协加工费").Cells(changedCell.row, 1).Value = outsourceCost * Me.Range("数量").Cells(changedCell.row, 1).Value
  975.                         Me.Range("外协加工费").Cells(changedCell.row, 1).NumberFormat = "0"
  976.                     Else
  977.                         Me.Range("外协加工费").Cells(changedCell.row, 1).Value = ""
  978.                     End If
  979.                 End If
  980.                
  981.                 '外协加工计算到此结束
  982.                
  983.    
  984.                 ' 去除当前单元格颜色
  985.                 changedCell.Interior.ColorIndex = xlNone
  986.             Else
  987.                 Me.Range("体积").Cells(changedCell.row, 1).Value = Empty
  988.                
  989.             End If
  990.             
  991. NextIteration:
  992.         Next changedCell
  993.     End If
  994.    

  995.    ' 已完成,当长度列发生变化,去核对修改体积
  996.     If Not Intersect(Target, Me.Range("长度").Rows("4:" & lastRow)) Is Nothing Then
  997.         For Each changedCell In Intersect(Target, Me.Range("长度").Rows("4:" & lastRow))
  998.             If changedCell.Count = 1 And changedCell.row > 3 And Not IsEmpty(changedCell.Value) Then
  999.    
  1000.                 ' 获取相关列的值
  1001.                 D = CDbl(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value)
  1002.                 T = CDbl(Me.Range("壁厚").Cells(changedCell.row, 1).Value)
  1003.                 L = CDbl(Me.Range("长度").Cells(changedCell.row, 1).Value)
  1004.                 name = Me.Range("材料类型").Cells(changedCell.row, 1).Value
  1005.                 density = CDbl(Me.Range("密度").Cells(changedCell.row, 1).Value)
  1006.    
  1007.                 ' 调用函数计算体积
  1008.                 volume = calculate_volume(D, T, L, name, density)
  1009.    
  1010.                 ' 更新体积单元格的值
  1011.                 If Not IsEmpty(volume) Then
  1012.                     Me.Range("体积").Cells(changedCell.row, 1).Value = volume
  1013.                     Me.Range("体积").Cells(changedCell.row, 1).NumberFormat = "0.000"
  1014.                 Else
  1015.                     Me.Range("体积").Cells(changedCell.row, 1).Value = ""
  1016.                 End If
  1017.    
  1018.                 ' 去除当前单元格颜色
  1019.                 changedCell.Interior.ColorIndex = xlNone
  1020.                
  1021.                         ' 调用函数计算拍片总数,拍片总数已在前面定义
  1022.                 If Me.Range("名称").Cells(changedCell.row, 1).Value = "筒节" Then
  1023.                     totalShots = count_numbers_shot(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value, _
  1024.                                                     Me.Range("长度").Cells(changedCell.row, 1).Value, _
  1025.                                                     Me.Range("数量").Cells(changedCell.row, 1).Value)
  1026.                     
  1027.                     ' 更新拍片总数单元格的值
  1028.                     Me.Range("拍片总数").Cells(changedCell.row, 1).Value = totalShots
  1029.                     Me.Range("拍片总数").Cells(changedCell.row, 1).NumberFormat = "0"
  1030.                 End If
  1031.                  ' 结束调用函数计算拍片总数的代码段
  1032.                  
  1033.                  ' 新增功能:当名称列包含"光管换热管"或“蛇形换热管”,计算焊口数
  1034.                 If InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "光管换热管") > 0 Or _
  1035.                    InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "蛇形换热管") > 0 Then
  1036.                
  1037.                     ' 检查“长度”列是否为数值且大于0
  1038.                     If IsNumeric(Me.Range("长度").Cells(changedCell.row, 1).Value) And _
  1039.                        Me.Range("长度").Cells(changedCell.row, 1).Value > 0 Then
  1040.                         length = Me.Range("长度").Cells(changedCell.row, 1).Value
  1041.                     Else
  1042.                         length = -1 ' 标记“长度”列不符合条件
  1043.                     End If
  1044.                
  1045.                     ' 检查“数量”列是否为数值且大于0
  1046.                     If IsNumeric(Me.Range("数量").Cells(changedCell.row, 1).Value) And _
  1047.                        Me.Range("数量").Cells(changedCell.row, 1).Value > 0 Then
  1048.                         quantity = Me.Range("数量").Cells(changedCell.row, 1).Value
  1049.                     Else
  1050.                         quantity = 1 ' 标记“数量”列不符合条件
  1051.                     End If
  1052.                
  1053.                     ' 如果“长度”和“数量”列都符合条件,则计算焊口数
  1054.                     If length > 0 And quantity > 0 Then
  1055.                         ' 计算焊口数并填写到“焊口数”列
  1056.                         Me.Range("焊口数").Cells(changedCell.row, 1).Value = (Int(length / 11) + 1) * quantity
  1057.                         Me.Range("焊口数").Cells(changedCell.row, 1).NumberFormat = "0"
  1058. '                            Me.Range("拍片总数").Cells(changedCell.row, 1).Value = (Int(length / 11) + 1) * quantity
  1059. '                            Me.Range("拍片总数").Cells(changedCell.row, 1).NumberFormat = "0"
  1060.                     Else
  1061.                         ' 如果任一列不符合条件,则将“焊口数”列的值设置为空
  1062.                         Me.Range("焊口数").Cells(changedCell.row, 1).Value = ""
  1063.                         Me.Range("拍片总数").Cells(changedCell.row, 1).Value = ""
  1064.                     End If
  1065.                 End If
  1066.             Else
  1067.                 Me.Range("体积").Cells(changedCell.row, 1).Value = Empty
  1068.             End If
  1069.         Next changedCell
  1070.     End If
  1071.    
  1072.    
  1073.        ' 已完成,当体积列发生变化,去核对修改净重
  1074.     If Not Intersect(Target, Me.Range("体积").Rows("4:" & lastRow)) Is Nothing Then
  1075.         For Each changedCell In Intersect(Target, Me.Range("体积").Rows("4:" & lastRow))
  1076.             If changedCell.Count = 1 And changedCell.row > 3 Then
  1077.                 ' 检查体积列是否为空
  1078.                 If IsEmpty(changedCell.Value) Then
  1079.                     ' 如果体积列为空,则将净重列也设置为空
  1080.                     Me.Range("净重").Cells(changedCell.row, 1).Value = Empty
  1081.                 Else
  1082.                     ' 获取体积值
  1083.                     volume = CDbl(changedCell.Value)
  1084.    
  1085.                     ' 获取数量值
  1086.                     quantity = Me.Range("数量").Cells(changedCell.row, 1).Value
  1087.    
  1088.                     ' 判断数量是否为数值且大于1
  1089.                     If IsNumeric(quantity) And quantity > 1 Then
  1090.                         weight = CDbl(quantity) * volume * Me.Range("密度").Cells(changedCell.row, 1).Value
  1091.                     ElseIf IsEmpty(quantity) Then
  1092.                         weight = volume * Me.Range("密度").Cells(changedCell.row, 1).Value
  1093. '                    Else
  1094. '                        weight = volume ' 如果数量不符合条件,净重仍为体积值
  1095.                     End If
  1096.    
  1097.                     ' 更新净重单元格的值
  1098.                     Me.Range("净重").Cells(changedCell.row, 1).Value = weight
  1099.                     Me.Range("净重").Cells(changedCell.row, 1).NumberFormat = "0.000"
  1100.                     
  1101.                     ' 去除当前单元格颜色
  1102.                 changedCell.Interior.ColorIndex = xlNone
  1103.                     
  1104.                 End If
  1105.             End If
  1106.         Next changedCell
  1107.     End If
  1108.    
  1109.    
  1110.     ' 已完成,数量发生变化,修改净重(这里是乘以数量的)
  1111.     If Not Intersect(Target, Me.Range("数量").Rows("4:" & lastRow)) Is Nothing Then
  1112.             For Each changedCell In Intersect(Target, Me.Range("数量").Rows("4:" & lastRow))
  1113.                 If changedCell.Count = 1 And changedCell.row > 3 Then
  1114.                     If IsEmpty(changedCell.Value) Then
  1115.                         ' 如果体积列为空,则将净重列也设置为空
  1116.                         Me.Range("净重").Cells(changedCell.row, 1).Value = Empty
  1117.                     Else
  1118.                         ' 获取体积值
  1119.                         volume = CDbl(Me.Range("体积").Cells(changedCell.row, 1).Value)
  1120.         
  1121.                         ' 获取数量值
  1122.                         quantity = Me.Range("数量").Cells(changedCell.row, 1).Value
  1123.         
  1124.                         ' 判断数量是否为数值且大于1
  1125.                         If IsNumeric(quantity) And quantity > 0 Then
  1126.                             weight = CDbl(quantity) * volume * Me.Range("密度").Cells(changedCell.row, 1).Value
  1127.                         ElseIf IsEmpty(quantity) Then
  1128.                             weight = volume * Me.Range("密度").Cells(changedCell.row, 1).Value
  1129.                         End If
  1130.         
  1131.                         ' 更新净重单元格的值
  1132.                         
  1133.                         
  1134.                         If Me.Range("材料类型").Cells(changedCell.row, 1).Value = "按件标准件" Then
  1135.                             Me.Range("净重").Cells(changedCell.row, 1).Value = ""
  1136.                         Else
  1137.                             Me.Range("净重").Cells(changedCell.row, 1).Value = weight
  1138.                             Me.Range("净重").Cells(changedCell.row, 1).NumberFormat = "0.000"
  1139.                         End If
  1140.                         
  1141.                         
  1142.                         ' 调用函数计算拍片总数,拍片总数已在前面定义
  1143.                         If Me.Range("名称").Cells(changedCell.row, 1).Value = "筒节" Then
  1144.                             totalShots = count_numbers_shot(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value, _
  1145.                                                             Me.Range("长度").Cells(changedCell.row, 1).Value, _
  1146.                                                             Me.Range("数量").Cells(changedCell.row, 1).Value)
  1147.                
  1148.                            
  1149.                             ' 更新拍片总数单元格的值
  1150.                             Me.Range("拍片总数").Cells(changedCell.row, 1).Value = totalShots
  1151.                             Me.Range("拍片总数").Cells(changedCell.row, 1).NumberFormat = "0"
  1152.                         End If
  1153.                          ' 结束调用函数计算拍片总数的代码段
  1154.                         
  1155.                          '计算光管和蛇形换热管的焊口数
  1156.                         If InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "光管换热管") > 0 Or _
  1157.                            InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "蛇形换热管") > 0 Then
  1158.                             ' 获取“长度”和“数量”列的值
  1159.         '                    Dim length As Double
  1160.         '                    Dim quantity As Double
  1161.                         
  1162.                             ' 检查“长度”列是否为数值且大于0
  1163.                             If IsNumeric(Me.Range("长度").Cells(changedCell.row, 1).Value) And _
  1164.                                Me.Range("长度").Cells(changedCell.row, 1).Value > 0 Then
  1165.                                 length = Me.Range("长度").Cells(changedCell.row, 1).Value
  1166.                             Else
  1167.                                 length = -1 ' 标记“长度”列不符合条件
  1168.                             End If
  1169.                         
  1170.                             ' 检查“数量”列是否为数值且大于0
  1171.                             If IsNumeric(Me.Range("数量").Cells(changedCell.row, 1).Value) And _
  1172.                                Me.Range("数量").Cells(changedCell.row, 1).Value > 0 Then
  1173.                                 quantity = Me.Range("数量").Cells(changedCell.row, 1).Value
  1174.                             Else
  1175.                                 quantity = 1 ' 标记“数量”列不符合条件
  1176.                             End If
  1177.                         
  1178.                             ' 如果“长度”和“数量”列都符合条件,则计算焊口数
  1179.                             If length > 0 And quantity > 0 Then
  1180.                                 ' 计算焊口数并填写到“焊口数”列
  1181.                                 Me.Range("焊口数").Cells(changedCell.row, 1).Value = (Int(length / 11) + 1) * quantity
  1182.                                 Me.Range("焊口数").Cells(changedCell.row, 1).NumberFormat = "0"
  1183. '                                Me.Range("拍片总数").Cells(changedCell.row, 1).Value = (Int(length / 11) + 1) * quantity
  1184. '                                Me.Range("拍片总数").Cells(changedCell.row, 1).NumberFormat = "0"
  1185.                             Else
  1186.                                 ' 如果任一列不符合条件,则将“焊口数”列的值设置为空
  1187.                                 Me.Range("焊口数").Cells(changedCell.row, 1).Value = ""
  1188.                                 Me.Range("拍片总数").Cells(changedCell.row, 1).Value = ""
  1189.                             End If
  1190.                         End If
  1191.                         
  1192.                         
  1193.                         '计算换热管加弯头的焊口数
  1194.                         If InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "换热管") > 0 And _
  1195.                            InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "弯头") > 0 Then

  1196.                         
  1197.                             ' 检查“数量”列是否为数值且大于0
  1198.                             If IsNumeric(Me.Range("数量").Cells(changedCell.row, 1).Value) And _
  1199.                                Me.Range("数量").Cells(changedCell.row, 1).Value > 0 Then
  1200.                                Me.Range("焊口数").Cells(changedCell.row, 1).Value = Me.Range("数量").Cells(changedCell.row, 1).Value * 2
  1201.                                Me.Range("焊口数").Cells(changedCell.row, 1).NumberFormat = "0"
  1202. '                               Me.Range("拍片总数").Cells(changedCell.row, 1).Value = Me.Range("数量").Cells(changedCell.row, 1).Value * 2
  1203. '                               Me.Range("拍片总数").Cells(changedCell.row, 1).NumberFormat = "0"
  1204.                             Else
  1205.                                 Me.Range("焊口数").Cells(changedCell.row, 1).Value = "" ' 标记“数量”列不符合条件
  1206.                                 Me.Range("拍片总数").Cells(changedCell.row, 1).Value = ""
  1207.                             End If
  1208.                            
  1209.                         End If
  1210.                         
  1211.                         ' 检查当前行的“材料类型”单元格值是否为“按件标准件”,调用材料单价
  1212.                         If Me.Range("材料类型").Cells(changedCell.row, 1).Value = "按件标准件" Then
  1213.                             Dim nameValue As String
  1214.                             Dim foundCell As Range
  1215.                             Dim materialPrice As Variant
  1216. '                            Me.Range("净重").Cells(changedCell.row, 1).Value = ""
  1217.                            
  1218.                         
  1219.                             nameValue = Me.Range("名称").Cells(changedCell.row, 1).Value ' 获取当前行的“名称”单元格值
  1220.                         
  1221.                             ' 在db12sheet的第二行开始往下找第2列单元格的值是否有相同的
  1222.                             Set foundCell = db12Sheet.Range("B2:B" & db12Sheet.Cells(Rows.Count, 2).End(xlUp).row).Find(What:=nameValue, LookIn:=xlValues, LookAt:=xlWhole)
  1223.                         
  1224.                             If Not foundCell Is Nothing Then
  1225.                                 ' 如果找到,返回找到行第三列的单元格的值到当前行的命名为“材料单价”的单元格
  1226.                                 materialPrice = foundCell.Offset(0, 1).Value
  1227.                                 Me.Range("材料单价").Cells(changedCell.row, 1).Value = materialPrice
  1228.                                 Me.Range("材料费").Cells(changedCell.row, 1).Value = materialPrice * Me.Range("数量").Cells(changedCell.row, 1).Value
  1229.                             End If
  1230.                         End If
  1231.                         
  1232.                         
  1233.                         '检查如果名称含有钢钉,根据规格和材质到DB11钢钉重量及价格查找符合的
  1234.                         If InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "钢钉") > 0 Then
  1235.                         '    Dim nameValue As String
  1236.                         '    Dim materialValue As String
  1237.                         '    Dim foundCell As Range
  1238.                         '    Dim materialPrice As Variant
  1239.                            
  1240.                             ' 获取当前行的“名称”和“材质”单元格值
  1241.                             nameValue = Me.Range("名称").Cells(changedCell.row, 1).Value
  1242.                             materialValue = Me.Range("材质").Cells(changedCell.row, 1).Value
  1243.                            
  1244.                             ' 在db11Sheet的第三行开始往下找第2列单元格的值是否有相同的“名称”
  1245.                             Set foundCell = Nothing
  1246.                             For i = 3 To db11Sheet.Cells(db11Sheet.Rows.Count, 2).End(xlUp).row
  1247.                                 If db11Sheet.Cells(i, 2).Value = nameValue And db11Sheet.Cells(i, 3).Value = materialValue Then
  1248.                                     Set foundCell = db11Sheet.Cells(i, 2)
  1249.                                     Exit For
  1250.                                 End If
  1251.                             Next i
  1252.                            
  1253.                             If Not foundCell Is Nothing Then
  1254.                                 ' 如果找到,返回找到行第5列的单元格的值到当前行的命名为“材料单价”的单元格
  1255.                                 materialPrice = foundCell.Offset(0, 3).Value ' 第5列相对于第2列的偏移量为3
  1256.                                 Me.Range("材料费").Cells(changedCell.row, 1).Value = materialPrice * Me.Range("数量").Cells(changedCell.row, 1).Value
  1257.                                 Me.Range("净重").Cells(changedCell.row, 1).Value = foundCell.Offset(0, 2).Value * Me.Range("数量").Cells(changedCell.row, 1).Value / 1000
  1258.                                 Me.Range("焊口人工费").Cells(changedCell.row, 1).Value = foundCell.Offset(0, 4).Value * Me.Range("数量").Cells(changedCell.row, 1).Value
  1259. '                                Me.Range("材料费").Cells(changedCell.row, 1).NumberFormat = "0"
  1260. '                                Me.Range("焊口人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  1261.                                 
  1262.                                 
  1263.                                 
  1264.                             End If
  1265.                         End If
  1266.                         
  1267.                         
  1268.                         
  1269.                                 ' 去除当前单元格颜色
  1270.                         changedCell.Interior.ColorIndex = xlNone
  1271.                         
  1272.                     End If
  1273.                 End If
  1274.             Next changedCell
  1275.         End If
  1276.         
  1277.    ' 已完成,当列“焊口数”变化的时候,对应要求填写焊口单价,计算焊口人工费,还要考虑加个拍片费用,后面还要做个汇总
  1278.     If Not Intersect(Target, Me.Range("焊口数").Rows("4:" & lastRow)) Is Nothing Then
  1279.         For Each changedCell In Intersect(Target, Me.Range("焊口数").Rows("4:" & lastRow))
  1280.             If changedCell.Count = 1 And changedCell.row > 3 And InStr(LCase(Me.Range("序号").Cells(changedCell.row, 1).Value), ".") > 0 Then
  1281.                 ' 当I列数值变化且大于0时,要求填写比例
  1282.                 If IsNumeric(changedCell.Value) And changedCell.Value > 0 Then
  1283.                     ' 获取当前行的外径或宽度和壁厚的值
  1284.                     Dim diameter As Double
  1285.                     Dim thickness As Double
  1286.                     Dim material As String
  1287.                     diameter = CDbl(Me.Range("外径或宽度").Cells(changedCell.row, 1).Value)
  1288.                     thickness = CDbl(Me.Range("壁厚").Cells(changedCell.row, 1).Value)
  1289.                     material = Me.Range("材质").Cells(changedCell.row, 1).Value
  1290.                     
  1291.                     Me.Range("拍片总数").Cells(changedCell.row, 1).Value = Me.Range("焊口数").Cells(changedCell.row, 1).Value
  1292.    
  1293.                     ' 在db10sheet中查找匹配的行
  1294.                     For i = 4 To db10Sheet.Cells(db10Sheet.Rows.Count, 1).End(xlUp).row
  1295.                         If diameter = CDbl(db10Sheet.Cells(i, 3).Value) And thickness = CDbl(db10Sheet.Cells(i, 4).Value) Then
  1296.                             matchRow = i
  1297.                             Exit For
  1298.                         End If
  1299.                     Next i
  1300.    
  1301.                     ' 根据材质返回相应的焊口单价
  1302.                     If matchRow > 0 Then
  1303.                         If InStr(material, "Cr") > 0 Then
  1304.                             Me.Range("焊口单价").Cells(changedCell.row, 1).Value = db10Sheet.Cells(matchRow, 7).Value
  1305.                         ElseIf InStr(material, "30") > 0 Or InStr(material, "31") > 0 Then
  1306.                             Me.Range("焊口单价").Cells(changedCell.row, 1).Value = db10Sheet.Cells(matchRow, 8).Value
  1307.                         ElseIf Not IsEmpty(material) Then
  1308.                             Me.Range("焊口单价").Cells(changedCell.row, 1).Value = db10Sheet.Cells(matchRow, 6).Value
  1309.                         Else
  1310.                             Me.Range("焊口单价").Cells(changedCell.row, 1).Value = ""
  1311.                         End If
  1312.                     Else
  1313.                         Me.Range("焊口单价").Cells(changedCell.row, 1).Value = ""
  1314.                     End If
  1315.                     
  1316.                     If Me.Range("焊口单价").Cells(changedCell.row, 1).Value = "" Then
  1317.                         Me.Range("焊口人工费").Cells(changedCell.row, 1).Value = ""
  1318.                     Else
  1319.                         Me.Range("焊口人工费").Cells(changedCell.row, 1).Value = Me.Range("焊口数").Cells(changedCell.row, 1).Value * Me.Range("焊口单价").Cells(changedCell.row, 1).Value
  1320.                     End If
  1321.                     
  1322.                     
  1323.                 End If
  1324.             End If
  1325.         Next changedCell
  1326.     End If



  1327.         '对焊口人工费进行归总。
  1328.      If Not Intersect(Target, Me.Range("焊口人工费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1329.         For Each changedCell In Intersect(Target, Me.Range("焊口人工费").Rows("4:" & Me.Rows.Count))
  1330.             If changedCell.Count = 1 And changedCell.row > 3 Then
  1331.                 ' 检查是否是分项行(包含 ".")
  1332.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, ".") > 0 Then
  1333.                     ' 向上查找第一个不含 "." 的行
  1334.                     upperRow = changedCell.row
  1335.                     Do While upperRow > 1 And InStr(Me.Cells(upperRow, 1).Value, ".") > 0
  1336.                         upperRow = upperRow - 1
  1337.                     Loop
  1338.    
  1339.                     ' 向下查找第一个不含 "." 的行
  1340.                     lowerRow = changedCell.row
  1341.                     Do While lowerRow <= Me.Rows.Count And InStr(Me.Cells(lowerRow, 1).Value, ".") > 0
  1342.                         lowerRow = lowerRow + 1
  1343.                     Loop
  1344.    
  1345.                     ' 检查这之间的行的焊口人工费单元格是否有数值且大于0
  1346.                     totalValue = 0
  1347. '                    Dim allEmpty As Boolean
  1348.                     allEmpty = True
  1349.                     For checkRow = upperRow + 1 To lowerRow - 1
  1350.                         If IsNumeric(Me.Cells(checkRow, Me.Range("焊口人工费").Column).Value) Then
  1351.                             cellValue = CDbl(Me.Cells(checkRow, Me.Range("焊口人工费").Column).Value)
  1352.                             If cellValue > 0 Then
  1353.                                 totalValue = totalValue + cellValue
  1354.                                 allEmpty = False
  1355.                             End If
  1356.                         End If
  1357.                     Next checkRow
  1358.    
  1359.                     ' 如果总和大于0,将总和填写到汇总行的焊口人工费单元格
  1360.                     If totalValue > 0 Then
  1361.                         Me.Cells(lowerRow, Me.Range("焊口人工费").Column).Value = totalValue
  1362.                         Me.Cells(lowerRow, Me.Range("焊口人工费").Column).Interior.Color = RGB(0, 255, 0)
  1363.                         Me.Cells(lowerRow, Me.Range("焊口人工费").Column).NumberFormat = "0"
  1364.                     ElseIf allEmpty Then
  1365.                         Me.Cells(lowerRow, Me.Range("焊口人工费").Column).Value = ""
  1366.                         Me.Cells(lowerRow, Me.Range("焊口人工费").Column).Interior.ColorIndex = xlNone
  1367.                     End If
  1368.                 End If
  1369.    
  1370.                 ' 检查是否是汇总行,变更后汇总到制造费
  1371.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1372.                
  1373.                     '综合车间管理费
  1374.                     weldingCost = 0
  1375.                     cuttingPaintingCost = 0
  1376.                     totalShopManagementCost = 0
  1377.                     man_weld = 0
  1378.             
  1379.                     ' 检查装焊人工费
  1380.                     If IsNumeric(Me.Range("装焊人工费").Cells(changedCell.row, 1).Value) Then
  1381.                         weldingCost = CDbl(Me.Range("装焊人工费").Cells(changedCell.row, 1).Value)
  1382.                     End If
  1383.             
  1384.                     ' 检查下料油漆人工费
  1385.                     If IsNumeric(Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value) Then
  1386.                         cuttingPaintingCost = CDbl(Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value)
  1387.                     End If
  1388.                     
  1389.                     ' 检查焊口人工费
  1390.                     If IsNumeric(Me.Range("焊口人工费").Cells(changedCell.row, 1).Value) Then
  1391.                         man_weld = CDbl(Me.Range("焊口人工费").Cells(changedCell.row, 1).Value)
  1392.                     End If
  1393.             
  1394.                     ' 计算总和
  1395.                     totalShopManagementCost = weldingCost + cuttingPaintingCost + man_weld
  1396.             
  1397.                     ' 将总和填写到当前行的车间管理费单元格
  1398.                     Me.Range("车间管理费").Cells(changedCell.row, 1).Value = totalShopManagementCost * ThisWorkbook.Sheets("DB8车间管理费系数").Cells(3, 1).Value
  1399.                     Me.Range("车间管理费").Cells(changedCell.row, 1).NumberFormat = "0"
  1400.                     Me.Range("车间管理费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1401.                
  1402.                
  1403.                     ' 调用函数计算制造费
  1404.                     totalManufacturingCost = production_cost(changedCell.row, Me)
  1405.    
  1406.                     ' 将总和填写到当前行的制造费单元格
  1407.                     Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1408.                     Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1409.                     Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1410.                 End If
  1411.             End If
  1412.         Next changedCell
  1413.     End If
  1414.         
  1415.         
  1416.         
  1417.         
  1418.         
  1419.         
  1420.       ' 已完成,当列“拍片总数”变化的时候,对应要求填写焊口单价,计算焊口人工费,还要考虑加个拍片费用,后面还要做个汇总
  1421.     If Not Intersect(Target, Me.Range("拍片总数").Rows("4:" & lastRow)) Is Nothing Then
  1422.             For Each changedCell In Intersect(Target, Me.Range("拍片总数").Rows("4:" & lastRow))
  1423.                 If changedCell.Count = 1 And changedCell.row > 3 And InStr(LCase(Me.Range("序号").Cells(changedCell.row, 1).Value), ".") > 0 Then
  1424.                     ' 当I列数值变化且大于0时,要求填写比例
  1425.                     If IsNumeric(changedCell.Value) And changedCell.Value > 0 Then
  1426.                         ' 当前行J列单元格变黄色
  1427.                         Me.Range("拍片比例").Cells(changedCell.row, 1).Interior.Color = RGB(255, 255, 0)
  1428.                         
  1429.                         ' 获取当前行的壁厚值
  1430.                         thickness = Me.Range("壁厚").Cells(changedCell.row, 1).Value
  1431.         
  1432.                         ' 在DB5无损检测价格表中查找匹配的行
  1433.                         matchRow = 0
  1434.                         For i = 3 To db5Sheet.Cells(db5Sheet.Rows.Count, 1).End(xlUp).row
  1435.                             If thickness > db5Sheet.Cells(i, 2).Value And thickness <= db5Sheet.Cells(i, 3).Value Then
  1436.                                 matchRow = i
  1437.                                 Exit For
  1438.                             End If
  1439.                         Next i
  1440.         
  1441.                         ' 如果找到匹配的行,将第四列的数值填写到当前行的“拍片单价”单元格
  1442.                         If matchRow > 0 Then
  1443.                             Me.Range("拍片单价").Cells(changedCell.row, 1).Value = db5Sheet.Cells(matchRow, 4).Value
  1444.                         Else
  1445.                             Me.Range("拍片单价").Cells(changedCell.row, 1).Value = ""
  1446.                         End If
  1447.                         
  1448.                         '重新计算拍片费用
  1449.                         If IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.5" Then
  1450.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.5)
  1451.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.5
  1452.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1453.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1454.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1455.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.2" Then
  1456.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.2)
  1457.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.2
  1458.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1459.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1460.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1461.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.1" Then
  1462.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.1)
  1463.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.1
  1464.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1465.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1466.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1467.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.05" Then
  1468.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.05)
  1469.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.05
  1470.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1471.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1472.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1473.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "1" Then
  1474.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 1)
  1475.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 1
  1476.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1477.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1478.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1479.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.0" Then
  1480.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = ""
  1481.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = ""
  1482.                           
  1483.                         End If
  1484.                     End If
  1485.                 End If
  1486.         Next changedCell
  1487.     End If
  1488.    
  1489.    
  1490.     ' 已完成,拍片比例变动且有数值,改动拍片实际数量,计算无损检测费用
  1491.     If Not Intersect(Target, Me.Range("拍片比例").Rows("4:" & lastRow)) Is Nothing Then
  1492.         For Each changedCell In Intersect(Target, Me.Range("拍片比例").Rows("4:" & lastRow))
  1493.             If changedCell.Count = 1 And changedCell.row > 3 And InStr(LCase(Me.Range("序号").Cells(changedCell.row, 1).Value), ".") > 0 Then
  1494.                     ' 获取当前行的 I 列数值
  1495.                     Dim baseValue As Double
  1496.                     If IsNumeric(Me.Range("拍片总数").Cells(changedCell.row, 1).Value) Then
  1497.                         baseValue = Me.Range("拍片总数").Cells(changedCell.row, 1).Value
  1498.                     Else
  1499.                         baseValue = 0
  1500.                     End If

  1501.                     ' 获取当前行的 J 列下拉列表值,并转换为数值
  1502.                     Dim discount As Double
  1503.                     If IsNumeric(Replace(changedCell.Value, "%", "")) Then
  1504.                         discount = CDbl(Replace(changedCell.Value, "%", "")) / 100
  1505.                     Else
  1506.                         discount = 1 ' 默认为 100%
  1507.                     End If

  1508.                     ' 检查第27列是否为数值且大于0

  1509.                     If IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.5" Then
  1510.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.5)
  1511.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.5
  1512.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1513.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1514.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1515.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.2" Then
  1516.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.2)
  1517.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.2
  1518.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1519.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1520.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1521.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.1" Then
  1522.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.1)
  1523.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.1
  1524.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1525.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1526.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1527.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "0.05" Then
  1528.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 0.05)
  1529.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 0.05
  1530.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1531.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1532.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1533.                         ElseIf IsNumeric(Me.Range("拍片单价").Cells(changedCell.row, 1).Value) And Me.Range("拍片单价").Cells(changedCell.row, 1).Value > 0 And Me.Range("拍片比例").Cells(changedCell.row, 1).Value = "1" Then
  1534.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = 2 * Round(Me.Range("拍片总数").Cells(changedCell.row, 1).Value * 1)
  1535.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = 2 * Me.Range("拍片总数").Cells(changedCell.row, 1).Value * Me.Range("拍片单价").Cells(changedCell.row, 1).Value * 1
  1536.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).NumberFormat = "0"
  1537.                           Me.Range("无损检测费").Cells(changedCell.row, 1).NumberFormat = "0"
  1538.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1539.                         ElseIf Me.Range("拍片比例").Cells(changedCell.row, 1).Value = 0 Then
  1540.                           Me.Range("实际拍片数量").Cells(changedCell.row, 1).Value = ""
  1541.                           Me.Range("无损检测费").Cells(changedCell.row, 1).Value = ""
  1542.                     End If

  1543.                 End If
  1544.                 Me.Range("拍片比例").Cells(changedCell.row, 1).Interior.Color = xlNone

  1545.             Next changedCell
  1546.         End If
  1547.         
  1548.     '对无损检测费进行归总。
  1549.     If Not Intersect(Target, Me.Range("无损检测费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1550.         For Each changedCell In Intersect(Target, Me.Range("无损检测费").Rows("4:" & Me.Rows.Count))
  1551.             If changedCell.Count = 1 And changedCell.row > 3 Then
  1552.                 ' 检查是否是分项行(包含 ".")
  1553.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, ".") > 0 Then
  1554.                     ' 向上查找第一个不含 "." 的行
  1555.                     upperRow = changedCell.row
  1556.                     Do While upperRow > 1 And InStr(Me.Cells(upperRow, 1).Value, ".") > 0
  1557.                         upperRow = upperRow - 1
  1558.                     Loop
  1559.    
  1560.                     ' 向下查找第一个不含 "." 的行
  1561.                     lowerRow = changedCell.row
  1562.                     Do While lowerRow <= Me.Rows.Count And InStr(Me.Cells(lowerRow, 1).Value, ".") > 0
  1563.                         lowerRow = lowerRow + 1
  1564.                     Loop
  1565.    
  1566.                     ' 检查这之间的行的无损检测费单元格是否有数值且大于0
  1567.                     totalValue = 0
  1568.                     For checkRow = upperRow + 1 To lowerRow - 1
  1569.                         If IsNumeric(Me.Cells(checkRow, Me.Range("无损检测费").Column).Value) Then
  1570.                             cellValue = CDbl(Me.Cells(checkRow, Me.Range("无损检测费").Column).Value)
  1571.                             If cellValue > 0 Then
  1572.                                 totalValue = totalValue + cellValue
  1573.                             End If
  1574.                         End If
  1575.                     Next checkRow
  1576.    
  1577.                     ' 如果总和大于0,将总和填写到汇总行的无损检测费单元格
  1578.                     If totalValue > 0 Then
  1579.                         Me.Cells(lowerRow, Me.Range("无损检测费").Column).Value = totalValue
  1580.                         Me.Cells(lowerRow, Me.Range("无损检测费").Column).Interior.Color = RGB(0, 255, 0)
  1581.                         Me.Cells(lowerRow, Me.Range("无损检测费").Column).NumberFormat = "0"
  1582.                     End If
  1583.                 End If
  1584.                
  1585.                 ' 检查是否是汇总行,变更后汇总到制造费
  1586.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1587.                     ' 调用函数计算制造费
  1588.     '                Dim totalManufacturingCost As Double
  1589.                     totalManufacturingCost = production_cost(changedCell.row, Me)
  1590.    
  1591.                     ' 将总和填写到当前行的制造费单元格
  1592.                     Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1593.                     Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1594.                     Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1595.                 End If
  1596.                
  1597.                
  1598.             End If
  1599.         Next changedCell
  1600.     End If
  1601.    
  1602.     '对外协加工费进行归总。
  1603.     If Not Intersect(Target, Me.Range("外协加工费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1604.         For Each changedCell In Intersect(Target, Me.Range("外协加工费").Rows("4:" & Me.Rows.Count))
  1605.             If changedCell.Count = 1 And changedCell.row > 3 Then
  1606.                 ' 检查是否是分项行(包含 ".")
  1607.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, ".") > 0 Then
  1608.                     ' 向上查找第一个不含 "." 的行
  1609.                     upperRow = changedCell.row
  1610.                     Do While upperRow > 1 And InStr(Me.Cells(upperRow, 1).Value, ".") > 0
  1611.                         upperRow = upperRow - 1
  1612.                     Loop
  1613.    
  1614.                     ' 向下查找第一个不含 "." 的行
  1615.                     lowerRow = changedCell.row
  1616.                     Do While lowerRow <= Me.Rows.Count And InStr(Me.Cells(lowerRow, 1).Value, ".") > 0
  1617.                         lowerRow = lowerRow + 1
  1618.                     Loop
  1619.    
  1620.                     ' 检查这之间的行的外协加工费单元格是否有数值且大于0
  1621.                     totalValue = 0
  1622.                     For checkRow = upperRow + 1 To lowerRow - 1
  1623.                         If IsNumeric(Me.Cells(checkRow, Me.Range("外协加工费").Column).Value) Then
  1624.                             cellValue = CDbl(Me.Cells(checkRow, Me.Range("外协加工费").Column).Value)
  1625.                             If cellValue > 0 Then
  1626.                                 totalValue = totalValue + cellValue
  1627.                             End If
  1628.                         End If
  1629.                     Next checkRow
  1630.    
  1631.                     ' 如果总和大于0,将总和填写到汇总行的外协加工费单元格
  1632.                     If totalValue > 0 Then
  1633.                         Me.Cells(lowerRow, Me.Range("外协加工费").Column).Value = totalValue
  1634.                         Me.Cells(lowerRow, Me.Range("外协加工费").Column).Interior.Color = RGB(0, 255, 0)
  1635.                         Me.Cells(lowerRow, Me.Range("外协加工费").Column).NumberFormat = "0"
  1636.                     End If
  1637.                 End If
  1638.                
  1639.                 ' 检查是否是汇总行,变更后汇总到制造费
  1640.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1641.                     ' 调用函数计算制造费
  1642.     '                Dim totalManufacturingCost As Double
  1643.                     totalManufacturingCost = production_cost(changedCell.row, Me)
  1644.    
  1645.                     ' 将总和填写到当前行的制造费单元格
  1646.                     Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1647.                     Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1648.                     Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1649.                 End If
  1650.                
  1651.             End If
  1652.         Next changedCell
  1653.     End If
  1654.    
  1655.    
  1656.         '对热处理费进行归总。先关掉用新的试试
  1657.      If Not Intersect(Target, Me.Range("热处理费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1658.         For Each changedCell In Intersect(Target, Me.Range("热处理费").Rows("4:" & Me.Rows.Count))
  1659.             If changedCell.Count = 1 And changedCell.row > 3 Then
  1660.                 ' 检查是否是分项行(包含 ".")
  1661.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, ".") > 0 Then
  1662.                     ' 向上查找第一个不含 "." 的行
  1663.                     upperRow = changedCell.row
  1664.                     Do While upperRow > 1 And InStr(Me.Cells(upperRow, 1).Value, ".") > 0
  1665.                         upperRow = upperRow - 1
  1666.                     Loop
  1667.    
  1668.                     ' 向下查找第一个不含 "." 的行
  1669.                     lowerRow = changedCell.row
  1670.                     Do While lowerRow <= Me.Rows.Count And InStr(Me.Cells(lowerRow, 1).Value, ".") > 0
  1671.                         lowerRow = lowerRow + 1
  1672.                     Loop
  1673.    
  1674.                     ' 检查这之间的行的热处理费单元格是否有数值且大于0
  1675.                     totalValue = 0
  1676.                     
  1677.                     allEmpty = True
  1678.                     For checkRow = upperRow + 1 To lowerRow - 1
  1679.                         If IsNumeric(Me.Cells(checkRow, Me.Range("热处理费").Column).Value) Then
  1680.                             cellValue = CDbl(Me.Cells(checkRow, Me.Range("热处理费").Column).Value)
  1681.                             If cellValue > 0 Then
  1682.                                 totalValue = totalValue + cellValue
  1683.                                 allEmpty = False
  1684.                             End If
  1685.                         End If
  1686.                     Next checkRow
  1687.    
  1688.                     ' 如果总和大于0,将总和填写到汇总行的热处理费单元格
  1689.                     If totalValue > 0 Then
  1690.                         Me.Cells(lowerRow, Me.Range("热处理费").Column).Value = totalValue
  1691.                         Me.Cells(lowerRow, Me.Range("热处理费").Column).Interior.Color = RGB(0, 255, 0)
  1692.                         Me.Cells(lowerRow, Me.Range("热处理费").Column).NumberFormat = "0"
  1693.                     ElseIf allEmpty Then
  1694.                         Me.Cells(lowerRow, Me.Range("热处理费").Column).Value = ""
  1695.                         Me.Cells(lowerRow, Me.Range("热处理费").Column).Interior.ColorIndex = xlNone
  1696.                     End If
  1697.                 End If
  1698.    
  1699.                 ' 检查是否是汇总行,变更后汇总到制造费
  1700.                 If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1701.                     ' 调用函数计算制造费
  1702.                     totalManufacturingCost = production_cost(changedCell.row, Me)
  1703.    
  1704.                     ' 将总和填写到当前行的制造费单元格
  1705.                     Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1706.                     Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1707.                     Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1708.                 End If
  1709.             End If
  1710.         Next changedCell
  1711.     End If
  1712.       
  1713.    

  1714.    
  1715.       
  1716.     '装焊人工费变动后,对制作费进行归总。
  1717.     If Not Intersect(Target, Me.Range("装焊人工费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1718.         For Each changedCell In Intersect(Target, Me.Range("装焊人工费").Rows("4:" & Me.Rows.Count))
  1719.              ' 检查是否是汇总行,变更后汇总到制造费
  1720.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1721.                 ' 调用函数计算制造费
  1722.                
  1723.                 totalManufacturingCost = production_cost(changedCell.row, Me)

  1724.                 ' 将总和填写到当前行的制造费单元格
  1725.                 Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1726.                 Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1727.                 Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1728.             End If
  1729.             
  1730.             
  1731.             '综合车间管理费
  1732.             weldingCost = 0
  1733.             cuttingPaintingCost = 0
  1734.             totalShopManagementCost = 0
  1735.             man_weld = 0
  1736.    
  1737.             ' 检查装焊人工费
  1738.             If IsNumeric(Me.Range("装焊人工费").Cells(changedCell.row, 1).Value) Then
  1739.                 weldingCost = CDbl(Me.Range("装焊人工费").Cells(changedCell.row, 1).Value)
  1740.             End If
  1741.    
  1742.             ' 检查下料油漆人工费
  1743.             If IsNumeric(Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value) Then
  1744.                 cuttingPaintingCost = CDbl(Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value)
  1745.             End If
  1746.             
  1747.             ' 检查焊口人工费
  1748.             If IsNumeric(Me.Range("焊口人工费").Cells(changedCell.row, 1).Value) Then
  1749.                 man_weld = CDbl(Me.Range("焊口人工费").Cells(changedCell.row, 1).Value)
  1750.             End If
  1751.    
  1752.             ' 计算总和
  1753.             totalShopManagementCost = weldingCost + cuttingPaintingCost + man_weld
  1754.    
  1755.             ' 将总和填写到当前行的车间管理费单元格
  1756.             Me.Range("车间管理费").Cells(changedCell.row, 1).Value = totalShopManagementCost * ThisWorkbook.Sheets("DB8车间管理费系数").Cells(3, 1).Value
  1757.             Me.Range("车间管理费").Cells(changedCell.row, 1).NumberFormat = "0"
  1758.             Me.Range("车间管理费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1759.                
  1760.             
  1761.         Next changedCell
  1762.     End If
  1763.    
  1764.      '下料油漆人工费变动后,对制作费进行归总。
  1765.     If Not Intersect(Target, Me.Range("下料油漆人工费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1766.         For Each changedCell In Intersect(Target, Me.Range("下料油漆人工费").Rows("4:" & Me.Rows.Count))
  1767.              ' 检查是否是汇总行,变更后汇总到制造费
  1768.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1769.                 ' 调用函数计算制造费
  1770.                
  1771.                 totalManufacturingCost = production_cost(changedCell.row, Me)
  1772.                 ' 将总和填写到当前行的制造费单元格
  1773.                 Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1774.                 Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1775.                 Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1776.             End If
  1777.             
  1778.             '综合车间管理费
  1779.             weldingCost = 0
  1780.             cuttingPaintingCost = 0
  1781.             totalShopManagementCost = 0
  1782.             man_weld = 0
  1783.    
  1784.             ' 检查装焊人工费
  1785.             If IsNumeric(Me.Range("装焊人工费").Cells(changedCell.row, 1).Value) Then
  1786.                 weldingCost = CDbl(Me.Range("装焊人工费").Cells(changedCell.row, 1).Value)
  1787.             End If
  1788.    
  1789.             ' 检查下料油漆人工费
  1790.             If IsNumeric(Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value) Then
  1791.                 cuttingPaintingCost = CDbl(Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value)
  1792.             End If
  1793.             
  1794.             ' 检查焊口人工费
  1795.             If IsNumeric(Me.Range("焊口人工费").Cells(changedCell.row, 1).Value) Then
  1796.                 man_weld = CDbl(Me.Range("焊口人工费").Cells(changedCell.row, 1).Value)
  1797.             End If
  1798.    
  1799.             ' 计算总和
  1800.             totalShopManagementCost = weldingCost + cuttingPaintingCost + man_weld
  1801.    
  1802.             ' 将总和填写到当前行的车间管理费单元格
  1803.             Me.Range("车间管理费").Cells(changedCell.row, 1).Value = totalShopManagementCost * ThisWorkbook.Sheets("DB8车间管理费系数").Cells(3, 1).Value
  1804.             Me.Range("车间管理费").Cells(changedCell.row, 1).NumberFormat = "0"
  1805.             Me.Range("车间管理费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1806.             
  1807.         Next changedCell
  1808.     End If
  1809.    
  1810.        '辅材费变动后,对制作费进行归总。
  1811.     If Not Intersect(Target, Me.Range("辅材费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1812.         For Each changedCell In Intersect(Target, Me.Range("辅材费").Rows("4:" & Me.Rows.Count))
  1813.                
  1814.              ' 检查是否是汇总行,变更后汇总到制造费
  1815.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1816.                 ' 调用函数计算制造费
  1817.                
  1818.                 totalManufacturingCost = production_cost(changedCell.row, Me)

  1819.                 ' 将总和填写到当前行的制造费单元格
  1820.                 Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1821.                 Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1822.                 Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1823.             End If
  1824.                
  1825.             
  1826.         Next changedCell
  1827.     End If
  1828.    
  1829.    
  1830.     '机加工费变动后,对制作费进行归总。
  1831.     If Not Intersect(Target, Me.Range("机加工费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1832.         For Each changedCell In Intersect(Target, Me.Range("机加工费").Rows("4:" & Me.Rows.Count))
  1833.                
  1834.              ' 检查是否是汇总行,变更后汇总到制造费
  1835.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1836.                 ' 调用函数计算制造费
  1837.                
  1838.                 totalManufacturingCost = production_cost(changedCell.row, Me)

  1839.                 ' 将总和填写到当前行的制造费单元格
  1840.                 Me.Range("制作费").Cells(changedCell.row, 1).Value = totalManufacturingCost
  1841.                 Me.Range("制作费").Cells(changedCell.row, 1).NumberFormat = "0"
  1842.                 Me.Range("制作费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  1843.             End If
  1844.                
  1845.             
  1846.         Next changedCell
  1847.     End If

  1848.         
  1849.         
  1850. ' 当设计重量发生变动,连锁变更估重和材料费用】材料系数到数据库的表里取值,由于设计重量关联到材料成本,加工成本,是重中之重
  1851.     If Not Intersect(Target, Me.Range("净重").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  1852.         For Each changedCell In Intersect(Target, Me.Range("净重").Rows("4:" & Me.Rows.Count))
  1853.           '对于分项的净重变动,调取材料系数,计算毛重,计算材料费
  1854.            If changedCell.Count = 1 And changedCell.row > 3 And InStr(LCase(Me.Range("序号").Cells(changedCell.row, 1).Value), ".") > 0 Then
  1855.                 matchRow = 0

  1856.                 For i = 3 To db3Sheet.Cells(db3Sheet.Rows.Count, 1).End(xlUp).row
  1857.                     If db3Sheet.Cells(i, 1).Value = Me.Range("名称").Cells(changedCell.row, 1).Value Then
  1858.                         matchRow = i
  1859.                         Exit For
  1860.                     End If
  1861.                 Next i

  1862.                 ' 如果找到匹配的行,将第四列的值返回到当前行的毛重单元格
  1863.                 If matchRow > 0 Then
  1864.                     Me.Range("毛重").Cells(changedCell.row, 1).Value = db3Sheet.Cells(matchRow, 4).Value * Me.Range("净重").Cells(changedCell.row, 1).Value
  1865.                     Me.Range("毛重").Cells(changedCell.row, 1).NumberFormat = "0.000"
  1866.                     '对要集成计算人工算的重量进行提取,否则不提取
  1867.                     If db3Sheet.Cells(matchRow, 3).Value = "是" Then
  1868.                        Me.Cells(changedCell.row, Me.Range("集成计算人工费的重量").Column).Value = Me.Range("净重").Cells(changedCell.row, 1).Value
  1869.                        Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).NumberFormat = "0.000"
  1870.                     Else
  1871.                        Me.Cells(changedCell.row, Me.Range("集成计算人工费的重量").Column).Value = ""
  1872.                     End If
  1873.                     
  1874.                     
  1875.                 Else
  1876.                     Me.Range("毛重").Cells(changedCell.row, 1).Value = ""
  1877.                 End If

  1878.                 ' 得到材料费,用估算重量乘以材料单价
  1879.                 If InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "钢钉") = 0 And InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "销钉") = 0 Then
  1880.                     Me.Range("材料费").Cells(changedCell.row, 1).Value = db3Sheet.Cells(matchRow, 4).Value * Me.Range("净重").Cells(changedCell.row, 1).Value * Me.Range("材料单价").Cells(changedCell.row, 1).Value
  1881.                     Me.Range("材料费").Cells(changedCell.row, 1).NumberFormat = "0"
  1882.                 End If


  1883.                 ' 向上查找第一个不含 "." 的行
  1884.                ' 向上查找第一个不含 "." 的行
  1885.                
  1886.                 upperRow = changedCell.row
  1887.                 Do While upperRow > 1 And InStr(LCase(Me.Cells(upperRow, 1).Value), ".") > 0
  1888.                     upperRow = upperRow - 1
  1889.                 Loop

  1890.                 ' 向下查找第一个不含 "." 的行
  1891.                
  1892.                 lowerRow = changedCell.row
  1893.                 Do While lowerRow <= Me.Rows.Count And InStr(LCase(Me.Cells(lowerRow, 1).Value), ".") > 0
  1894.                     lowerRow = lowerRow + 1
  1895.                 Loop

  1896.                 ' 检查这之间的行的净重单元格是否有数值
  1897.                 totalValue = 0
  1898.                
  1899.                 For checkRow = upperRow + 1 To lowerRow - 1
  1900.                     If IsNumeric(Me.Cells(checkRow, Me.Range("净重").Column).Value) Then
  1901.                         totalValue = totalValue + Me.Cells(checkRow, Me.Range("净重").Column).Value
  1902.                     Else
  1903.                         totalValue = -1 ' 如果有空值或非数值,设置为-1
  1904.                         Exit For
  1905.                     End If
  1906.                 Next checkRow

  1907.                 ' 如果所有行都有数值,将总和填写到汇总行的净重单元格
  1908.                 If totalValue >= 0 Then
  1909.                     Me.Cells(lowerRow, Me.Range("净重").Column).Value = totalValue
  1910.                     Me.Cells(lowerRow, Me.Range("净重").Column).NumberFormat = "0.000"
  1911.                     Me.Cells(lowerRow, Me.Range("净重").Column).Interior.Color = RGB(0, 255, 0)
  1912.                 End If
  1913.                
  1914.                
  1915.                 '目前不成功呢
  1916.                 '找出需要热处理的,并提供单价和总价
  1917.                 If IsNumeric(Me.Range("净重").Cells(changedCell.row, 1).Value) And Me.Range("净重").Cells(changedCell.row, 1).Value > 0 Then
  1918.                 ' 获取材质和壁厚的值
  1919.                     material = Me.Range("材质").Cells(changedCell.row, 1).Value
  1920.                     thickness = CDbl(Me.Range("壁厚").Cells(changedCell.row, 1).Value)
  1921.    
  1922.                     ' 在DB6热处理要求表中查找对应的热处理单价
  1923. '                    Dim db6MatchRow As Long
  1924. '                    db6MatchRow = 0
  1925.                     
  1926.                     For i = 3 To db6Sheet.Cells(db6Sheet.Rows.Count, 1).End(xlUp).row
  1927.                         If db6Sheet.Cells(i, 1).Value = material And thickness > CDbl(db6Sheet.Cells(i, 2).Value) Then
  1928.                                 db6MatchRow = i
  1929.                                 Exit For
  1930.                         End If
  1931.                     Next i
  1932.    
  1933.                     ' 如果找到匹配的行,将第三列的值返回到当前行的热处理单价单元格
  1934.                     If db6MatchRow > 0 Then
  1935.                         Me.Range("热处理单价").Cells(changedCell.row, 1).Value = db6Sheet.Cells(db6MatchRow, 3).Value
  1936.                         Me.Range("热处理单价").Cells(changedCell.row, 1).NumberFormat = "0"
  1937.                         Me.Range("热处理费").Cells(changedCell.row, 1).Value = db6Sheet.Cells(db6MatchRow, 3).Value * Me.Range("净重").Cells(changedCell.row, 1).Value
  1938.                         Me.Range("热处理费").Cells(changedCell.row, 1).NumberFormat = "0"
  1939.                     Else
  1940.                         Me.Range("热处理单价").Cells(changedCell.row, 1).Value = ""
  1941.                         Me.Range("热处理费").Cells(changedCell.row, 1).Value = ""
  1942.                     End If
  1943.                 End If
  1944.                 '热处理单元处理结束
  1945.                
  1946.                 '如果是集箱,加4000元每吨到焊口人工费,如果是钢钉,算出个数乘以每个的加工费
  1947.                 If Me.Range("净重").Cells(changedCell.row, 1).Value > 0 And InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "集箱") > 0 Then
  1948.                         Me.Range("焊口人工费").Cells(changedCell.row, 1).Value = Me.Range("净重").Cells(changedCell.row, 1).Value * 4000
  1949.                         Me.Range("焊口人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  1950. '                ElseIf Me.Range("净重").Cells(changedCell.row, 1).Value > 0 And InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "钢钉") > 0 Then
  1951. '                        Me.Range("焊口人工费").Cells(changedCell.row, 1).Value = Me.Range("净重").Cells(changedCell.row, 1).Value * _
  1952. '                        ThisWorkbook.Sheets("DB11钢钉重量及价格").Cells(3, 3).Value / ThisWorkbook.Sheets("DB11钢钉重量及价格").Cells(3, 2).Value * 1000
  1953. '                        Me.Range("焊口人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  1954.                 '如果是翅片,计算外协加工费
  1955.                 ElseIf Me.Range("净重").Cells(changedCell.row, 1).Value > 0 And InStr(Me.Range("名称").Cells(changedCell.row, 1).Value, "翅片") > 0 Then
  1956.                     Me.Range("外协加工费").Cells(changedCell.row, 1).Value = Me.Range("净重").Cells(changedCell.row, 1).Value * _
  1957.                     ThisWorkbook.Sheets("DB13按吨加工件加工单价").Cells(3, 3).Value * 2
  1958.                     Me.Range("外协加工费").Cells(changedCell.row, 1).NumberFormat = "0"
  1959.                         
  1960.                         
  1961.                         
  1962.                         
  1963.                 End If
  1964.                

  1965.                
  1966.                
  1967.                

  1968.             End If
  1969.             '这里是第一段代码分项净重的计算结束,注释掉,后面用集成净重了

  1970. '            ' 新增功能:对于汇总行净重变更,调取相关系数,计算价格并汇总
  1971. '            If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  1972. ''                Dim db4Row As Long
  1973. ''                Dim db4MatchRow As Long
  1974. '
  1975. '
  1976. '
  1977. '
  1978. '
  1979. '                ' 获取当前行C列的值
  1980. '                cCellValue = Me.Range("材料规格").Cells(changedCell.row, 1).Value
  1981. '
  1982. '
  1983. '
  1984. '
  1985. '                ' 在"DB4车间生产价格表"中查找符合条件的行
  1986. '                db4MatchRow = 0
  1987. '                For db4Row = 3 To db4Sheet.Cells(db4Sheet.Rows.Count, 1).End(xlUp).row
  1988. '                    If db4Sheet.Cells(db4Row, 1).Value = cCellValue Then
  1989. '                        If Me.Range("净重").Cells(changedCell.row, 1).Value >= db4Sheet.Cells(db4Row, 2).Value And _
  1990. '                           Me.Range("净重").Cells(changedCell.row, 1).Value <= db4Sheet.Cells(db4Row, 3).Value Then
  1991. '                            db4MatchRow = db4Row
  1992. '                            Exit For
  1993. '                        End If
  1994. '                    End If
  1995. '                Next db4Row
  1996. '
  1997. '                ' 如果找到匹配的行,将D列的值返回到当前行的R列
  1998. '                If db4MatchRow > 0 Then
  1999. '                '下面这句以后正式运行要不体现数据的话,可以取消注释掉,这里读取装焊单价
  2000. '                    Me.Range("装焊单价").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 4).Value
  2001. '                    Me.Range("装焊人工费").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 4).Value * Me.Range("净重").Cells(changedCell.row, 1).Value
  2002. '                    Me.Range("装焊人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  2003. '                    Me.Range("装焊人工费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2004. '
  2005. '                '下面这句以后正式运行要不体现数据的话,可以取消注释掉,这里读取下料油漆单价
  2006. '                    Me.Range("下料油漆单价").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 5).Value
  2007. '                    Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 5).Value * Me.Range("净重").Cells(changedCell.row, 1).Value
  2008. '                    Me.Range("下料油漆人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  2009. '                    Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2010. '
  2011. '                '下面这句以后正式运行要不体现数据的话,可以取消注释掉,这里读取下料辅材单价
  2012. '                    Me.Range("辅材单价").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 6).Value
  2013. '                    Me.Range("辅材费").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 6).Value * Me.Range("净重").Cells(changedCell.row, 1).Value
  2014. '                    Me.Range("辅材费").Cells(changedCell.row, 1).NumberFormat = "0"
  2015. '                    Me.Range("辅材费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2016. '
  2017. '                End If
  2018. '
  2019. '                '机加工费
  2020. '                Me.Range("机加工费").Cells(changedCell.row, 1).Value = Me.Range("净重").Cells(changedCell.row, 1).Value * ThisWorkbook.Sheets("DB9机加工费系数").Cells(3, 1).Value
  2021. '                Me.Range("机加工费").Cells(changedCell.row, 1).NumberFormat = "0"
  2022. '                Me.Range("机加工费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2023. '
  2024. '            End If
  2025.             
  2026.             Me.Range("净重").Cells(changedCell.row, 1).Interior.Color = xlNone

  2027.         Next changedCell
  2028.     End If
  2029.    
  2030. '这里加一段集成净重的算法,把总成计算迁移过去
  2031. If Not Intersect(Target, Me.Range("集成计算人工费的重量").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  2032.         For Each changedCell In Intersect(Target, Me.Range("集成计算人工费的重量").Rows("4:" & Me.Rows.Count))
  2033.           '对于分项的集成计算人工费的重量变动,调取材料系数,计算毛重,计算材料费
  2034.            If changedCell.Count = 1 And changedCell.row > 3 And InStr(LCase(Me.Range("序号").Cells(changedCell.row, 1).Value), ".") > 0 Then

  2035.                 ' 向上查找第一个不含 "." 的行
  2036.                ' 向上查找第一个不含 "." 的行
  2037.                
  2038.                 upperRow = changedCell.row
  2039.                 Do While upperRow > 1 And InStr(LCase(Me.Cells(upperRow, 1).Value), ".") > 0
  2040.                     upperRow = upperRow - 1
  2041.                 Loop

  2042.                 ' 向下查找第一个不含 "." 的行
  2043.                
  2044.                 lowerRow = changedCell.row
  2045.                 Do While lowerRow <= Me.Rows.Count And InStr(LCase(Me.Cells(lowerRow, 1).Value), ".") > 0
  2046.                     lowerRow = lowerRow + 1
  2047.                 Loop

  2048.                 ' 检查这之间的行的集成计算人工费的重量单元格是否有数值
  2049.                 totalValue = 0
  2050.                
  2051.                 For checkRow = upperRow + 1 To lowerRow - 1
  2052.                     If IsNumeric(Me.Cells(checkRow, Me.Range("集成计算人工费的重量").Column).Value) Then
  2053.                         totalValue = totalValue + Me.Cells(checkRow, Me.Range("集成计算人工费的重量").Column).Value
  2054.                     Else
  2055.                         totalValue = -1 ' 如果有空值或非数值,设置为-1
  2056.                         Exit For
  2057.                     End If
  2058.                 Next checkRow

  2059.                 ' 如果所有行都有数值,将总和填写到汇总行的集成计算人工费的重量单元格
  2060.                 If totalValue >= 0 Then
  2061.                     Me.Cells(lowerRow, Me.Range("集成计算人工费的重量").Column).Value = totalValue
  2062.                     Me.Cells(lowerRow, Me.Range("集成计算人工费的重量").Column).NumberFormat = "0.000"
  2063. '                    Me.Cells(lowerRow, Me.Range("集成计算人工费的重量").Column).Interior.Color = RGB(0, 255, 0)
  2064.                 End If

  2065.             End If
  2066.             '这里是第一段代码分项集成计算人工费的重量的计算结束

  2067.             ' 新增功能:对于汇总行集成计算人工费的重量变更,调取相关系数,计算价格并汇总
  2068.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then

  2069.                 ' 获取当前行C列的值
  2070.                 cCellValue = Me.Range("材料规格").Cells(changedCell.row, 1).Value

  2071.                 ' 在"DB4车间生产价格表"中查找符合条件的行
  2072.                 db4MatchRow = 0
  2073.                 For db4Row = 3 To db4Sheet.Cells(db4Sheet.Rows.Count, 1).End(xlUp).row
  2074.                     If db4Sheet.Cells(db4Row, 1).Value = cCellValue Then
  2075.                         If Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Value >= db4Sheet.Cells(db4Row, 2).Value And _
  2076.                            Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Value <= db4Sheet.Cells(db4Row, 3).Value Then
  2077.                             db4MatchRow = db4Row
  2078.                             Exit For
  2079.                         End If
  2080.                     End If
  2081.                 Next db4Row

  2082.                 ' 如果找到匹配的行,将D列的值返回到当前行的R列
  2083.                 If db4MatchRow > 0 Then
  2084.                 '下面这句以后正式运行要不体现数据的话,可以取消注释掉,这里读取装焊单价
  2085.                     Me.Range("装焊单价").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 4).Value
  2086.                     Me.Range("装焊人工费").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 4).Value * Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Value
  2087.                     Me.Range("装焊人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  2088.                     Me.Range("装焊人工费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)

  2089.                 '下面这句以后正式运行要不体现数据的话,可以取消注释掉,这里读取下料油漆单价
  2090.                     Me.Range("下料油漆单价").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 5).Value
  2091.                     Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 5).Value * Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Value
  2092.                     Me.Range("下料油漆人工费").Cells(changedCell.row, 1).NumberFormat = "0"
  2093.                     Me.Range("下料油漆人工费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)

  2094.                 '下面这句以后正式运行要不体现数据的话,可以取消注释掉,这里读取下料辅材单价
  2095.                     Me.Range("辅材单价").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 6).Value
  2096.                     Me.Range("辅材费").Cells(changedCell.row, 1).Value = db4Sheet.Cells(db4MatchRow, 6).Value * Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Value
  2097.                     Me.Range("辅材费").Cells(changedCell.row, 1).NumberFormat = "0"
  2098.                     Me.Range("辅材费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)


  2099.                 End If
  2100.                
  2101.                 '机加工费
  2102.                 Me.Range("机加工费").Cells(changedCell.row, 1).Value = Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Value * ThisWorkbook.Sheets("DB9机加工费系数").Cells(3, 1).Value
  2103.                 Me.Range("机加工费").Cells(changedCell.row, 1).NumberFormat = "0"
  2104.                 Me.Range("机加工费").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2105.                
  2106.             End If
  2107.             
  2108.             Me.Range("集成计算人工费的重量").Cells(changedCell.row, 1).Interior.Color = xlNone

  2109.         Next changedCell
  2110.     End If

  2111. '结束集成净重的算法
  2112.    
  2113.    
  2114.    
  2115. '          ' 当第一列名称包含汇总的行的I列发生变化有数值的时候,对应要求填写焊口单价,计算焊口人工费
  2116. '    If Not Intersect(Target, Me.Range("AA4:AA" & Me.Rows.Count)) Is Nothing Then
  2117. '        For Each changedCell In Intersect(Target, Me.Range("AA4:AA" & Me.Rows.Count))
  2118. '            If changedCell.Count = 1 And changedCell.row > 3 And InStr(LCase(Me.Range("序号").Cells(changedCell.row, 1).Value), "汇总") > 0 Then
  2119. '                ' 获取当前行的 I 列数值
  2120. '
  2121. '                If IsNumeric(Me.Cells(changedCell.row, 9).value) Then
  2122. '                    baseValue = Me.Cells(changedCell.row, 9).value
  2123. '                Else
  2124. '                    baseValue = 0
  2125. '                End If
  2126. '
  2127. '                ' 获取当前行的 J 列下拉列表值,并转换为数值
  2128. '
  2129. '                If IsNumeric(Replace(changedCell.value, "%", "")) Then
  2130. '                    discount = CDbl(Replace(changedCell.value, "%", "")) / 100
  2131. '                Else
  2132. '                    discount = 1 ' 默认为 100%
  2133. '                End If
  2134. '
  2135. '                ' 检查第27列是否为数值且大于0
  2136. '                If IsNumeric(Me.Cells(changedCell.row, 27).value) And Me.Cells(changedCell.row, 27).value > 0 Then
  2137. '                    ' 计算并设置当前行的 K 列价格
  2138. '                    Me.Cells(changedCell.row, 28).value = Me.Cells(changedCell.row, 9).value * Me.Cells(changedCell.row, 27).value
  2139. '                    Me.Cells(changedCell.row, 28).NumberFormat = "0" ' 设置价格格式
  2140. '                    Me.Cells(changedCell.row, 28).Interior.Color = RGB(0, 255, 0)
  2141. '                End If
  2142. '            End If
  2143. '
  2144. '            Me.Cells(changedCell.row, 27).Interior.Color = xlNone
  2145. '        Next changedCell
  2146. '    End If
  2147.    
  2148. If Not Intersect(Target, Me.Range("材料费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  2149.     For Each changedCell In Intersect(Target, Me.Range("材料费").Rows("4:" & Me.Rows.Count))
  2150.         If changedCell.Count = 1 And changedCell.row > 3 Then
  2151.             ' 检查是否是分项行(包含 ".")
  2152.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, ".") > 0 Then
  2153.                 ' 向上查找第一个不含 "." 的行
  2154.                 upperRow = changedCell.row
  2155.                 Do While upperRow > 1 And InStr(Me.Cells(upperRow, 1).Value, ".") > 0
  2156.                     upperRow = upperRow - 1
  2157.                 Loop

  2158.                 ' 向下查找第一个不含 "." 的行
  2159.                 lowerRow = changedCell.row
  2160.                 Do While lowerRow <= Me.Rows.Count And InStr(Me.Cells(lowerRow, 1).Value, ".") > 0
  2161.                     lowerRow = lowerRow + 1
  2162.                 Loop

  2163.                 ' 检查这之间的行的材料费单元格是否有数值且大于0
  2164.                 totalValue = 0
  2165.                 For checkRow = upperRow + 1 To lowerRow - 1
  2166.                     If IsNumeric(Me.Cells(checkRow, Me.Range("材料费").Column).Value) Then
  2167.                         cellValue = CDbl(Me.Cells(checkRow, Me.Range("材料费").Column).Value)
  2168.                         If cellValue > 0 Then
  2169.                             totalValue = totalValue + cellValue
  2170.                         End If
  2171.                     End If
  2172.                 Next checkRow

  2173.                 ' 如果总和大于0,将总和填写到汇总行的材料费单元格
  2174.                 If totalValue > 0 Then
  2175.                     Me.Cells(lowerRow, Me.Range("材料费").Column).Value = totalValue
  2176.                     Me.Cells(lowerRow, Me.Range("材料费").Column).Interior.Color = RGB(0, 255, 0)
  2177.                     Me.Cells(lowerRow, Me.Range("材料费").Column).NumberFormat = "0"
  2178.                 End If
  2179.             End If
  2180.             
  2181.             ' 检查是否是汇总行,将材料费汇总到生产成本
  2182.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  2183.                 ' 调用函数计算生产成本
  2184. '                Dim productionCost As Double
  2185.                 productionCost = calculate_production_cost(changedCell.row, Me)

  2186.                 ' 将总和填写到当前行的生产成本单元格
  2187.                 Me.Range("生产成本").Cells(changedCell.row, 1).Value = productionCost
  2188.                 Me.Range("生产成本").Cells(changedCell.row, 1).NumberFormat = "0"
  2189.                 Me.Range("生产成本").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2190.             End If
  2191.             
  2192.             
  2193.             
  2194.             
  2195.             
  2196.         End If
  2197.     Next changedCell
  2198. End If

  2199. '制作费变更,变更到生产成本
  2200. If Not Intersect(Target, Me.Range("制作费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  2201.     For Each changedCell In Intersect(Target, Me.Range("制作费").Rows("4:" & Me.Rows.Count))
  2202.         If changedCell.Count = 1 And changedCell.row > 3 Then
  2203.             ' 检查是否是汇总行,将制作费汇总到生产成本
  2204.             If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  2205.                 ' 调用函数计算生产成本
  2206.                
  2207.                 productionCost = calculate_production_cost(changedCell.row, Me)

  2208.                 ' 将总和填写到当前行的生产成本单元格
  2209.                 Me.Range("生产成本").Cells(changedCell.row, 1).Value = productionCost
  2210.                 Me.Range("生产成本").Cells(changedCell.row, 1).NumberFormat = "0"
  2211.                 Me.Range("生产成本").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2212.             End If
  2213.         End If
  2214.     Next changedCell
  2215. End If

  2216. '车间管理费变动时候,变更到车间成本
  2217. If Not Intersect(Target, Me.Range("车间管理费").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  2218.     For Each changedCell In Intersect(Target, Me.Range("车间管理费").Rows("4:" & Me.Rows.Count))
  2219.         ' 检查是否是汇总行
  2220.         If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  2221.             ' 初始化变量
  2222.             shopManagementCost = 0
  2223.             productionCost = 0
  2224.             totalShopCost = 0
  2225.             
  2226.             ' 检查车间管理费
  2227.             If IsNumeric(Me.Range("车间管理费").Cells(changedCell.row, 1).Value) Then
  2228.                 shopManagementCost = CDbl(Me.Range("车间管理费").Cells(changedCell.row, 1).Value)
  2229.             End If
  2230.             
  2231.             ' 检查生产成本
  2232.             If IsNumeric(Me.Range("生产成本").Cells(changedCell.row, 1).Value) Then
  2233.                 productionCost = CDbl(Me.Range("生产成本").Cells(changedCell.row, 1).Value)
  2234.             End If
  2235.             
  2236.             ' 检查是否两个单元格都非空且大于0
  2237.             If shopManagementCost > 0 And productionCost > 0 Then
  2238.                 ' 计算总和
  2239.                 totalShopCost = shopManagementCost + productionCost
  2240.                
  2241.                 ' 将总和填写到当前行的车间成本单元格
  2242.                 Me.Range("车间成本").Cells(changedCell.row, 1).Value = totalShopCost
  2243.                 Me.Range("车间成本").Cells(changedCell.row, 1).NumberFormat = "0"
  2244.                 Me.Range("车间成本").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2245.             End If
  2246.         End If
  2247.     Next changedCell
  2248. End If

  2249. If Not Intersect(Target, Me.Range("生产成本").Rows("4:" & Me.Rows.Count)) Is Nothing Then
  2250.     For Each changedCell In Intersect(Target, Me.Range("生产成本").Rows("4:" & Me.Rows.Count))
  2251.         ' 检查是否是汇总行
  2252.         If InStr(Me.Range("序号").Cells(changedCell.row, 1).Value, "汇总") > 0 Then
  2253.             ' 初始化变量
  2254.             shopManagementCost = 0
  2255.             productionCost = 0
  2256.             totalShopCost = 0
  2257.             
  2258.             ' 检查生产成本
  2259.             If IsNumeric(Me.Range("生产成本").Cells(changedCell.row, 1).Value) Then
  2260.                 shopManagementCost = CDbl(Me.Range("生产成本").Cells(changedCell.row, 1).Value)
  2261.             End If
  2262.             
  2263.             ' 检查生产成本
  2264.             If IsNumeric(Me.Range("生产成本").Cells(changedCell.row, 1).Value) Then
  2265.                 productionCost = CDbl(Me.Range("生产成本").Cells(changedCell.row, 1).Value)
  2266.             End If
  2267.             
  2268.             ' 检查是否两个单元格都非空且大于0
  2269.             If shopManagementCost > 0 And productionCost > 0 Then
  2270.                 ' 计算总和
  2271.                 totalShopCost = shopManagementCost + productionCost
  2272.                
  2273.                 ' 将总和填写到当前行的车间成本单元格
  2274.                 Me.Range("车间成本").Cells(changedCell.row, 1).Value = totalShopCost
  2275.                 Me.Range("车间成本").Cells(changedCell.row, 1).NumberFormat = "0"
  2276.                 Me.Range("车间成本").Cells(changedCell.row, 1).Interior.Color = RGB(0, 255, 0)
  2277.             End If
  2278.         End If
  2279.     Next changedCell
  2280. End If





  2281.    
  2282. End Sub




复制代码


这是一个excel的vba代码,感觉写的很乱了,我后面继续写点什么,excel操作下就报过程太大的错误,大神们帮看看怎么办,最好能简化下代码,写得清晰些,去掉不要的部分,加速运行速度,减小内存,但是不要搞太复杂呢。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
问题分析及解决方案

从代码结构来看,主要问题出在Worksheet_Change事件过程中代码过长导致"过程太大"错误。这是VBA对单个过程代码量的限制(约64KB)。以下是优化建议:

  • 将功能模块拆分成多个子过程
  • 使用Call调用各功能模块
  • 优化重复代码段
  • 减少事件过程中的直接处理逻辑


优化步骤:

1. 将主要功能拆分为独立子过程:


  1. ' 主事件处理程序
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     If IsDeleteOperation(Target) Then Exit Sub
  4.     If IsDeletionCausedChange() Then Exit Sub
  5.     If Not Application.EnableEvents Then Exit Sub
  6.    
  7.     Call HandleNameChange(Target)
  8.     Call HandleMaterialChange(Target)
  9.     Call HandleDimensionChange(Target)
  10.     Call HandleQuantityChange(Target)
  11.     ' 其他模块调用...
  12. End Sub

  13. ' 处理名称变更的子过程
  14. Private Sub HandleNameChange(ByVal Target As Range)
  15.     If Not Intersect(Target, Me.Range("名称").Rows("4:" & lastRow)) Is Nothing Then
  16.         ' 原有处理逻辑...
  17.     End If
  18. End Sub

  19. ' 处理材质变更的子过程
  20. Private Sub HandleMaterialChange(ByVal Target As Range)
  21.     If Not Intersect(Target, Me.Range("材质").Rows("4:" & lastRow)) Is Nothing Then
  22.         ' 原有处理逻辑...
  23.     End If
  24. End Sub
复制代码


2. 优化重复代码段(示例):


  1. ' 通用数据验证设置子过程
  2. Private Sub SetValidation(ByVal Target As Range, ByVal List As String)
  3.     With Target.Validation
  4.         .Delete
  5.         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
  6.              Operator:=xlBetween, Formula1:=List
  7.         .IgnoreBlank = True
  8.         .InCellDropdown = True
  9.     End With
  10. End Sub
复制代码


3. 优化对象引用:


  1. ' 使用With语句优化工作表引用
  2. Private Sub GetDB2Data()
  3.     With ThisWorkbook.Sheets("DB2材料及单价")
  4.         lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
  5.         ' 其他操作...
  6.     End With
  7. End Sub
复制代码


注意事项:
  • 将公共变量声明在模块顶部
  • 使用Application.EnableEvents = False避免事件循环触发
  • 复杂计算逻辑封装成独立函数
  • 使用错误处理避免意外中断


完整优化方案需要根据实际业务逻辑进一步拆分,建议按功能模块逐步重构。如果需要具体某个功能的优化示例,可以提供具体代码段我再给出针对性建议。

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

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
能直接优化下代码试试吗,找不到方向啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 07:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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