ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 数值根据指定条件分解出需要的数值

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-2 08:16 | 显示全部楼层
hujianjian123 发表于 2020-2-1 21:26
老师您好  我的计算想法是这样的   把需要分解的数值优先分解成大的长度 ,其次是小长度 ,   另外 ...
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Address(0, 0) = "B1" Then
  3.         If Len(Target) > 0 Then
  4.             Z = Target
  5.             Set d = CreateObject("scripting.dictionary")
  6.             For j = 2 To 7
  7.                 For i = j + 1 To 7
  8.                     sm = Cells(2, i) + Cells(2, j)
  9.                     If Not d.exists(sm) Then
  10.                         Set d(sm) = Union(Cells(3, i), Cells(3, j))
  11.                     End If
  12.                 Next i
  13.             Next j
  14.             Application.EnableEvents = False
  15.             [b3:g3].Value = ""
  16.             For i = 2 To 6
  17.                 Z = Val(Z)
  18.                 If d.exists(Z) Then
  19.                     d(Z).Value = 1
  20.                     GoTo l1
  21.                 End If
  22.                 Cells(3, i) = Int(Z / Cells(2, i))
  23.                 Z = Z - Cells(3, i) * Cells(2, i)
  24.             Next i
  25.             If Z = 0 Then
  26.                 Cells(3, 7) = 0
  27.             Else
  28.                 x = Int(Z / Cells(2, 7))
  29.                 If Z = x * Cells(2, 7) Then
  30.                     Cells(3, 7) = x
  31.                 Else
  32.                     Cells(3, 7) = x + 1
  33.                 End If
  34.             End If
  35. l1:
  36.             Application.EnableEvents = True
  37.         End If
  38.     End If
  39. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-2-2 08:16 | 显示全部楼层
做了修改,供参考。。。。。。

000000.zip

12.77 KB, 下载次数: 3

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-2 17:44 | 显示全部楼层
liulang0808 发表于 2020-2-2 08:16
做了修改,供参考。。。。。。

谢谢老师   老师辛苦了
       昨天晚上有位朋友帮我i写好了VBA ,我在表2里面把计算规则罗列了一部分,朋友根据计算规则写的vba,但是他帮我写成了按钮执行方式,算法是满足要求了,但是执行起来不方便,老师您帮忙看下,能否把按钮去掉,谢谢!

000000.rar

22.91 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2020-2-2 19:21 | 显示全部楼层
hujianjian123 发表于 2020-2-2 17:44
谢谢老师   老师辛苦了
       昨天晚上有位朋友帮我i写好了VBA ,我在表2里面把计算规则罗列了一部分, ...

看到这个,才真明白楼主要解决什么问题
不是通过代码直接处理
而是根据第二张表里列出来的结果进行设置?
  1. Private Sub CommandButton1_Click()
  2.     Dim i&, i1&, i2&
  3.     Set dic = CreateObject("scripting.dictionary")
  4.     Set dic1 = CreateObject("scripting.dictionary")
  5.     i = 2
  6.     Do
  7.         If Len(Trim(Sheets("sheet1").Cells(2, i))) = 0 Then Exit Do
  8.         Sheets("sheet1").Cells(3, i) = ""
  9.         If Not dic.exists(CDbl(Sheets("sheet1").Cells(2, i))) Then
  10.             dic.Add CDbl(Sheets("sheet1").Cells(2, i)), i
  11.         End If
  12.         i = i + 1
  13.     Loop
  14.     i = 1
  15.     Do
  16.         If Len(Trim(Sheets("sheet2").Cells(i, 1))) = 0 Then Exit Do
  17.         If Sheets("sheet2").Cells(i, 1) = Sheets("sheet1").Cells(1, 2) Then
  18.             mbsz = Split(Sheets("sheet2").Cells(i, 2), "+")
  19.             For i1 = 0 To UBound(mbsz)
  20.                 If dic.exists(CDbl(mbsz(i1))) Then
  21.                     i3 = dic(CDbl(mbsz(i1)))
  22.                     Sheets("sheet1").Cells(3, i3) = Sheets("sheet1").Cells(3, i3) + 1
  23.                 End If
  24.             Next
  25.             Exit Do
  26.         End If
  27.         i = i + 1
  28.     Loop
  29. End Sub



  30. Private Sub Worksheet_Change(ByVal Target As Range)
  31.     If Target.Address(0, 0) = "B1" Then
  32.         If Len(Target) > 0 Then Call CommandButton1_Click
  33.     End If
  34. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-2-2 19:23 | 显示全部楼层
