Excel精英培训网

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

[已解决]如何实现从外部选择文件的方式把这三张表的单词提取进来呢?

[复制链接]
发表于 2014-9-1 21:18 | 显示全部楼层 |阅读模式
在附件中有三个表:07、36、60,如果这三张表分别位于三个excel文件中,而且都是位于sheet1表,名称还是07、36、60,那么如何实现从外部选择这三个文件的方式把这三张表的单词提取进来呢?
提取单词 .zip (27.99 KB, 下载次数: 3)
发表于 2014-9-1 21:46 | 显示全部楼层
  1. Sub Macro1()
  2. Dim mypath$$, wb As Workbook, wj$$, d
  3. Dim arr, brr(1 To 60000, 1 To 3), j&, k%, s&
  4. Application.ScreenUpdating = False
  5. Set d = CreateObject("scripting.dictionary")
  6. mypath = ThisWorkbook.Path & ""
  7. wj = Dir(mypath & "*.xls")
  8. Do While wj <> ""
  9.     If wj <> ThisWorkbook.Name Then
  10.         Set wb = GetObject(mypath & wj)
  11.         arr = wb.Sheets(1).UsedRange
  12.         wb.Close 0
  13.         For j = 2 To UBound(arr) Step 2
  14.             For k = 1 To UBound(arr, 2)
  15.                 If arr(j, k) <> "" And Not d.exists(arr(j, k)) Then
  16.                     d(arr(j, k)) = arr(j + 1, k): s = s + 1: brr(s, 1) = arr(j, k): brr(s, 2) = arr(j + 1, k)
  17.                 End If
  18.                 If j = 2 And k = 1 Then brr(s, 3) = arr(1, 1)
  19.             Next
  20.         Next
  21.     End If
  22.     wj = Dir
  23. Loop
  24. ActiveSheet.UsedRange.ClearContents
  25. Range("a1").Resize(s, 3) = brr
  26. Application.ScreenUpdating = True
  27. End Sub
复制代码
回复

使用道具 举报

发表于 2014-9-1 21:47 | 显示全部楼层
………………

新建文件夹.zip

40.17 KB, 下载次数: 10

回复

使用道具 举报

 楼主| 发表于 2014-9-1 21:57 | 显示全部楼层
dsmch 发表于 2014-9-1 21:47
………………

不过有个地方需要改进一下,点击按钮能不能让我来从目录中选择文件,再提取,我加这个功能是想,随时增加词库,挑选我希望增加的单词表

点评

你自己先理清思路,是选择文件,还是选择文件所在的文件夹?考虑清楚了明天帮你看看。  发表于 2014-9-1 22:03
回复

使用道具 举报

发表于 2014-9-2 02:01 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim wb As Workbook, d, i%, j&, k%, s&
  3. Dim arr, brr(1 To 60000, 1 To 3)
  4. Application.ScreenUpdating = False
  5. Set d = CreateObject("scripting.dictionary")
  6. With Application.FileDialog(msoFileDialogOpen)
  7.     .AllowMultiSelect = True
  8.     .Show
  9.     For i = .SelectedItems.Count To 1 Step -1
  10.         Set wb = GetObject(.SelectedItems(i))
  11.         arr = wb.Sheets(1).UsedRange
  12.         wb.Close 0
  13.         For j = 2 To UBound(arr) Step 2
  14.             For k = 1 To UBound(arr, 2)
  15.                 If arr(j, k) <> "" And Not d.exists(arr(j, k)) Then
  16.                     d(arr(j, k)) = arr(j + 1, k): s = s + 1: brr(s, 1) = arr(j, k): brr(s, 2) = arr(j + 1, k)
  17.                 End If
  18.                 If j = 2 And k = 1 Then brr(s, 3) = arr(1, 1)
  19.             Next
  20.         Next
  21.     Next
  22. End With
  23. ActiveSheet.UsedRange.ClearContents
  24. Range("a1").Resize(s, 3) = brr
  25. Application.ScreenUpdating = True
  26. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-9-2 06:28 | 显示全部楼层
本帖最后由 jessylake 于 2014-9-2 08:57 编辑
dsmch 发表于 2014-9-2 02:01


真是过意不去,让老师这么晚还在写代码,真是辛苦了,这段代码真是令人难以置信,太棒了,希望老师再做点改动,就是导入的时候能够按照文件选择的顺序,由上到下排列单词,现在是反着的,第一个选择的单词表文件中的单词排在最后面; 还有选择文件的窗口,如果点击取消,会出错,并且把原来导入的数据删除。再次对老师表示感谢!

