ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6529|回复: 13

[求助] 如何从word表格中批量提取数据。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-11 09:44 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ndt3 于 2019-10-11 09:56 编辑

各位大神:

      一直以来都有个老大难问题:从word中批量提取数据的问题,以前都是复制粘贴到excl里然后再慢慢删,效率低,由于word的隐藏格式造成有些复制过来表格对应的行列还不一致。论坛里的代码找了很多,表头部分都有解决方法,但是表头下面的就没有相应的代码可供借鉴。
特来求助各位大神!辛苦大神代码注释一下方便理解学习!十分感谢!!!

一、表格实际存储有两种情况:1、每张表格一个文件、2、同一文件有多份
二、蓝色字体表头部分,提取使用上下左右偏移;
三、红色字体条目行数不固定,而且不一定只有5行;使用“荣获情况”作为标记确认行数是否可行,
四、如果:红色字体条目列数变化(增加或者减少)怎么扩展?(所有表格都一样的变动不是动态)
五、取文件名并链接,方便快速打开修改;


详情请参阅附件。谢谢各位大神!




补充内容 (2019-10-15 16:38):
表头部分已经实现,关键正餐,表中部分。。。。求帮助!谢谢各位老师!

模拟word表格批量提取数据.zip

40.44 KB, 下载次数: 119

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-12 10:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
没人看看么,自己顶一下!

TA的精华主题

TA的得分主题

发表于 2019-10-12 13:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
可以用我的docpick先将文档根据所含表格的类型进行分类,然后再用doc2xls来分类导入

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-15 15:41 | 显示全部楼层
本帖最后由 ndt3 于 2019-10-15 15:42 编辑
Moneky 发表于 2019-10-12 13:34
可以用我的docpick先将文档根据所含表格的类型进行分类,然后再用doc2xls来分类导入

老师主要是截图部分需要逐条生成,其他的您的工具都能解决,这个有C:\Users\Administrator\Desktop\测试文件\QQ截图20191015153735点麻烦,还是要感谢老师!谢谢!
QQ截图20191015153735.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-15 16:40 | 显示全部楼层
Moneky 发表于 2019-10-12 13:34
可以用我的docpick先将文档根据所含表格的类型进行分类,然后再用doc2xls来分类导入

老师,表头解决了,怎么处理表中呢?麻烦帮忙看看!谢谢!
提取流程控制点.png

表头部分实现模拟word表格批量提取数据.zip

109.32 KB, 下载次数: 51

TA的精华主题

TA的得分主题

发表于 2019-10-16 12:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ndt3 发表于 2019-10-15 16:40
老师,表头解决了,怎么处理表中呢?麻烦帮忙看看!谢谢!

导入到Excel中在同一行,然后自己在Excel中手动处理即可。

TA的精华主题

TA的得分主题

发表于 2019-10-26 20:14 | 显示全部楼层
难度不大,就是费时间。还没有解决的话,说一声,有空帮你看看,最近视力过度疲劳,所以很长时间没来论坛了。

TA的精华主题

TA的得分主题

发表于 2019-10-26 23:38 | 显示全部楼层
虽然不是很完美,但可以实现你的要求了,没想到竟然花了近4个小时,看来水平还亟待提高
Sub GetDocTablletoSheet()
  '请在EXCEL VBE中引用MS WORD   http://xysj1980.blog.163.com/blo ... 398201221843054403/
  Dim wdApp As Word.Application, wdDoc As Word.Document, wdTable As Word.Table
  Dim strArray() As Variant, xlSheet As Worksheet, myDialog As FileDialog, oSel As Variant, otb As Table
  Dim myArray() As String, r As Integer, i As Integer, m As Integer, rc As Integer
  For Each Process In GetObject("winmgmts:").ExecQuery("select * from Win32_Process where name='WINWORD.EXE'")
    Process.Terminate (0)
  Next
  On Error Resume Next
  r = ActiveSheet.[b65536].End(xlUp).Row
  '定义一个一维数组,给EXCEL数据表表头赋值
  If r > 2 Then
    Range("b2:m" & r).ClearContents
  End If
  r = ActiveSheet.[b65536].End(xlUp).Row
  Set wdApp = New Word.Application '取得一个New Word对象
  Set myDialog = Application.FileDialog(msoFileDialogFilePicker)
  With myDialog
    .Filters.Clear    '清除所有文件筛选器中的项目
    .Filters.Add "所有 WORD 文件", "*.doc", 1    '增加筛选器的项目为所有WORD文件
    .AllowMultiSelect = True    '允许多项选择
    If .Show = -1 Then    '确定
      Application.ScreenUpdating = False
      For Each oSel In .SelectedItems    '在所有选取word文档中循环
        m = 8                              '此处数字2即提取word表格中几个数据,亦即提取数据后工作表中列数
        Set wdDoc = wdApp.Documents.Open(Filename:=oSel, Visible:=False)
        For i = 1 To wdDoc.Tables.Count '在一个word文档的所有表格中循环
          Set wdTable = wdDoc.Tables(i)
          With wdTable
            With .Range.Find
              .Text = "荣获情况"
              .Execute
              If .Found = True Then
                rc = wdTable.Range.Rows.Count - 5
              End If
            End With
            For rc1 = rc To 7 Step -1
              If Replace(.cell(rc1, 1).Range.Text, Chr(13) & Chr(7), "") = "" Then
                rc = rc - 1
              End If
            Next
          End With
          rm = rc - 6
          ReDim myArray(1 To rm, 1 To 12) '此处需要加入统计某一内容的行数
          With wdTable '将word文档中指定的单元格内容赋值给数组
            For a1 = 1 To rm
              myArray(a1, 1) = Replace(.cell(1, 2).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 2) = Replace(.cell(1, 4).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 3) = Replace(.cell(1, 6).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 4) = Replace(.cell(2, 2).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 5) = Replace(.cell(2, 4).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 6) = Replace(.cell(2, 6).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 7) = Replace(.cell(4, 1).Range.Text, Chr(13) & Chr(7), "")
            Next
            For r1 = 1 To rm
              For r2 = 8 To 12 - 1
                myArray(r1, r2) = Replace(.cell(r1 + 6, r2 - 7).Range.Text, Chr(13) & Chr(7), "")
              Next
            Next
          End With
          With Sheets(1)
            r = .[b65536].End(xlUp).Row + 1
            .Range("B" & r).Resize(UBound(myArray), UBound(myArray, 2)) = myArray  '为单元格区域赋值
            For rn = r To r + rm
              .Hyperlinks.Add Anchor:=Cells(rn, 13), Address:=wdDoc.Name, SubAddress:="", TextToDisplay:="" 'wdDoc.Name '文件名超链接
            Next
          End With
        Next '完成一个文件的赋值
        wdDoc.Close False
      Next
    End If
  End With
  wdApp.Quit
  Set wdApp = Nothing
  Application.ScreenUpdating = True '恢复屏幕更新
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-28 19:55 | 显示全部楼层
乐乐2006201505 发表于 2019-10-26 23:38
虽然不是很完美,但可以实现你的要求了,没想到竟然花了近4个小时,看来水平还亟待提高
Sub GetDocT ...

