Excel精英培训网

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

[已解决]提取外部文档,我想修改两个地方

[复制链接]
发表于 2016-6-11 18:41 | 显示全部楼层 |阅读模式
老师:

上传的附件,能实现提取同路径的指定后缀的所有文档。

但是,我需要修改两个地方的错误,搞了一下午,都没有成功,详细的说明,请看附件。先谢谢了
求助.rar (30.85 KB, 下载次数: 16)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-6-11 19:40 | 显示全部楼层
把修改前的代码改一下:
  1. Sub 导入()
  2.     Dim MyPath, MyName, wk As Workbook, Sht As Worksheet, m As Integer, arr, n As Integer, u As Integer
  3. Application.ScreenUpdating = False
  4.        MyPath = ThisWorkbook.Path
  5.        MyName = Dir(MyPath & "" & "*.xls")
  6.    m = 0: n = 0 'MsgBox
  7.    Do While MyName <> ""
  8.       If MyName <> ThisWorkbook.Name Then
  9.          Set wk = Workbooks.Open(MyPath & "" & MyName)
  10.          m = m + 1 'MsgBox
  11.          For Each Sht In wk.Sheets
  12.              arr = Sht.UsedRange
  13.              If IsArray(arr) = False Then GoTo PP
  14.                 n = n + 1
  15.                 With ThisWorkbook.Sheets("数据源")
  16.                      u = .Cells(.Rows.Count, 1).End(xlUp).Row
  17.                      .Range("A" & u).Resize(UBound(arr), UBound(arr, 2)) = arr
  18.                 End With
  19.              Erase arr '释放数组
  20. PP:
  21.          Next
  22.          wk.Close False
  23.       End If
  24.       MyName = Dir
  25.    Loop
  26.   With Sheet2
  27.      .Activate
  28.   End With
  29.     Application.EnableEvents = True
  30. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-6-11 19:46 | 显示全部楼层
老司机带带我 发表于 2016-6-11 19:40
把修改前的代码改一下:

谢谢老师的回复

还是有问题
修改前的按纽,生成421行数据,扣除第1行空行,实应有420行
而按您所写的语句,生成了414行数据,

数据缺失了。

而且,MYNAME变量并没有修改。
回复

使用道具 举报

发表于 2016-6-11 20:04 | 显示全部楼层
加个判断吧
  1. Sub 导入()
  2.     Dim MyPath, MyName, wk As Workbook, Sht As Worksheet, m As Integer, arr, n As Integer, u As Integer, x&
  3. Application.ScreenUpdating = False
  4.        MyPath = ThisWorkbook.Path
  5.        MyName = Dir(MyPath & "" & "*.xls")
  6.    m = 0: n = 0 'MsgBox
  7.    Do While MyName <> ""
  8.       If MyName <> ThisWorkbook.Name Then
  9.          Set wk = Workbooks.Open(MyPath & "" & MyName)
  10.          m = m + 1 'MsgBox
  11.          For Each Sht In wk.Sheets
  12.              arr = Sht.UsedRange
  13.              If IsArray(arr) = False Then GoTo PP
  14.                 n = n + 1
  15.                 With ThisWorkbook.Sheets("数据源")
  16.                     x = x + 1
  17.                     u = .Cells(.Rows.Count, 1).End(xlUp).Row
  18.                     If x = 1 Then
  19.                         .Range("A1").Resize(UBound(arr), UBound(arr, 2)) = arr
  20.                         MsgBox "xx"
  21.                     Else
  22.                         .Range("A" & u + 1).Resize(UBound(arr), UBound(arr, 2)) = arr
  23.                     End If
  24.                      'u = .UsedRange.Row + .UsedRange.Rows.Count
  25.                      '.Range("A" & u).Resize(UBound(arr), UBound(arr, 2)) = arr
  26.                 End With
  27.              Erase arr '释放数组
  28. PP:
  29.          Next
  30.          wk.Close False
  31.       End If
  32.       MyName = Dir
  33.    Loop
  34.   With Sheet2
  35.      .Activate
  36.   End With
  37.     Application.EnableEvents = True
  38. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-6-11 23:26 | 显示全部楼层
老司机带带我 发表于 2016-6-11 20:04
加个判断吧


