ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]组合求和问题请教彭希仁版主

[复制链接]

TA的精华主题

TA的得分主题

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

Public jj As Long, mx, mi, arr, arr3, n As Long

Sub peng()
    arr = Cells(1, 1).Resize([a65536].End(xlUp).Row, 1)                       'm
    n = [b1]        'n
    jj = 0
    mx = 4190            '最大值
    mi = 4150            ,最小值
    If n < 1 Then Exit Sub
    ReDim arr3(1 To 65536, 1 To n)
    ReDim arr2(1 To n + 1) As Long
    Call xi(1, j,x, arr2)
   Cells(1, 5).Resize(65536, n) = arr3
End Sub

Sub xi(i,j, x, arr2)
    If jj > 60000 Then Exit Sub
    If j = n + 1 Then Exit Sub
    If j > 1 And x > mi And x < mx Then
        jj = jj + 1
        For i = 1 To j
            arr3(jj, i) = arr2(i)
        Next i
        Exit Sub
    End If
if i+1>ubound(arr) then exit sub
        If x + arr(i, 1) < mx Then
            arr2(j + 1) = arr(i, 1)
            xi i+1,j, x, arr2
        End If

        If x + arr(i, 1) < mx Then
            arr2(j + 1) = arr(i, 1)
            xi i+1,j + 1, x + arr(i, 1), arr2
        End If
End Sub

改了改,没有试不知是否有效

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-8 14:24 | 显示全部楼层

数据丢掉了一部分

谢谢彭老师,您辛苦了!

您修改后的代码我试用了一下,结果是重复的问题没有了,比较理想。

但是又发现了一个新问题:即组合结果不完整,丢掉了一部分数据。在同一条件下我用您的“排列组合之最优算法”和这次修改后的代码进行组合计算,计算结果后者比前者少了200多组数据,不知是什么原因?现将计算结果发来给您看看(见附件)。

我想,如果能够将“排列组合之最优算法”和您这次的“条件组合求和”代码结合在一块使用是最理想的了!

谢谢您!

d2Yr7dzL.rar (6.74 KB, 下载次数: 8)

TA的精华主题

TA的得分主题

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

Public jj As Long, mx, mi, arr, arr3, n As Long

Sub peng()
    arr = Cells(1, 1).Resize([a65536].End(xlUp).Row, 1)                       'm
    n = [b1]        'n
    jj = 0
    mx = 4190            '最大值
    mi = 4150            ,最小值
    If n < 1 Then Exit Sub
    ReDim arr3(1 To 65536, 1 To n)
    ReDim arr2(1 To n + 1) As Long
    Call xi(1, j,x, arr2)
   Cells(1, 5).Resize(65536, n) = arr3
End Sub

Sub xi(i,j, x, arr2)
    If jj > 60000 Then Exit Sub
    If j = n + 1 Then Exit Sub
    If j > 1 And x > mi And x < mx Then
        jj = jj + 1
        For i = 1 To j
            arr3(jj, i) = arr2(i)
        Next i
      '  Exit Sub     有可能是引起的
    End If
if i+1>ubound(arr) then exit sub
        If x + arr(i, 1) < mx Then
            arr2(j + 1) = arr(i, 1)
            xi i+1,j, x, arr2
        End If

        If x + arr(i, 1) < mx Then
            arr2(j + 1) = arr(i, 1)
            xi i+1,j + 1, x + arr(i, 1), arr2
        End If
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-8 17:04 | 显示全部楼层

运行时错误

谢谢彭老师!

我运行上述代码时提示:运行时错误‘28’  溢出堆栈空间

然后光标停在“宏XI”的第12句:
xi i + 1, j, x, arr2 

不知什么原因?

TA的精华主题

TA的得分主题

发表于 2008-7-8 17:41 | 显示全部楼层

Public jj As Long, mx, mi, arr, arr3, n As Long

