Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: fxb2015

[已解决]Excel VBA按多个条件删除行(求助高手)

[复制链接]
 楼主| 发表于 2015-12-30 14:56 | 显示全部楼层
本帖最后由 fxb2015 于 2015-12-30 15:03 编辑
grf1973 发表于 2015-12-30 14:47
用参数的形式调用了原代码。当nn=4时4个条件。

貌似对于附件中“物资HH”,单据编号0588XXXXX7050618还是不能与0588XXXXX7050615或0588XXXXX7050612中任意一个进行冲销,请详见本楼附件


有个设问:当4个key时,只要有两两相冲销的,那么这个正数从小到大就不仅仅是每一行的正数了,应该每一个关键字求和再进行从小到大进行排列。比如“物资HH”,以“单据名称+名称+计量单位+单价”为关键字,然后对单据号0588XXXXX7050618所有负数进行求和赋予给一个负数变量。对其余单号0588XXXXX7050615所有正数进行求和赋予一个正数变量,对其余单号0588XXXXX7050612所有正数进行求和赋予一个正数变量,然后对所有正数变量从小到大排列,所有负数变量从小到大排列,再用9楼代码的方式进行执行,可我不知道代码怎么写.....

材料统计(附加条件).rar

22.67 KB, 下载次数: 3

回复

使用道具 举报

发表于 2015-12-30 15:13 | 显示全部楼层
对的啊,按留下最少原则,留下4,8,12,12四行记录。如果 8,8,12,4,4 和-8,-8,-12,-4,-4抵冲,那么 还剩下5行   8,8,12,4,4。
代码的原理是这样的:HH负值为-36,正值为72(排序过后为4,4,4,4,8,8,8,8,12,12),先把所有负值删掉,开始对消正值:全部的4(4 个)删掉,剩下正值为(8,8,8,8,12,12),负值还剩下-36+16=-20;继续对消:对消8(3个,24),剩下正值为(8,12,12),由于第3个8抵消后还剩下4,所以结果为(4,8,12,12)
回复

使用道具 举报

 楼主| 发表于 2015-12-30 15:15 | 显示全部楼层
本帖最后由 fxb2015 于 2015-12-30 15:20 编辑
grf1973 发表于 2015-12-30 15:13
对的啊,按留下最少原则,留下4,8,12,12四行记录。如果 8,8,12,4,4 和-8,-8,-12,-4,-4抵冲,那么 ...

有个设问:当4个key时,只要有两两相冲销的,那么这个正数从小到大就不仅仅是每一行的正数了,应该每一个关键字求和再进行从小到大进行排列。比如“物资HH”,以“单据名称+名称+计量单位+单价”为关键字,然后对单据号0588XXXXX7050618所有负数进行求和赋予给一个负数变量。对其余单号0588XXXXX7050615所有正数进行求和赋予一个正数变量,对其余单号0588XXXXX7050612所有正数进行求和赋予一个正数变量,然后对所有正数变量从小到大排列,所有负数变量从小到大排列,再用9楼代码的方式进行执行,可我不知道代码怎么写.....

因为单据号0588XXXXX7050618所有负数进行求和的结果,与单据编号0588XXXXX7050615所有正数求和结果相加为零;也与单号0588XXXXX7050612所有正数求和结果相加为零。这种情况只要留下单据编号0588XXXXX7050615所有正数或只留下单据编号0588XXXXX7050612所有正数其中一个单据编号的所有正数即可
回复

使用道具 举报

发表于 2015-12-30 15:20 | 显示全部楼层
代码里有,好好研究。
负数变量:df(x) = df(x) + sl
负数变量对应的行(i是行数)  ddf(x) = ddf(x) & "," & i
负数变量对应的行转成数组:frr = Split(ddf(x), ",")
数组从大到小排序:
For i = 1 To UBound(frr) - 1        '负值数量从大到小排序
         For j = i + 1 To UBound(frr)
                        If arr(frr(i), 10) < arr(frr(j), 10) Then tmp = frr(i): frr(i) = frr(j): frr(j) = tmp
          Next
Next


看懂了吗?
回复

使用道具 举报

发表于 2015-12-30 15:28 | 显示全部楼层
刚才的参数调用达不到你单据号对冲效果的。只能做到在同一单据号里,同一物料之间的对冲。
回复

使用道具 举报

 楼主| 发表于 2015-12-30 15:28 | 显示全部楼层
grf1973 发表于 2015-12-30 15:28
刚才的参数调用达不到你单据号对冲效果的。只能做到在同一单据号里,同一物料之间的对冲。

那个变量怎么定义呢?对这种变量又怎么按大小排列呢?
以“单据名称+名称+计量单位+单价”为关键字,对每一个关键字的所有正数之和赋予一个正数变量,对每一个关键字的所有负数之和赋予一个负数变量,比如:物资HH,对单据号0588XXXXX7050618所有负数进行求和赋予给一个负数变量。对其余单号0588XXXXX7050615所有正数进行求和赋予一个正数变量,对其余单号0588XXXXX7050612所有正数进行求和赋予一个正数变量,然后对所有正数变量从小到大排列,所有负数变量从大到小排列.
回复

使用道具 举报

发表于 2015-12-30 15:29 | 显示全部楼层
要做到同一物料不同单据号之间优先抵消,感觉太复杂了。。。。。
回复

使用道具 举报

 楼主| 发表于 2015-12-30 15:47 | 显示全部楼层
本帖最后由 fxb2015 于 2015-12-30 16:01 编辑
grf1973 发表于 2015-12-30 15:29
要做到同一物料不同单据号之间优先抵消,感觉太复杂了。。。。。

grf1973老师,这样假设可以编写VBA代码不呢,假设如下:
第一步:以“单据编号+名称+计量单位+单价”为关键字,对每一个关键字进行求和,要是存在关键字之间的求和结果两两相加等于零的,就删掉这两个关键字所有数据,否则关键字保留。
第二步,就对第一步剩下保留的数据再以“名称+计量单位+单价”为关键字,执行9楼的代码。
这样,就做到了优先冲销单据编号的效果了。


只是第一步的代码不会编写
回复

使用道具 举报

 楼主| 发表于 2015-12-30 16:40 | 显示全部楼层
在线等...
回复

使用道具 举报

发表于 2015-12-30 16:48 | 显示全部楼层
这要用到字典的嵌套,我也不会写。。。。。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-8 04:52 , Processed in 0.327416 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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