Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
123
返回列表 发新帖
楼主: guojiwbzm

[已解决]excel筛选问题,应该也牵涉到VBA吧,

  [复制链接]
 楼主| 发表于 2011-10-17 21:28 | 显示全部楼层
451907339@qq.com  问题是可不可以转换成VBA 的代码呢
回复

使用道具 举报

发表于 2011-10-17 21:55 | 显示全部楼层    本楼为最佳答案   
回复 guojiwbzm 的帖子

=(INDEX('1'!$2:$17,SMALL(IF(INDEX('1'!$2:$17,,IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,COLUMN()/2+1.5))<>"",ROW($2:$17)-1,9^5),ROW(A1)),IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,1)))
此公式是数组公式,要用三键结束的
一、先说红色部分IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,COLUMN()/2+1.5)
COLUMN(),返回当前的列号
MOD(COLUMN(),2)就是返回当前列的列号除以2的余数
IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,COLUMN()/2+1.5)这句的意思是:如是上述的余数是0,就返回当前列的列号除以2再加1,否则当前列的列号除以2再加1.5
此句段的目的是,可以从A列开始,取得2、2、3、3、4、4、5、5……这样的结果,以便下一步使用。
二、INDEX('1'!$2:$17,,IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,COLUMN()/2+1.5))
加上这里的绿色部分,用上了index(自己可以看该函数的帮助).就是说在工作表1的2行到17行中,取第n列的区域,(这里的n指第一步的结果,如果当前列是A或B列,那么这时n就是2……)
三、SMALL(IF(INDEX('1'!$2:$17,,IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,COLUMN()/2+1.5))<>"",ROW($2:$17)-1,9^5),ROW(A1))即加上了前后的粉色部分
如果在第二步的结果的列中不是空的(<>""),就返回2至17的行号再减1,否则返回9的5次方
再用small返回其中的第row(A1)个最小值。这里row(A1)是相对引用,当当前行在第一列是,就取第一个最小值,当当前行在第二列是,就取第二个最小值……
注意:这里的结果是行号
四、完整公式=(INDEX('1'!$2:$17,SMALL(IF(INDEX('1'!$2:$17,,IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,COLUMN()/2+1.5))<>"",ROW($2:$17)-1,9^5),ROW(A1)),IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,1)))
其中的IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,1)
前面第一步已说过
用index,取在工作表1的2行到17行中,第三步中的行、第IF(MOD(COLUMN(),2)=0,COLUMN()/2+1,1)列的交叉处的结果。
此组公式只需输入一次,可右拉、下拉。
回复

使用道具 举报

发表于 2011-10-17 22:00 | 显示全部楼层
如果用vba当然可以了,但是不是转换代码,要重新用vba做。可以用我的函数解法的思路,用vba做。
回复

使用道具 举报

 楼主| 发表于 2011-10-17 23:42 | 显示全部楼层
回复 的帖子

高老师,可以帮我写VBA 代码么。。我一起研究下。。会不会太贪心了。{:191:}
回复

使用道具 举报

发表于 2011-10-19 23:04 | 显示全部楼层
本帖最后由 高 于 2011-10-19 23:56 编辑

做完了
我不怎么会VBA,做得不好

工资单筛选44.rar

20.47 KB, 下载次数: 13

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 13:44 , Processed in 0.224220 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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