按照楼主的意图,启用事件调用你朋友的代码
看看是否合适吧

000000.zip

24.07 KB, 下载次数: 9

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-3 11:25 | 显示全部楼层
liulang0808 发表于 2020-2-2 19:23
按照楼主的意图,启用事件调用你朋友的代码
看看是否合适吧

谢谢老师  老师辛苦了 ,就是这个意思,阿泰谢谢了

TA的精华主题

TA的得分主题

发表于 2020-2-3 15:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-3 16:54 | 显示全部楼层
本帖最后由 lsdongjh 于 2020-2-3 17:05 编辑

递归解法,
  1. Option Explicit

  2. Dim arrResult As Variant

  3. Sub Test()
  4.     Dim arr As Variant, brr As Variant
  5.     Dim dblVal As Double, dblOld As Double, blGet As Boolean
  6.     arr = Sheet1.Range("B2:G2")
  7.     ReDim brr(1 To 1, 1 To 6) As Long
  8.     dblVal = Round(Sheet1.Range("B1").Value, 1)
  9.    
  10.     blGet = GetNum(arr, dblVal, brr, 1)
  11.    
  12.     If blGet Then
  13.         MsgBox "找到最佳解法!"
  14.     Else
  15.         MsgBox "没有最佳解法,即将尝试进行接近值的解法!"
  16.    
  17.         Do While blGet = False
  18.             dblVal = dblVal + 0.1
  19.             ReDim brr(1 To 1, 1 To 6) As Long
  20.             blGet = GetNum(arr, dblVal, brr, 1)
  21.         Loop
  22.         
  23.         MsgBox "找到最接近的解法!"
  24.     End If
  25.         
  26.     Sheet1.Range("B3").Resize(1, 6) = arrResult
  27. End Sub


  28. Function GetNum(arr As Variant, dblSum As Double, brr As Variant, lngColID As Long) As Boolean
  29.     Dim dblTemp As Double, arrTemp As Variant
  30.     Dim blOK As Boolean, lngID As Long
  31.    
  32.     arrTemp = brr
  33.     arrTemp(1, lngColID) = arrTemp(1, lngColID) + 1
  34.    
  35.     dblTemp = Application.WorksheetFunction.SumProduct(arr, arrTemp)
  36.    
  37.     If dblTemp = dblSum Then
  38.         arrResult = arrTemp
  39.         GetNum = True
  40.         Exit Function
  41.     ElseIf dblTemp > dblSum Then
  42.         arrTemp(1, lngColID) = arrTemp(1, lngColID) - 1
  43.         lngColID = lngColID + 1
  44.         If lngColID > UBound(arrTemp, 2) Then
  45.             lngColID = 0
  46.             For lngID = UBound(arrTemp, 2) - 1 To 1 Step -1
  47.                 If arrTemp(1, lngID) > 0 Then
  48.                     arrTemp(1, lngID) = arrTemp(1, lngID) - 1
  49.                     lngColID = lngID + 1
  50.                     Exit For
  51.                 End If
  52.             Next
  53.             If lngColID = 0 Then
  54.                 GetNum = False
  55.                 Exit Function
  56.             End If
  57.         End If
  58.     End If
  59.    
  60.     blOK = blOK Or GetNum(arr, dblSum, arrTemp, lngColID)
  61.    
  62.     GetNum = blOK
  63. End Function
复制代码


TA的精华主题

TA的得分主题

发表于 2020-2-3 18:48 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-5 19:55 | 显示全部楼层

老师您好 ,您这段代码也完全满足计算要求,但是需要按钮来执行呀,还请老师帮忙去掉代码.谢谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-24 18:07 , Processed in 0.047669 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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