EXCEL跨工作表取满足条件的特定数据

内有30的sheet,名字已经重命名为汉字,如“98年”“99年”“00年”……,个工作表格式相同,要求,如何在新建的第31个sheet中,提取前面30个sheet中的数据,提却要求,判断每一个sheet中C5-C30与K5-K30两列中的非空单元格,然后将非空单元格前面的两个单元格与该非空单元格一并提取到sheet31中。例如:sheet1中,“C7=3”“K10=5”,则将A7,B7,C7放到新的sheet31中A1,B1,C1中,将I10,J10,K10放入sheet31中的A2,B2,C2,依次判断SHEET2-30.
在线等,回答符合追加50
如果C5-C30中有非空值,例如C7=10,C9=8,那么要提取的是C7,B7,A7,C9,B9,A7,如果为空,则不提取。不只但提取第一个,而是只要有非空的就提

几个问题:
1、你的表1~表30中的C5-C30与K5-K30两列中的非空单元格,数据是52个单元格。而返回于表31的A1~C1和A2~C2,其他数据返回到哪里呢?
如C7=3,则返回A7,B7,C7到表31的A1,B1,C1中
那C8非空、C9非空、……的,其之前的单元格B8、A8;B9、A9、……要返回到哪里呢?
同样K11非空、K12非空、……呢?
还是,只判断“C7”和“K10”?
2、表1的数据还没有确定地方返回,表2~表30的数据要返回到哪里去呢?
26*2*30=1560个单元格,里面还有之前4列(A、B、I、J)单元格。
这样就=26*6*30=4680个单元格,要怎么分布?
3、“如果为空,则不提取。不只但提取第一个”。只“提取”哪第一个?
能否说具体一点?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-09
按ALT+F11,打开VBA编辑器,菜单"插入"-模块",将以下宏代码复制到代码区,关闭VBA编辑器,转到你新建的第31个表,按ALT+F8,运行"提取数据"的宏.
有两个问题:
1,工作表名是从哪一年开始?,代码中从1980-2009,你自己修改,工作表名称必须是如“98年”“99年”“00年”形式,并且是连续的年份,否则会报错.
2,当C7和K7都非空时,提取的是A7,B7,C7,而不是I7,J7,K7

代码如下:

Sub 提取数据()
Dim n, m, i
i = 0
For n = 1980 To 2009 '年份,自己修改
With Sheets(Right(n, 2) & "年")
For m = 5 To 30
If .Cells(m, 3) <> "" Then '检查C列是否为非空
i = i + 1
Cells(i, 1) = .Cells(m, 1)
Cells(i, 2) = .Cells(m, 2)
Cells(i, 3) = .Cells(m, 3)
ElseIf .Cells(m, 11) <> "" Then '检查K列是否为非空
i = i + 1
Cells(i, 1) = .Cells(m, 9)
Cells(i, 2) = .Cells(m, 10)
Cells(i, 3) = .Cells(m, 11)
End If
Next
End With
Next
End Sub
第2个回答  2009-12-10
我这个VBA要求sheet31必须在最后一个工作表位置
导入的数据A列、B列、C列放在sheet31的A列、B列、C列,
导入的数据I列、J列、K列放在sheet31的I列、J列、K列,
如果有其它要求可以HI我一下
运行宏之前,先设置菜单[工具]-[宏]-[安全性]为“低”
ALT+F11,在左侧窗口右键,插入-模块
将以下代码粘贴在右边空白区域
然后运行宏
菜单[工具]-[宏]-[宏],找到对话框中的abc,点执行按钮
基本上可以符合你的要求了

Sub abc()
Application.ScreenUpdating = False
Sheets("sheet31").Activate
Sheets("sheet31").Cells = ""
a = Sheets.Count - 1
t = 1
With Sheets("sheet31")
For pp = 1 To a
For dd = 5 To 30
If Sheets(pp).Cells(dd, 3) <> "" Then
.Cells(t, 1) = Sheets(pp).Cells(dd, 1)
.Cells(t, 2) = Sheets(pp).Cells(dd, 2)
.Cells(t, 3) = Sheets(pp).Cells(dd, 3)
t = t + 1
End If
Next
Next
t = 1
For pp = 1 To a
For dd = 5 To 30
If Sheets(pp).Cells(dd, 11) <> "" Then
.Cells(t, 9) = Sheets(pp).Cells(dd, 9)
.Cells(t, 10) = Sheets(pp).Cells(dd, 10)
.Cells(t, 11) = Sheets(pp).Cells(dd, 11)
t = t + 1
End If
Next
Next
End With
Application.ScreenUpdating = True
End Sub
第3个回答  2009-12-08
给我1000分都没用,因为看不懂提问。
占位等待高手。
第4个回答  2009-12-08
你是想提第一个非空单元格前面数据,还是所有非空单元格前面都要?也就是说你的C5-C30中间如果有空值要不要提?