ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2160|回复: 10

[求助] 零部件各层级总成至顶级零件重量VBA卷积(已知所有单件重量)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-6-24 09:23 | 显示全部楼层 |阅读模式
本帖最后由 kuangfengsj 于 2020-6-24 09:25 编辑

各位大神,求助,请问如何实现零部件各层级总成至顶级零件重量VBA卷积(已知所有单件重量),之前公式法象山海鲜版主已经给了,见链接http://club.excelhome.net/thread-1469729-2-1.html,然后在本论坛也见到了自定义函数的方法,只是代码及参数都比较长,不知道有没有VBA代码计算方式。

附件.png

卷积半成品至顶级的重量.7z

14.69 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2020-6-24 11:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 一把小刀闯天下 于 2020-6-24 12:20 编辑

'终于看明白了,汇总时还有考虑数量,,,

Option Explicit

Sub test()
  Dim arr, sum(99), i, j, p
  arr = [a1].CurrentRegion.Offset(1).Resize(, 8).Value
  ReDim brr(1 To UBound(arr, 1), 1 To 1)
  p = arr(UBound(arr, 1) - 1, 1)
    For i = UBound(arr, 1) - 1 To 1 Step -1
    If arr(i, 1) >= p Then
      brr(i, 1) = arr(i, 8)
    Else
      brr(i, 1) = arr(i, 3) * sum(p)
      For j = arr(i, 1) + 1 To p
        sum(j) = 0
      Next
    End If
    sum(arr(i, 1)) = sum(arr(i, 1)) + arr(i, 3) * brr(i, 1)
    p = arr(i, 1)
  Next
  [k2].Resize(UBound(brr, 1)) = brr
  MsgBox "总质量:" & brr(1, 1)
End Sub

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-24 15:30 | 显示全部楼层
一把小刀闯天下 发表于 2020-6-24 11:35
'终于看明白了,汇总时还有考虑数量,,,

Option Explicit

果然强大,试了下,可以了。不过好像层级至第十层的时候,第九层的总成就没有计算

TA的精华主题

TA的得分主题

发表于 2020-6-24 15:35 | 显示全部楼层
kuangfengsj 发表于 2020-6-24 15:30
果然强大,试了下,可以了。不过好像层级至第十层的时候,第九层的总成就没有计算

最多可以支持99级,完全够了

可以再上附件,估计回来的时候有跳级,比如10-->8,9会丢失,需要看你的结构,,,

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-24 15:42 | 显示全部楼层
一把小刀闯天下 发表于 2020-6-24 15:35
最多可以支持99级,完全够了

可以再上附件,估计回来的时候有跳级,比如10-->8,9会丢失,需要看你的 ...

这个比较深点的层级,应该是像您说的,跳级了,因为11级的可以

test.7z

23.01 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2020-6-24 15:49 | 显示全部楼层
kuangfengsj 发表于 2020-6-24 15:42
这个比较深点的层级,应该是像您说的,跳级了,因为11级的可以

你的层级是字符型的,够晕

在  ReDim brr(1 To UBound(arr, 1), 1 To 1) 下面插入下面3行:

-------------------

  For i = 1 To UBound(arr, 1) - 1
    arr(i, 1) = Val(arr(i, 1))
  Next

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-24 16:00 | 显示全部楼层
一把小刀闯天下 发表于 2020-6-24 15:49
你的层级是字符型的,够晕

在  ReDim brr(1 To UBound(arr, 1), 1 To 1) 下面插入下面3行:

这个因为好多BOM都是从PDM里导出的,所以基本都是加=号的

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-24 16:02 | 显示全部楼层
一把小刀闯天下 发表于 2020-6-24 15:49
你的层级是字符型的,够晕

在  ReDim brr(1 To UBound(arr, 1), 1 To 1) 下面插入下面3行:

OK了,谢谢,收假回来好好研究您的代码,学习下思路

TA的精华主题

TA的得分主题

发表于 2020-6-24 18:35 | 显示全部楼层
仅用一次单层循环搞定,不限层级。

Sub ggmmlol()
    Dim ar, r, br, cj, cjzllj#
    ar = Range("A1").CurrentRegion.Resize(, 8)
    r = UBound(ar)
    ReDim br(2 To r, 1 To 1)
    For i = r To 2 Step -1
        If ar(i, 1) = cj - 1 Then
            br(i, 1) = cjzllj
            cjzllj = 0
        Else
            br(i, 1) = ar(i, 8)
        End If
        cj = Val(ar(i, 1))
        cjzllj = cjzllj + Val(ar(i, 3)) * br(i, 1)
    Next
    Range("H2").Resize(r - 1) = br
End Sub

test.rar (30.81 KB, 下载次数: 8)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-29 09:09 | 显示全部楼层
ggmmlol 发表于 2020-6-24 18:35
仅用一次单层循环搞定,不限层级。

Sub ggmmlol()

谢谢,吸收下
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-28 15:17 , Processed in 0.040076 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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