这两个问题我自己改了一下,解决了:
Sub Macro1()
Dim wb As Workbook, d, i%, j&, k%, s&
Dim arr, brr(1 To 60000, 1 To 3)
Application.ScreenUpdating = False
Set d = CreateObject("scripting.dictionary")
With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = True
    .Show
    If .SelectedItems.Count = 0 Then Exit Sub
    For i = 1 To .SelectedItems.Count
        Set wb = GetObject(.SelectedItems(i))
        arr = wb.Sheets(1).UsedRange
        wb.Close 0
        For j = 2 To UBound(arr) Step 2
            For k = 1 To UBound(arr, 2)
                If arr(j, k) <> "" And Not d.exists(arr(j, k)) Then
                    d(arr(j, k)) = arr(j + 1, k): s = s + 1: brr(s, 1) = arr(j, k): brr(s, 2) = arr(j + 1, k)
                End If
                If j = 2 And k = 1 Then brr(s, 3) = arr(1, 1)
            Next
        Next
    Next
End With
ActiveSheet.UsedRange.ClearContents
Range("a1").Resize(s, 3) = brr
Application.ScreenUpdating = True
End Sub

不过还有个比较关键的问题,就是现在导入新表会把原来导入的单词全部清空,如何从最下面导入新表?
自己又改好了:
Sub Macro1()
Dim wb As Workbook, d, i%, j&, k%, s&, Myr&
Dim arr, brr(1 To 60000, 1 To 3)
Application.ScreenUpdating = False
Myr = IIf([a1] = "", 1, Sheet1.[a1].End(xlDown).Row)
Set d = CreateObject("scripting.dictionary")
With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = True
    .Show
    If .SelectedItems.Count = 0 Then Exit Sub
    For i = 1 To .SelectedItems.Count
        Set wb = GetObject(.SelectedItems(i))
        arr = wb.Sheets(1).UsedRange
        wb.Close 0
        For j = 2 To UBound(arr) Step 2
            For k = 1 To UBound(arr, 2)
                If arr(j, k) <> "" And Not d.exists(arr(j, k)) Then
                    d(arr(j, k)) = arr(j + 1, k): s = s + 1: brr(s, 1) = arr(j, k): brr(s, 2) = arr(j + 1, k)
                End If
                If j = 2 And k = 1 Then brr(s, 3) = arr(1, 1)
            Next
        Next
    Next
End With
Range("a" & Myr).Resize(s, 3) = brr
Application.ScreenUpdating = True
End Sub

但还是有个问题,如果导入的表是重名(以表中的标题栏为准)的,如何实现只是对已导入的单词库中同名(即第三列相同,所以可能第三列都需要加标题栏,现在仅是表中第一个单词加)的部分进行更新,当然可能导入的同名表中的单词数量可能增加或减少,这怎么更新呢?

还有,Application.FileDialog(msoFileDialogOpen) 怎么设置默认文件是 excel文件?(好像有记忆功能,不用改了)  Set wb = GetObject(.SelectedItems(i))
应该是打开文件,如果打开失败,比如让输入密码,我点取消,如何避免错误提示(287错误:应用程序定义或对象定义错误)?(解决了,用 On error goto 可以跳过去,直接结束 )  就剩下导入重名表的更新问题了,呵呵,这个要靠老师了

点评

从数据源头着手,建一文件夹,可以不断增加词库,2楼代码稍微修改即可。  发表于 2014-9-2 12:28
回复

使用道具 举报

发表于 2014-9-2 19:27 | 显示全部楼层
用选择数据源文件夹方法试试,数据源文件夹可以不断更新增加,手动选择也较方便

新建文件夹.zip

41.37 KB, 下载次数: 3

回复

使用道具 举报

 楼主| 发表于 2014-9-2 19:54 | 显示全部楼层
dsmch 发表于 2014-9-2 19:27
用选择数据源文件夹方法试试,数据源文件夹可以不断更新增加,手动选择也较方便

测试了一下,确实可以更新,但是前提必须是文件名必须一致,不是根据C列的内容判断进行的,是整个所有表都重新走一遍,如果表多的话,更新起来比较慢了,不是对某一张表进行更新,增加一张新表,实际上也是把所有表都提取一遍

点评

英语单词也就是60万左右,常用的不过三五千,速度应该不是问题。  发表于 2014-9-2 20:13
回复

使用道具 举报

 楼主| 发表于 2014-9-2 20:18 | 显示全部楼层
dsmch 发表于 2014-9-2 19:27
用选择数据源文件夹方法试试,数据源文件夹可以不断更新增加,手动选择也较方便

针对C列标题栏名称,只对个别的表进行更新词库不好实现吗

点评

无所谓更新不更新,代码用了字典,就没有重复的。  发表于 2014-9-2 21:10
回复

使用道具 举报

 楼主| 发表于 2014-9-2 21:18 | 显示全部楼层
dsmch 发表于 2014-9-2 19:27
用选择数据源文件夹方法试试,数据源文件夹可以不断更新增加,手动选择也较方便

那您为什么不用5楼的方法做一个,像我新发的帖子:请求数组高手利用导入外部单词表文件帮我把词库进行更新或补充
http://www.excelpx.com/thread-331179-1-1.html   所希望的?是不是有难度呀,可我总得,好像也不是很难吧,我的思路是通过C列找到原表单词所占的单元格区域,然后用新表里的单词组成的数组赋值到这个区域里,不就OK了,呵呵,可惜我这个外行,不懂数组不会写代码,最近刚开始学
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 18:07 , Processed in 0.202854 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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