ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 求一个递归算法并分享一个MRP源代码!见本贴9楼

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-7 23:02 | 显示全部楼层
这个论坛现在太冷清了。到时候我的附档下载数仍为0呀。什么情况呀。

没有病毒的呀。

TA的精华主题

TA的得分主题

发表于 2015-12-8 00:37 | 显示全部楼层
5那个地方的判断跟你的不一致
  1. Public objDic As Object
  2. Public Arr
  3. Sub Test_LLc()
  4.     Set objDic = CreateObject("scripting.dictionary")
  5.     Arr = [a1].CurrentRegion
  6.     Dim Arr2(1 To 100)
  7.     For i = 2 To UBound(Arr)
  8.         getXnjData (i)
  9.         Arr2(i - 1) = getData(Xnj(Arr(i, 1)))
  10.     Next
  11.     [c2].Resize(UBound(Arr2), 1) = Application.Transpose(Arr2)
  12. End Sub

  13. Function Xnj(intIndex)    'intindex变量存放层次的值
  14.     If intIndex = 1 Then    '如果为最高的层次1,则可确定只存在两种状态,要么为Y,要么为X
  15.         If objDic(1) <> "X" Then
  16.             Xnj = "Y"
  17.         Else
  18.             Xnj = "X"
  19.         End If
  20.         Exit Function
  21.     End If
  22.     If intIndex > 1 Then    '如果intindex>1则判断其本身以及其上一个层次,两个即可得出
  23.         If objDic(intIndex) = "X" Then
  24.             Xnj = "X"
  25.         Else
  26.             If objDic(intIndex - 1) = "X" Then
  27.                 Xnj = "Y"
  28.             Else
  29.                 Xnj = ""
  30.             End If
  31.         End If
  32.     End If
  33. End Function
  34. Sub getXnjData(i%)    '如果当前层次为5,则从其上寻找距离最近的第一个层次为4、3、2、1的来源码
  35.     objDic.RemoveAll    '清空字典
  36.     Dim intLevel%
  37.     intLevel = Arr(i, 1)    '取出当前的层次
  38.     For j = i To 1 Step -1    '循环取出比当前层次更小的层次
  39.         If Arr(j, 1) <= intLevel And Not objDic.exists(Arr(j, 1)) Then
  40.             objDic(Arr(j, 1)) = Arr(j, 2)
  41.         End If
  42.     Next
  43. End Sub
  44. Function getData(strData$)
  45. If strData = "Y" Then getData = "Y"
  46. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2015-12-8 15:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
第二次修改稿
  1. Public Arr
  2. Sub Test_LLc()
  3. Dim i%
  4.     Set objDic = CreateObject("scripting.dictionary")
  5.     Arr = [a1].CurrentRegion
  6.     ReDim Arr2(1 To UBound(Arr))
  7.     For i = 2 To UBound(Arr)
  8.         Arr2(i - 1) = getData(Xnj(i, Arr(i, 1)))
  9.     Next
  10.     [c2].Resize(UBound(Arr2), 1) = Application.Transpose(Arr2)
  11. End Sub

  12. Function Xnj(ByVal intIndex%, ByVal intLevel%)  'intIndex数组中的索引值,初始值,intlevel当前的层次
  13.     Dim intCurrentLevel% '当前层次在数组中的索引值,与原始值相区别
  14.     For j = intIndex To 1 Step -1    '取出当前层次
  15.         If Arr(j, 1) = intLevel Then
  16.             intCurrentIndex = j
  17.             Exit For
  18.         End If
  19.     Next
  20.     If intLevel = 1 Then    '本身即为第一级
  21.         If Arr(intCurrentIndex, 2) <> "X" Then
  22.             Xnj = "Y"
  23.         Else
  24.             Xnj = "X"
  25.         End If
  26.         Exit Function
  27.     Else    '至少两级
  28.         If Arr(intCurrentIndex, 2) = "X" Then
  29.             Xnj = "X"
  30.         Else
  31.             If Xnj(intIndex, intLevel - 1) = "X" Then
  32.                 Xnj = "Y"
  33.             Else
  34.                 Xnj = ""
  35.             End If
  36.         End If
  37.     End If
  38. End Function

  39. Function getData(strData$)
  40.     If strData = "Y" Then getData = "Y"
  41. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-8 19:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub Test_LLc2()


  2. Dim i%, j%, k% '定义几个for循环用的变量
  3. Dim Lr% '定义本表格的行边界

  4. Dim Sh As Worksheet '定义工作
  5. Set Sh = Sheet4 '指定工作表


  6. Lr = Sh.Range("A65536").End(xlUp).Row '指定行边界行数

  7. Dim Arr '定义一个variant变量

  8. Dim LLC% '定义一个BOM层次码变量

  9. LLC = 1 '初始化为1


  10. 'Arr = sh.Range("A2:C" & Lr) '将指定区域赋给Arr

  11. i = 1
  12. '开始循环判断
  13. With Sh
  14. Do
  15.     i = i + 1
  16.     If .Cells(i, 4) = 1 Then
  17.         If .Cells(i, 11) <> "X" Then
  18.            .Cells(i, 12) = "Y"
  19.             Else
  20.             i = Dg(i, LLC + 1)
  21.             
  22.         End If
  23.     End If
  24. Loop Until i = Lr



  25. '.Cells(2, 1).Resize(UBound(Arr, 1), UBound(Arr, 2)) = Arr

  26. End With
  27. Set Sh = Nothing '结束


  28.   
  29. End Sub

  30. Function Dg(ByVal i_Row As Integer, ByVal S_Llc As Integer)

  31. Dim Sh As Worksheet
  32. Set Sh = Sheet4


  33. With Sh
  34.     Do
  35.         i_Row = i_Row + 1
  36.             If .Cells(i_Row, 4) = S_Llc Then
  37.                     If .Cells(i_Row, 11) <> "X" Then
  38.                             .Cells(i_Row, 12) = "Y"
  39.                             'Dg = i_Row
  40.                         Else
  41.                             i_Row = Dg(i_Row, S_Llc + 1)
  42.                     End If
  43.                  Else
  44.                     '
  45.                
  46.             End If
  47.      
  48.         
  49.     Loop Until .Cells(i_Row, 4) = S_Llc - 1
  50.    
  51. End With
  52.     Dg = i_Row - 1

  53. End Function