老师:
MyName = Dir(MyPath & "\" & "*.xls")
MyName如要定义为"*.xls",我的原语句将怎么改?
回复

使用道具 举报

发表于 2016-6-12 08:24 | 显示全部楼层
lhj323323 发表于 2016-6-11 23:26
老师:
MyName = Dir(MyPath & "\" & "*.xls")
MyName如要定义为"*.xls",我的原语句将怎么改?

MyName如要定义为"*.xls"有什么意义?方便文件类型修改?你附件里面的修改后代码是明显错误的!
回复

使用道具 举报

 楼主| 发表于 2016-6-12 10:21 | 显示全部楼层
老司机带带我 发表于 2016-6-12 08:24
MyName如要定义为"*.xls"有什么意义?方便文件类型修改?你附件里面的修改后代码是明显错误的!


老师:

正因为修改后,是错误的,才进行求助的啊
空一行的问题都可以先放一放

修改前的,虽然能提取数据,但语句的逻辑性是错误的。
仍是MYNAME这一句就开始出现逻辑错误,所以,才有[修改后]这一做法。
结果没想到,还不能修改透彻。
回复

使用道具 举报

发表于 2016-6-12 10:38 | 显示全部楼层
lhj323323 发表于 2016-6-12 10:21
老师:

正因为修改后,是错误的,才进行求助的啊

修改后的代码中你把Myname的初始值设置为“*.xls”,而“*.xls”实际并不是文件名,当你执行DO循环的第一次循环时Set wk = Workbooks.Open(MyPath & "\" & MyName)这句时就会发生错误了,因为MyPath & "\" & MyName并非有效文件;
而通过MyName = Dir(MyPath & "\" & "*.xls")会获得相应路径,相应类型的文件名称,MyName返回的是文件名,这样Set wk = Workbooks.Open(MyPath & "\" & MyName)才有效!

你指的逻辑错误我不知道是指的哪个,修改前的错误除了空一行,其它问题在哪,我再帮你看下!
回复

使用道具 举报

 楼主| 发表于 2016-6-12 15:04 | 显示全部楼层
本帖最后由 lhj323323 于 2016-6-12 15:09 编辑
老司机带带我 发表于 2016-6-12 10:38
修改后的代码中你把Myname的初始值设置为“*.xls”,而“*.xls”实际并不是文件名,当你执行DO循环的第一 ...

谢谢老师这么耐心的解答

下面附一个我曾经收集的一个语句
它是从指定路径提取提定文档,并导入到模板的sheet2工作表中
由于是提取的单一指定文档,所以没有采取循环的方式
我一直觉得这个版主所写的MYNAME在逻辑上更讲得服人,但是因为我的知识水平太差,也就老是植入不了。

Sub 导入xls1() 'www.officefans.net论坛的wxyqxxz2007版主
    Dim MyPath, MyName, wk As Workbook, Sht As Worksheet, arr
Application.ScreenUpdating = False
    MyPath = ThisWorkbook.Path
    MyName = "J.xls"
    With ThisWorkbook
        Sheet2.Cells.Clear
        If Dir(MyPath & "\" & MyName) <> "" Then
           Set wk = Workbooks.Open(MyPath & "\" & MyName)
           For Each Sht In wk.Sheets
               arr = Sht.UsedRange
               If IsArray(arr) = False Then GoTo PP
                With .Sheets("ID_1")
                    '.Cells.Clear
                     .Cells(1, 1).Resize(UBound(arr), UBound(arr, 2)) = arr
                     .Rows.Font.Name = "宋体"
                     .Rows.Font.Size = 10
                     .Columns.AutoFit
                 End With
                 Erase arr
PP:
           Next
           wk.Close False
        Else
           MsgBox "没有找到该文件"
        End If
    End With
Application.EnableEvents = True
    Sheet2.Activate
End Sub

我只是想套用它的语句,由提取单一文档,变成提取N个文档,这个N,有时候,也可能是1。我需要它进行循环,
也就是说,我需要把两种写法融合到一起。
即,我修前改的语句和这个版主的关于MYNAME的表达式,融合在一起。制成一种通用的工具
回复

使用道具 举报

发表于 2016-6-12 15:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 老司机带带我 于 2016-6-12 15:10 编辑
lhj323323 发表于 2016-6-12 15:04
谢谢老师这么耐心的解答

下面附一个我曾经收集的一个语句

这段代码只提取了J.xls这一工作簿的数据,你是要提取所有工作簿的数据,完全不一样,如果只提取单个工作簿信息,也完全用不上Dir吧!

如果要融合,就是吧J改成*,然后if语句改成循环语句就遍历了!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 07:00 , Processed in 0.340331 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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