Excel精英培训网

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

[已解决]有难度的按条件取数

[复制链接]
发表于 2013-4-19 22:10 | 显示全部楼层 |阅读模式
要求和数据均在附件中,请高手不吝赐教!多谢了!
最佳答案
2013-4-20 01:33
咱做了个,你试试:

按条件取数.zip (19.7 KB, 下载次数: 31)

按条件取数.rar

9.74 KB, 下载次数: 18

附件

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-4-19 23:05 | 显示全部楼层
CV333        2013/3/1        3.6
CV333        2013/3/1        3.4

同一个物料,会出现同一个日期吗?如果会,怎么处理
回复

使用道具 举报

发表于 2013-4-20 01:33 | 显示全部楼层    本楼为最佳答案   
咱做了个,你试试:

按条件取数.zip (19.7 KB, 下载次数: 31)
回复

使用道具 举报

 楼主| 发表于 2013-4-20 08:24 | 显示全部楼层
爱疯 发表于 2013-4-19 23:05
CV333        2013/3/1        3.6
CV333        2013/3/1        3.4

早啊,爱疯老师,会出现在同一天的领料记录,但是不会出现同一时间段不同日期的领料记录,比如1-5日,所有的记录只会出现在1日 OR 2日,不会出现1日 AND 2日,如果有同一天的,数量相加
回复

使用道具 举报

 楼主| 发表于 2013-4-20 08:34 | 显示全部楼层
su45 发表于 2013-4-20 01:33
咱做了个,你试试:

早啊朋友,测试了下,A1805这个物料的领用记录没有取过来,不过已经挺好的了,能说说你的思路么?
我昨天自己想了一天都没有结果,最后弄了个原始的FOR……NEXT,速度慢到不行,所以想问问你思路。
回复

使用道具 举报

 楼主| 发表于 2013-4-20 09:05 | 显示全部楼层
su45 发表于 2013-4-20 01:33
咱做了个,你试试:

思路我看懂了,挺好的,就是后面的范围错了,导致A1805没取到,谢谢你,另外我想再请教下,我不要求数量合计只要求取到某天领用的第一次记录,比如我的物料DF001在3月8日第一次领用数量是6第二次领用数量是5,我只要求取到第一次领用的数。
回复

使用道具 举报

发表于 2013-4-20 09:33 | 显示全部楼层
Sub test()
'Dim d As New Dictionary, ar1(), ar2()
Dim ar1(), ar2()
Set d = CreateObject("scripting.dictionary")
With Sheets("明细表")
    r% = .[A65536].End(xlUp).Row
    ReDim ar2(1 To r, 1 To 13)
    ar1 = .[a2].Resize(r - 1, 3).Value
End With
For i% = 1 To UBound(ar1)
  If Not d.Exists(ar1(i, 1)) Then
     d(ar1(i, 1)) = d.Count + 1
     ar2(d(ar1(i, 1)), 1) = ar1(i, 1)
  End If
  r = Int((Day(ar1(i, 2)) - 1) / 5) * 2 + 2
  If r > 12 Then r = 12
  If ar2(d(ar1(i, 1)), r + 1) = 0 Then
  ar2(d(ar1(i, 1)), r) = ar1(i, 2)
  ar2(d(ar1(i, 1)), r + 1) = ar1(i, 3)
  End If
Next
Sheet1.[a19].Resize(d.Count, 13) = ar2
End Sub
回复

使用道具 举报

发表于 2013-4-20 11:40 | 显示全部楼层
  1. Sub test31()
  2.     Dim d As Object, A(), B(), i%, j%, s%, c%, n%

  3.     With Sheet2
  4.         Set d = CreateObject("scripting.dictionary")
  5.         A = .Range("A1").CurrentRegion.Value
  6.         n = 2
  7.         ReDim B(1 To UBound(A) - n, 1 To 13)
  8.     End With

  9.     s = n
  10.     For i = 2 To UBound(A)
  11.         c = (Day(A(i, 2)) + 4) \ 5
  12.         c = IIf(c > 6, 12, 2 * c)    '日期的列

  13.         If d.Exists(A(i, 1)) = False Then s = s + 1: d(A(i, 1)) = s
  14.         B(s - n, 1) = A(i, 1)
  15.         B(s - n, c) = A(i, 2)
  16.         B(s - n, c + 1) = A(i, 3)
  17.     Next i

  18.     With Sheet1
  19.         .Range("a3:m65536").ClearContents
  20.         .[a3].Resize(s, UBound(B, 2)) = B
  21.     End With
  22. End Sub
复制代码
按条件取数2.rar (9.86 KB, 下载次数: 8)
回复

使用道具 举报

发表于 2013-4-20 11:55 | 显示全部楼层
tianqixueyu 发表于 2013-4-20 09:05
思路我看懂了,挺好的,就是后面的范围错了,导致A1805没取到,谢谢你,另外我想再请教下,我不要求数量合 ...

用Range("A2:C28").SpecialCells(12).Rows(1)就可以找到第一行的数据
回复

使用道具 举报

 楼主| 发表于 2013-4-21 08:44 | 显示全部楼层
大家的答案都很好,爱疯老师和djyjysxxs朋友采用字典方法运行速度会快些,为了鼓励新人,我还是把最佳答案给su45 二位不要见怪,谢谢大家的回答!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 20:25 , Processed in 0.215681 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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