复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-8 19:10 | 显示全部楼层
以上乱写的。效果是达到了,但是好像感觉不好。没有老师写得好。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-8 19:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

还有一个小小的问题,就是他上面的有参加的人,这个组织下面的 不管是虚拟的还是实际的,都不会计入了。效果我的代码我运算了一下可以的。但是没有你的思路好。看能否再帮忙看看。谢谢!

TA的精华主题

TA的得分主题

发表于 2015-12-8 20:11 | 显示全部楼层
jygzcj 发表于 2015-12-8 19:19
还有一个小小的问题,就是他上面的有参加的人,这个组织下面的 不管是虚拟的还是实际的,都不会计入了。 ...

能否做个目录么,对应每个的主功能,以便对应学习下。谢谢分享

TA的精华主题

TA的得分主题

发表于 2015-12-8 20:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你后面的递归代码比我的简洁多了
我又写了个字典的,非递归
  1. Dim Arr, Arr2
  2.     Dim intLevel%, strState$
  3.     Dim objDic As Object
  4.     Set objDic = CreateObject("scripting.dictionary")
  5.     Arr = [a1].CurrentRegion
  6.     ReDim Arr2(1 To UBound(Arr))
  7.     For i = 2 To UBound(Arr)
  8.         intLevel = Arr(i, 1)
  9.         strState = Arr(i, 2)
  10.         If (intLevel = 1) Then    '层级为1时
  11.             objDic.RemoveAll    '清空字典并重建
  12.             If strState = "X" Then    '虚拟件
  13.                 Arr2(i) = "X"
  14.                 objDic(1) = "X"
  15.             Else
  16.                 Arr2(i) = "Y"
  17.                 objDic(1) = "Y"
  18.             End If
  19.         Else    '层级大于1时
  20.             If strState = "X" Then   '虚拟件
  21.                 Arr2(i) = "X"
  22.                 objDic(intLevel) = "X"
  23.             Else
  24.                 If objDic(intLevel - 1) = "X" Then    '如果本层级非虚拟,则判断上级是否为虚拟
  25.                     Arr2(i) = "Y"
  26.                     objDic(intLevel) = "Y"
  27.                 Else
  28.                     Arr2(i) = ""
  29.                     objDic(intLevel) = ""
  30.                 End If
  31.             End If
  32.         End If
  33.     Next
  34.     For i = 2 To UBound(Arr)
  35.     If Arr2(i) = "X" Then Arr2(i) = ""
  36.     Next
  37.     [c1].Resize(UBound(Arr), 1) = Application.Transpose(Arr2)
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-8 21:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
袁振涛 发表于 2015-12-8 20:33
你后面的递归代码比我的简洁多了
我又写了个字典的,非递归

虚拟料阶发料展BOM.rar (34.21 KB, 下载次数: 173)
test2.jpg
图示两行的不是我想要的,因为他的上阶3已经参加了,4是不是虚拟件无关紧要了。
不要重复发料。请帮再看一下。谢谢!
你的代码比较正规,我的是功能实现问题可能不少。

TA的精华主题

TA的得分主题

发表于 2015-12-8 21:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 袁振涛 于 2015-12-8 22:05 编辑

改了下
  1. Dim Arr, Arr2
  2.     Dim intLevel%, strState$
  3.     Dim objDic As Object
  4.     Set objDic = CreateObject("scripting.dictionary")
  5.     Arr = [a1].CurrentRegion
  6.     ReDim Arr2(1 To UBound(Arr))
  7.     Dim boolCheck As Boolean
  8.     boolCheck = False
  9.     For i = 2 To UBound(Arr)
  10.         intLevel = Arr(i, 1)
  11.         strState = Arr(i, 2)
  12.         If (intLevel = 1) Then    '层级为1时
  13.             objDic.RemoveAll    '清空字典并重建
  14.             If strState = "X" Then    '虚拟件
  15.                 Arr2(i) = "X"
  16.                 objDic(1) = "X"
  17.             Else
  18.                 Arr2(i) = "Y"
  19.                 objDic(1) = "Y"
  20.             End If
  21.         Else    '层级大于1时
  22.             If strState = "X" Then   '虚拟件
  23.                 Arr2(i) = "X"
  24.                 objDic(intLevel) = "X"
  25.             Else
  26.                 For j = 1 To intLevel - 1
  27.                     If objDic(j) <> "X" Then
  28.                         boolCheck = True
  29.                     End If
  30.                 Next
  31.                 If boolCheck = False Then   '如果本层级非虚拟,则判断上级是否为虚拟
  32.                     Arr2(i) = "Y"
  33.                     objDic(intLevel) = "Y"
  34.                 Else
  35.                     Arr2(i) = ""
  36.                     objDic(intLevel) = ""
  37.                 End If
  38.                 boolCheck = False
  39.             End If
  40.         End If
  41.     Next
  42.     For i = 2 To UBound(Arr)
  43.         If Arr2(i) = "X" Then Arr2(i) = ""
  44.     Next
  45.     [c1].Resize(UBound(Arr), 1) = Application.Transpose(Arr2)
复制代码

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-15 02:10 , Processed in 0.039632 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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