Excel精英培训网

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

[已解决]跨表条件显示值-请看附件-在线等

[复制链接]
发表于 2014-3-4 11:03 | 显示全部楼层 |阅读模式
详情看附件,先谢谢了,实际数据量有点大,稍微考虑一下运行速度。谢谢了

跨表条件取值.rar (7.56 KB, 下载次数: 21)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-3-4 11:27 | 显示全部楼层
B7单元格复制以下公式,三键回车( 先按住 shift、ctrl 两个键,然后敲enter键 )、下拉。
=INDEX(Sheet1!C$1:C$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),ROW(A$5:A$16)),ROW(A1)))&INDEX(Sheet1!D$1:D$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),ROW(A$5:A$16)),ROW(A1)))&INDEX(Sheet1!E$1:E$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),ROW(A$5:A$16)),ROW(A1)))
回复

使用道具 举报

 楼主| 发表于 2014-3-4 11:34 | 显示全部楼层
baksy 发表于 2014-3-4 11:27
B7单元格复制以下公式,三键回车( 先按住 shift、ctrl 两个键,然后敲enter键 )、下拉。
=INDEX(Sheet1!C$ ...

先谢谢,已经达到要求,但如果下拉超过统计数字后,会显示错误符号。
能否利用vba?
回复

使用道具 举报

发表于 2014-3-4 11:39 | 显示全部楼层
likeblue 发表于 2014-3-4 11:34
先谢谢,已经达到要求,但如果下拉超过统计数字后,会显示错误符号。
能否利用vba?

追加判断
=IFERROR(INDEX(Sheet1!C$1:C$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),ROW(A$5:A$16)),ROW(A1)))&INDEX(Sheet1!D$1:D$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),ROW(A$5:A$16)),ROW(A1)))&INDEX(Sheet1!E$1:E$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),ROW(A$5:A$16)),ROW(A1))),"")

评分

参与人数 1 +1 收起 理由
likeblue + 1 不好意思,你的答案也是对的,谢谢了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-3-4 11:42 | 显示全部楼层
baksy 发表于 2014-3-4 11:39
追加判断
=IFERROR(INDEX(Sheet1!C$1:C$16,SMALL(IF(((Sheet1!A$5:A$16=B$3)+(Sheet1!B$5:B$16=B$3)),RO ...

再次谢谢,你的答案符合要求,但我想要用VBA。
回复

使用道具 举报

发表于 2014-3-4 11:44 | 显示全部楼层

  1. Sub test()
  2.   Dim arr(), i&, j%, k%, re(), cnt&, rq
  3.   arr = Sheets("Sheet1").Range("A4").CurrentRegion.Value
  4.   ReDim re(1 To UBound(arr) * 6, 1 To 1)
  5.   rq = Sheets("sheet2").[b3].Value
  6.   For i = 1 To UBound(arr)
  7.     For j = 1 To 2
  8.       If arr(i, j) = rq Then
  9.         For k = 3 To 5
  10.           If arr(i, k) <> "" Then
  11.             cnt = cnt + 1
  12.             re(cnt, 1) = arr(i, k)
  13.           End If
  14.         Next
  15.       End If
  16.     Next
  17.   Next
  18.   Dim rng As Range
  19.   Set rng = Sheets("sheet2").[b6]
  20.   rng = "类别"
  21.   rng.Offset(1, 0).Resize(cnt, 1) = re
  22. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-3-4 11:53 | 显示全部楼层
xdragon 发表于 2014-3-4 11:44

能否来些注释,我不是想直接用,我是想学。
回复

使用道具 举报

发表于 2014-3-4 12:09 | 显示全部楼层    本楼为最佳答案   
likeblue 发表于 2014-3-4 11:53
能否来些注释,我不是想直接用,我是想学。

  1. Sub test()

  2.   Dim arr(), i&, j%, k%, re(), cnt&, rq
  3. 'Sheet1的A4单元格数据区域赋值给数组arr
  4.   arr = Sheets("Sheet1").Range("A4").CurrentRegion.Value
  5. '定义re数组的区域为 arr上标*6(考虑最多的可能是全部日期全部对上的可能)
  6.   ReDim re(1 To UBound(arr) * 6, 1 To 1)
  7. '将sheet2的B3单元格值赋给rq变量,避免反复读取单元格的值
  8.   rq = Sheets("sheet2").[b3].Value
  9. '从数组第一行开始循环
  10.   For i = 1 To UBound(arr)
  11. '检查数组的第一列和第二列是否和rq一致
  12.     For j = 1 To 2

  13.       If arr(i, j) = rq Then
  14. '如果一致则将后三列中非空单元格放入数组re,同时计数变量递增1
  15.         For k = 3 To 5

  16.           If arr(i, k) <> "" Then

  17.             cnt = cnt + 1

  18.             re(cnt, 1) = arr(i, k)

  19.           End If

  20.         Next

  21.       End If

  22.     Next

  23.   Next

  24.   Dim rng As Range

  25.   Set rng = Sheets("sheet2").[b6]
  26. '列标题
  27.   rng = "类别"
  28. '将数组填入单元格区域
  29.   rng.Offset(1, 0).Resize(cnt, 1) = re

  30. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-3-4 14:13 | 显示全部楼层
xdragon 发表于 2014-3-4 12:09

非常感谢~~~~
回复

使用道具 举报

 楼主| 发表于 2014-3-4 16:20 | 显示全部楼层
xdragon 发表于 2014-3-4 12:09

好像有一些问题。然后我稍微修改了一下基础数据,麻烦在看一下


跨表条件取值2.rar (15.63 KB, 下载次数: 12)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 18:11 , Processed in 0.735960 second(s), 18 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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