Sub peng()
    arr = Cells(1, 1).Resize([a65536].End(xlUp).Row, 1)                       'm
    n = [b1]        'n
    jj = 0
    mx = 4190         '最大值
    mi = 4150         '最小值
    If n < 1 Then Exit Sub
    ReDim arr3(1 To 65536, 1 To n)
    ReDim arr2(1 To n + 1) As Long
    Call xi(1, j, x, arr2)
    Cells(1, 5).Resize(65536, n) = arr3
End Sub

Sub xi(ii, j, x, arr2)
    If jj > 60000 Then Exit Sub
    If j = n + 1 Then Exit Sub
    If j > 1 And x > mi And x < mx Then
        jj = jj + 1
        For i = 1 To j
            arr3(jj, i) = arr2(i)
        Next i
        Exit Sub     '有可能是引起的
    End If
    If ii + 1 > UBound(arr) Then Exit Sub
   
   
    If x + arr(ii, 1) < mx Then
        arr2(j + 1) = arr(ii, 1)
        xi ii + 1, j, x, arr2
    End If
    If x + arr(ii, 1) < mx Then
        arr2(j + 1) = arr(ii, 1)
        xi ii + 1, j + 1, x + arr(ii, 1), arr2
    End If
End Sub

不好意思,我之过也,没有试一下就发给你了,中间变量用重了,所以导致了这个问题,已解决

[此贴子已经被作者于2008-7-8 17:50:45编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-8 22:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

还是有部分数据被丢掉了

谢谢彭老师,您辛苦了!

您的代码我认真的试用了,“重复”和“出错提示”都已解决!

我真的非常喜欢您这段代码,因为它的运行效率很高,一次运行可完成几方面的工作。

但是在运行中还是存在丢掉数据的问题,现将丢掉数据的一个具体例子给您发来(见附件),请您看看有没有办法解决。真是麻烦您了。如果太难的话就算了。

                       我只能说谢谢您!!

j73tfLGU.rar (12.36 KB, 下载次数: 46)

TA的精华主题

TA的得分主题

发表于 2008-7-9 08:13 | 显示全部楼层

Public jj As Long, mx, mi, arr, arr3, n As Long

Sub peng()
    arr = Cells(1, 1).Resize([a65536].End(xlUp).Row, 1)                       'm
    n = [b1]        'n
    jj = 0
    mx = 49      '最大值
    mi = 30     '最小值
    If n < 1 Then Exit Sub
    ReDim arr3(1 To 65536, 1 To n)
    ReDim arr2(1 To n + 1) As Long
    Call xi(1, j, x, arr2)
    Cells(1, 12).Resize(65536, n) = arr3
    宏合计
End Sub

Sub xi(ii, j, x, arr2)
    If jj > 60000 Then Exit Sub
    If j = n + 1 Then Exit Sub
    If j > 1 And x > mi And x < mx Then
        jj = jj + 1
        For I = 1 To j
            arr3(jj, I) = arr2(I)
        Next I
    End If
    If ii > UBound(arr) Then Exit Sub
   
   
    If x + arr(ii, 1) < mx Then
        xi ii + 1, j, x, arr2
    End If
    If x + arr(ii, 1) < mx Then
        arr2(j + 1) = arr(ii, 1)
        xi ii + 1, j + 1, x + arr(ii, 1), arr2
    End If
End Sub

TA的精华主题

TA的得分主题

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

Sub xi(ii, j, x, arr2)
    If jj > 60000 Then Exit Sub
    If j = n + 1 Then Exit Sub
    If j > 1 And x > mi And x < mx Then
        jj = jj + 1
        For I = 1 To j
            arr3(jj, I) = arr2(I)
        Next I
    End If
    If ii > UBound(arr) Then Exit Sub
   
   
    If x + arr(ii, 1) < mx Then
        xi ii + 1, j, x, arr2
    End If
    If x + arr(ii, 1) < mx Then
        arr2(j + 1) = arr(ii, 1)
        xi ii + 1, j + 1, x + arr(ii, 1), arr2
    End If
End Sub

此段程序能详细讲解注释一下吗?谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-7-9 11:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢彭老师不厌其烦的指教!

我正在试用学习

TA的精华主题

TA的得分主题

发表于 2009-11-3 11:57 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-5 10:33 , Processed in 0.032870 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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