Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5829|回复: 22

[习题] 【函数初级201203班】练习6---批量分月【已开贴】

[复制链接]
发表于 2012-12-14 11:00 | 显示全部楼层 |阅读模式
本帖最后由 無心 于 2013-1-24 09:31 编辑

这是我工作中碰到的一个问题,要求见附件 。
使用方法不限,函数,技巧,VBA都可以,但是要批量 完成,一种方法2个金币。
函数公式字符最少的,奖励10个金币,技巧步骤最少的,奖励10个金币,VBA速度最快的奖励10个金币。

本题截止日期12月20日。


练习.rar (5.58 KB, 下载次数: 258)
发表于 2012-12-14 11:26 | 显示全部楼层
先用MONTH得出月份,再分别用IF函数分得到姓名。能力有限,只能想到此方法。
回复

使用道具 举报

发表于 2012-12-14 11:34 | 显示全部楼层
回复

使用道具 举报

发表于 2012-12-14 11:44 | 显示全部楼层
  1. =INDEX($B:$B,SMALL(IF(($C$2:$C$71<=DATE(2012,COLUMN(A1)+1,))*($D$2:$D$71>DATE(2012,COLUMN(A1)+1,)),ROW($2:$71),999),ROW(A1)))&""
复制代码
减字符什么就不做了,能解决问题就好

评分

参与人数 1 +2 金币 +10 收起 理由
無心 + 2 + 10 赞一个!解决问题!!!

查看全部评分

回复

使用道具 举报

发表于 2012-12-14 13:11 | 显示全部楼层
【函数初级201203班】-F14 - manuel
=INDEX($B:$B,SMALL(IF(($C$2:$C$71<=EOMONTH(DATE(2012,COLUMN(A1),1),0))*($D$2:$D$71>EOMONTH(DATE(2012,COLUMN(A1),1),0)),ROW($B$2:$B$71),2^16),ROW(A1)))&""    数组公式 下拉
常规思路,应该是对的吧  。

评分

参与人数 1金币 +2 收起 理由
無心 + 2 赞一个!解决问题!

查看全部评分

回复

使用道具 举报

发表于 2012-12-14 13:18 | 显示全部楼层
本帖最后由 opqazxc 于 2012-12-14 17:56 编辑

我做了最多有38个不清楚正确不   下面多选一单元格
先选择H2:H40在H2输入下面公式接着组合键后再右拉

  1. <BLOCKQUOTE>=INDEX($B:$B,SMALL(IF(IF($D2:$D71="在职",1,$D2:$D71>(2012+INT(COLUMN(A2)/12)&"-"&MOD(COLUMN(B2)-1,12)+1&"-1")-1)*($C2:$C71<=(2012+INT(COLUMN(A2)/12)&"-"&MOD(COLUMN(B2)-1,12)+1&"-1")-1),ROW(2:71),99),ROW(1:70)))&""
复制代码

评分

参与人数 1 +1 收起 理由
無心 + 1 答案不准确,继续努力。

查看全部评分

回复

使用道具 举报

发表于 2012-12-14 13:31 | 显示全部楼层
呵呵.暂时想到的是一个使用辅助单元格的办法,办法不算太短.抛砖引玉吧.

练习.zip

31.76 KB, 下载次数: 2

评分

参与人数 1金币 +2 收起 理由
無心 + 2 赞一个!可以解决问题。

查看全部评分

回复

使用道具 举报

发表于 2012-12-14 13:36 | 显示全部楼层
本帖最后由 wangzan 于 2012-12-14 16:52 编辑

Public Sub 分类()
Dim arr, ye1 As Integer, ye2 As Integer, m1 As Integer, m2 As Integer, x As Integer, y As Integer, h As Integer, h1 As Integer
h = Range("A" & Rows.Count).End(3).Row
arr = Range("B1:D" & h)
For x = 2 To h
ye1 = Year(arr(x, 2))
m1 = Month(arr(x, 2))
If IsDate(arr(x, 3)) Then
ye2 = Year(arr(x, 3))
m2 = Month(arr(x, 3))
End If
If arr(x, 3) = "在职" Then
For y = m1 + 6 To 18
h1 = Cells(65536, y).End(3).Row
Cells(h1 + 1, y) = arr(x, 1)
Next
ElseIf ye2 = 2012 And ye1 = 2012  and m1<>m2 Then
For y = m1 + 6 To m2 -1 + 6
h1 = Cells(65536, y).End(3).Row
Cells(h1 + 1, y) = arr(x, 1)
Next
ElseIf ye2 = 2012 And ye1 < 2012 Then
For y = 7 To m2 + 6
h1 = Cells(65536, y).End(3).Row
Cells(h1 + 1, y) = arr(x, 1)
Next
End If
Next
End Sub
【函初201203班】-F16-wangzan
公式不会写

评分

参与人数 1 +1 收起 理由
無心 + 1 结果不准确,继续努力。

查看全部评分

回复

使用道具 举报

发表于 2012-12-14 13:58 | 显示全部楼层
有了答案 分享一下答案哪
回复

使用道具 举报

发表于 2012-12-14 15:19 | 显示全部楼层
哈哈, 这个我在做保险台账的时候也用到这样的思路,但此次估计得多加一步了。 先想想
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 17:05 , Processed in 0.316619 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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