Excel精英培训网

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

[已解决]如何批量提取工作薄中某个工作表中的固定行的不连续数据

[复制链接]
发表于 2014-4-17 11:35 | 显示全部楼层 |阅读模式
如题,如何批量提取工作薄中某个工作表中的固定行的不连续数据,工作薄的基本格式是一样的,只是需要提取内容的表3中的打印范围是不一样的,我想将一个文件夹中的若干个工作薄中的表3中的Q列中的数据提取出来,并且Q列中有合并的单元格存在,按照工作薄的名称顺序汇总到一张表上,不知道该如何编写代码,烦请各位帮忙!
不知道表达清楚了没有,现上传模拟件,希望大家帮我解决,再次感谢!
最佳答案
2014-4-17 13:11
  1. Sub Macro1()
  2. Dim wb As Workbook, mypath$, wj$, s&
  3. mypath = ThisWorkbook.Path & ""
  4. Application.ScreenUpdating = False
  5. wj = Dir(mypath & "*.xls")
  6. Do While wj <> ""
  7.     If wj <> ThisWorkbook.Name Then
  8.         s = s + 1
  9.         Cells(2, s) = wj
  10.         Set wb = GetObject(mypath & wj)
  11.         With wb.Sheets("3")
  12.             .Range("q10:q" & .Range("q29").End(xlUp).Row).Copy Cells(3, s)
  13.         End With
  14.         wb.Close 0
  15.     End If
  16.     wj = Dir
  17. Loop
  18. Application.ScreenUpdating = True
  19. End Sub
复制代码

1.rar

70.1 KB, 下载次数: 50

发表于 2014-4-17 13:11 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim wb As Workbook, mypath$, wj$, s&
  3. mypath = ThisWorkbook.Path & ""
  4. Application.ScreenUpdating = False
  5. wj = Dir(mypath & "*.xls")
  6. Do While wj <> ""
  7.     If wj <> ThisWorkbook.Name Then
  8.         s = s + 1
  9.         Cells(2, s) = wj
  10.         Set wb = GetObject(mypath & wj)
  11.         With wb.Sheets("3")
  12.             .Range("q10:q" & .Range("q29").End(xlUp).Row).Copy Cells(3, s)
  13.         End With
  14.         wb.Close 0
  15.     End If
  16.     wj = Dir
  17. Loop
  18. Application.ScreenUpdating = True
  19. End Sub
复制代码
回复

使用道具 举报

发表于 2014-4-17 13:13 | 显示全部楼层
打印每个工作簿表3第一页

1.zip

88.39 KB, 下载次数: 30

回复

使用道具 举报

 楼主| 发表于 2014-4-17 13:39 | 显示全部楼层
dsmch 发表于 2014-4-17 13:13
打印每个工作簿表3第一页

貌似是可行的,我再仔细看看,先谢过了
回复

使用道具 举报

 楼主| 发表于 2014-4-17 13:42 | 显示全部楼层
dsmch 发表于 2014-4-17 13:13
打印每个工作簿表3第一页

仔细看了看,可以提取打印区域内的第1张表的Q列的值,我再看看能不能加上打印区域内的其它的页面,非常感谢你的帮助
回复

使用道具 举报

 楼主| 发表于 2014-4-17 14:14 | 显示全部楼层
dsmch 发表于 2014-4-17 13:11

.Range("q10:q" & .Range("q29").End(xlUp).Row).Copy Cells(3, s)这句能不能给我解释下,我换成这样为什么得出的结果不对呢?
.[q10].Resize([q29].End(xlUp).Row).Copy Cells(3, s)
回复

使用道具 举报

 楼主| 发表于 2014-4-17 14:23 | 显示全部楼层
dsmch 发表于 2014-4-17 13:11

希望不要嫌弃我,我还想再问个问题,为什么我把提取范围改为几段之后,汇总表不能按几段的值汇总?汇总的时候它自动就汇总了最大区间的数值呢?
.Range("q10:q" & .Range("q29").End(xlUp).Row).Copy Cells(3, s)
            .Range("q41:q" & .Range("q60").End(xlUp).Row).Copy Cells(3, s)
            .Range("q72:q" & .Range("q91").End(xlUp).Row).Copy Cells(3, s)

我把提取范围分开后,提取的值都是q72:q91的值了,汇总表它不能按(Q10:Q29,Q41:Q60,Q72:Q91)的顺序依次将值提取到相应的行内了呢?
回复

使用道具 举报

 楼主| 发表于 2014-4-17 14:44 | 显示全部楼层
dsmch 发表于 2014-4-17 13:11

我看出问题在哪了,再次感谢!

回复

使用道具 举报

发表于 2014-4-18 08:44 | 显示全部楼层
这个代码可以直接取你想取的数,前提是你要提取数的工作薄中的表已经全部设置了打印区域。

Sub JL()

   
    Dim Arr, ArrJG()
    Dim PathName$, dirna
   
    Application.ScreenUpdating = False
    column1 = Range("IV2").End(xlToLeft).Column
    Range(Range("A2"), Cells(65536, column1)).ClearContents
     K = 1
    PathName = ThisWorkbook.Path & "\*.xls"
    dirna = Dir(PathName)
    Do While dirna <> ""
        If dirna <> ActiveWorkbook.Name Then
            Set App = Application
            Set SourceBook = App.Workbooks.Open(ThisWorkbook.Path & "\" & dirna, 0, True)
            Set Sourcesheet = SourceBook.Worksheets("3")
            h = Split(dirna, ".")(0)
            j = 0
            With Sourcesheet
                Arr = .Range("Q10:Q" & Split(.PageSetup.PrintArea, "$")(4))
            End With
            SourceBook.Close False
             For i = 1 To UBound(Arr)
                If Arr(i, 1) <> "" Then
                    j = j + 1
                    ReDim Preserve ArrJG(1 To j)
                    ArrJG(j) = Arr(i, 1)
                End If
             Next i
              Cells(2, K) = h
              Cells(3, K).Resize(j) = Application.Transpose(ArrJG)
              K = K + 1
              Erase Arr
            End If
        dirna = Dir
    Loop
   
    Application.ScreenUpdating = True

End Sub

表格.rar

48.17 KB, 下载次数: 20

回复

使用道具 举报

 楼主| 发表于 2014-4-18 10:03 | 显示全部楼层
过江龙 发表于 2014-4-18 08:44
这个代码可以直接取你想取的数,前提是你要提取数的工作薄中的表已经全部设置了打印区域。

Sub JL()

谢谢你的帮忙
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 00:30 , Processed in 0.695086 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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