作者JieJuen (David)
看板Office
标题Re: [问题] 有可能在EXCEL里写出这样的程式吗?
时间Wed Nov 7 15:25:29 2007
1F:推 diskk:用VBA可以,但最好把来源栏数减为只有AB两栏 11/06 20:29
2F:→ kunjin1113:先建立全部公司的list放在A栏,再配合vlookup列出每季的 11/06 21:32
3F:→ kunjin1113:的data 11/06 21:35
的确,也许有更好的方式从根本上改进处理这个问题的方式
这里只是藉该问题推荐一个函数:IFERROR
这是一个2007才有的函数,用途是
如果公式计算错误,会传回指定的值;否则,会传回公式的结果。
语法
IFERROR(value,value_if_error)
看起来没什麽了不起,
但是当判断错误的式子不短的时候,就十分好用
像本题
A B C D E F
1 台塑 5% 台银 7%
2 鸿海 6% 台塑 9%
3 鸿准 3% 南亚 2%
4 中寿 2% 可成 8%
5 南亚 7% 联电 5%
不用IFERROR的话,E1的公式
{=IF(ISNA(MATCH(A1,C范围,0)),IF((ROW()>A最大列数)*(ROW()<=总列数),INDEX(C范围
,SMALL(IF(ISNA(MATCH(C范围,A范围,0)),ROW(C范围)),ROW()-A最大列数)),""),INDEX(
C范围,MATCH(A1,C范围,0)))}
要判断需要显示空白的范围
要判什麽时候用哪个部份的index
而且判断式又跟之後的内容重覆
已经尽力精简,写起来却还十分眼花了乱
(虽然不排除还有更精简的可能性~)
不小心还可能超过巢状函数层级限制...
{=IFERROR(INDEX(C范围,SMALL(IF(ISNA(MATCH(C范围,A范围,0)),ROW(C范围)),ROW()-A
最大列数)),)&IFERROR(INDEX(C范围,MATCH(A1,C范围,0)),)}
用IFERROR之後,反正错误值就传回空字串(或自订)
精简不少!
回到题目,F1就相对简单许多
=IF(E1="","",VLOOKUP(E1,OFFSET($C$1,,,C最大列数,2),2,FALSE))
结果:
A B C D E F
1 台塑 5% 台银 7% 台塑 9%
2 鸿海 6% 台塑 9%
3 鸿准 3% 南亚 2%
4 中寿 2% 可成 8%
5 南亚 7% 联电 5% 南亚 2%
台银 7%
可成 8%
联电 5%
因为不知道资料到底有多少
以上公式之定义中,资料的可能范围到65535(工作表名称:移)
A最大列数 =MAX((移!$A$1:$A$65535<>"")*ROW(移!$A$1:$A$65535))
A范围 =OFFSET(移!$A$1,,,A最大列数)
C最大列数 =MAX((移!$C$1:$C$65535<>"")*ROW(移!$C$1:$C$65535))
C范围 =OFFSET(移!$C$1,,,C最大列数)
重覆列数 =SUM(ISNUMBER(MATCH(C范围,A范围,0))*1)
总列数 =A最大列数+C最大列数-重覆列数
视需要可调整固定的部分($部分)与最大列数
2007版
http://kuso.cc/AutoShift2007 (9.35K)
2003版
http://kuso.cc/AutoShift2003 (18.5K)
※ 引述《sean508 (暹)》之铭言:
: (若是和其他不同软体互动之问题 请记得一并填写)
: 您所使用的软体为:
: EXCEL
: 版本:
: 2003或2007
: 问题:
: 因为最近有一个报告,而我们要比较各个基金每季的持股比例
: 因为资料数实在太庞大,如果一个一个做可能时间会不够
: 所以想看看有没有可能做到下面这样
: A B C D A B C D
: 1 台塑 5% 台银 7% 1 台塑 5% 台塑 9%
: 2 鸿海 6% 台塑 9% 2 鸿海 6%
: 3 鸿准 3% 南亚 2% ==================> 3 鸿准 3%
: 4 中寿 2% 可成 8% 4 中寿 2%
: 5 南亚 7% 联电 5% 5 南亚 7% 南亚 2%
: 6 6 台银 7%
: 7 可成 8%
: 8 联电 5%
: 也就是固定A B 让C D对照,不一样的则往下排列
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.123.36.226
※ 编辑: JieJuen 来自: 122.123.36.226 (11/07 15:57)
4F:推 sean508:真的很谢谢你~我会用了~ 11/07 22:56
5F:推 JieJuen:^^ 11/07 23:02