谢谢!这个我折腾了快半个月,已经全部完成。
代码借来用用,嘿嘿!

TA的精华主题

TA的得分主题

发表于 2019-10-28 20:22 | 显示全部楼层
又花了近1天时间,刚刚实现了“荣获情况”行出现在任何一行,都可以实现相同结果的效果。终于自认为比较圆满了。主要是红色部分代码。
Sub GetDocTablletoSheet()
  '请在EXCEL VBE中引用MS WORD   http://xysj1980.blog.163.com/blo ... 398201221843054403/
  Dim wdApp As Word.Application, wdDoc As Word.Document, wdTable As Word.Table
  Dim strArray() As Variant, xlSheet As Worksheet, myDialog As FileDialog, oSel As Variant, otb As Table
  Dim myArray() As String, r As Integer, i As Integer, m As Integer, rc As Integer
  For Each Process In GetObject("winmgmts:").ExecQuery("select * from Win32_Process where name='WINWORD.EXE'")
    Process.Terminate (0)
  Next
  On Error Resume Next
  r = ActiveSheet.[b65536].End(xlUp).Row
  '定义一个一维数组,给EXCEL数据表表头赋值
  If r > 2 Then
    Range("b2:m" & r).ClearContents
  End If
  r = ActiveSheet.[b65536].End(xlUp).Row
  Set wdApp = New Word.Application '取得一个New Word对象
  Set myDialog = Application.FileDialog(msoFileDialogFilePicker)
  With myDialog
    .Filters.Clear    '清除所有文件筛选器中的项目
    .Filters.Add "所有 WORD 文件", "*.doc", 1    '增加筛选器的项目为所有WORD文件
    .AllowMultiSelect = True    '允许多项选择
    If .Show = -1 Then    '确定
      Application.ScreenUpdating = False
      For Each oSel In .SelectedItems    '在所有选取word文档中循环
        m = 8                              '此处数字2即提取word表格中几个数据,亦即提取数据后工作表中列数
        Set wdDoc = wdApp.Documents.Open(Filename:=oSel, Visible:=False)
        For i = 1 To wdDoc.Tables.Count '在一个word文档的所有表格中循环
          Set wdTable = wdDoc.Tables(i)
          With wdTable
            For ii = 1 To .Range.Rows.Count
              If Replace(.cell(ii, 1).Range.Text, Chr(13) & Chr(7), "") = "荣获情况" Then
                rc = ii - 1
                Exit For
              End If
            Next

            For rc1 = rc To 7 Step -1
              If Replace(.cell(rc1, 1).Range.Text, Chr(13) & Chr(7), "") = "" Then
                rc = rc - 1
              End If
            Next
          End With
          rm = rc - 6
          ReDim myArray(1 To rm, 1 To 12) '此处需要加入统计某一内容的行数
          With wdTable '将word文档中指定的单元格内容赋值给数组
            For a1 = 1 To rm
              myArray(a1, 1) = Replace(.cell(1, 2).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 2) = Replace(.cell(1, 4).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 3) = Replace(.cell(1, 6).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 4) = Replace(.cell(2, 2).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 5) = Replace(.cell(2, 4).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 6) = Replace(.cell(2, 6).Range.Text, Chr(13) & Chr(7), "")
              myArray(a1, 7) = Replace(.cell(4, 1).Range.Text, Chr(13) & Chr(7), "")
            Next
            For r1 = 1 To rm
              For r2 = 8 To 12 - 1
                myArray(r1, r2) = Replace(.cell(r1 + 6, r2 - 7).Range.Text, Chr(13) & Chr(7), "")
              Next
            Next
          End With
          With Sheets(1)
            r = .[b65536].End(xlUp).Row + 1
            .Range("B" & r).Resize(UBound(myArray), UBound(myArray, 2)) = myArray  '为单元格区域赋值
            For rn = r To r + rm
              .Hyperlinks.Add Anchor:=Cells(rn, 13), Address:=wdDoc.Name, SubAddress:="", TextToDisplay:="" 'wdDoc.Name '文件名超链接
            Next
          End With
        Next '完成一个文件的赋值
        wdDoc.Close False
      Next
    End If
  End With
  wdApp.Quit
  Set wdApp = Nothing
  Application.ScreenUpdating = True '恢复屏幕更新
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 10:15 , Processed in 0.047107 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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