ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]从原始数据中读取N个数等于某一值?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-4-25 22:23 | 显示全部楼层 |阅读模式

Lbc0cTxA.rar (6.84 KB, 下载次数: 13)


要从附件中取出多个(任意相加组合)数,和等于 3733.80,请问如何处理?

谢谢了

TA的精华主题

TA的得分主题

发表于 2007-4-26 13:51 | 显示全部楼层

只做了两数相加的验证,两个数以上的任意组合很大比如附件的数共255记录,组合的可能是255X254X253Xn-1.....,一一验证,似乎要很长时间

不知道有没有快捷的算法,论坛里有组合的代码,也许对你有用,请搜索关键字“组合”

代码在Excel使用,如果是在Access使用可省略连接的语句

Sub AdoTs()

Dim Cnn 'As New ADODB.Connection
Dim Rst 'As New ADODB.Recordset
Dim Sql As String
Dim temArr, iArr
Dim i As Integer, j As Integer, k As Integer, x As Integer
Dim m As Single, n As Single

    Set Cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("Adodb.Recordset")
    '建立连接
    With Cnn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source =" & ThisWorkbook.Path & "\上网请教.mdb"
        .Open
    End With
    '查询小于等于3733.8的数据
    Sql = "SELECT 原始数据.交易金额 From 原始数据 WHERE 原始数据.交易金额 <= 3733.80 ORDER BY 原始数据.交易金额 DESC;"
    Rst.Open Sql, Cnn, adOpenKeyset, adLockOptimistic
    '查询结果赋值数组
    iArr = Rst.GetRows
    Rst.Close
    Cnn.Close
    Set Rst = Nothing
    Set Cnn = Nothing
   
    '转化为一维数组
    iArr = WorksheetFunction.Index(iArr, 0)
    i = UBound(iArr, 1)
    j = 1
    '查找两数相加等于3733.8的组合
    Do Until i - j = 1
        m = iArr(j)
        k = 0
        If m + iArr(i) > 3773.8 Then
            '过滤最大值+最小值大于3733.8的数
            iArr = VBA.Filter(iArr, m, False)
            i = UBound(iArr, 1)
            GoTo ATA
        End If
        Do Until i - k = 0
            n = iArr(i - k)
            If m + n > 3773.8 Then
                Exit Do
            ElseIf m + n = 3733.8 Then
                x = x + 1
                ReDim Preserve temArr(x)
                temArr(x) = m & "," & n
                iArr = VBA.Filter(iArr, m)
                iArr = VBA.Filter(iArr, n)
                i = UBound(iArr, 1)
                j = 0
                Exit Do
            Else
                k = k + 1
            End If
        Loop
ATA:
        j = j + 1
    Loop
    If x > 0 Then
        MsgBox "找到" & x & "记录"
    End If
End Sub

写完代码,在想想觉得循环验证是多余的,走了太远的路(写循环码写顺了,一遇问题先想如何循环,呵呵)

下面的一句就可以解决问题了,建一个新查询表,把这句贴上即可.

SELECT (aa.交易金额+bb.交易金额) AS 结果
FROM 原始数据 AS aa, 原始数据 AS bb
WHERE (((aa.交易金额)<>[bb].[交易金额]) AND (([aa].[交易金额]+[bb].[交易金额])=3733.8));

[此贴子已经被作者于2007-4-26 15:09:10编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 07:32 , Processed in 0.039425 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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