ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 批量提取行数不定的word表格信息

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-11-27 21:01 | 显示全部楼层 |阅读模式
各位老师,从word表格中提取信息,
不同文件的表格结构基本一致,唯独就是行数不一致。
第2行(包括第2行)以下的都是信息行,把每个word文件中的信息提取到excel中为一行
有的word文件(附件1班)信息行是5行,
有的word文件(附件2班)信息行是3行,
有的word文件(附件3班)信息行是4行。
以上附件是举例,实际可能信息行会更多,比如几百行。
遇到的问题是:
如何把不同行数的word表信息提取到excel中?
代码中如何引入变量?
如何在代码中引入变量.png

0-批量提取word信息.rar

41.11 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2022-11-27 21:53 | 显示全部楼层
r = 1
            For i = 2 To 6
                For j = 1 To 4
                    r = r + 1
                    arr(n, r) = .Tables(1).Cell(i, j).Range
                Next j
            Next i
看看红框部分,修改成这样是否可行吧

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-11-28 09:28 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-28 09:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub 提取word信息()
  2.     Sheet1.Cells.ClearContents
  3.     Dim fso, fp, arr, wd, f, n%, fname$
  4.     Set fso = CreateObject("scripting.filesystemobject")
  5.     Set fp = fso.GetFolder(ThisWorkbook.Path)
  6.     ReDim arr(1 To 1000, 1 To 100)
  7.     Set wd = CreateObject("word.application")
  8.     n = 0
  9.     For Each f In fp.Files
  10.         If Right(f, 3) = "doc" Or Right(f, 4) = "docx" Then
  11.         n = n + 1:
  12.         arr(n, 1) = fso.getbasename(f)
  13.         fname = fso.getfilename(f)
  14.         With wd.Documents.Open(ThisWorkbook.Path & "" & fname, True, True)
  15.             wd.Visible = True
  16.             
  17.             r = 1
  18.             For i = 2 To 6
  19.                 For j = 1 To 4
  20.                     r = r + 1
  21.                     arr(n, r) = .Tables(1).Cell(i, j).Range
  22.                 Next j
  23.             Next i
  24.                   
  25.         .Close
  26.         End With
  27.         End If
  28.         Next
  29.         wd.Quit
  30.     Sheets(1).[a1].Resize(UBound(arr), UBound(arr, 2)) = arr
  31.     ActiveSheet.UsedRange.Replace "", ""
  32.     ActiveSheet.UsedRange.NumberFormatLocal = "@"

  33. End Sub
复制代码


liulang0808老师,您好。非常感谢您的指导。您的代码基本上解决了变量的问题。
但是因为不同word文件表格行数不定,代码和提取结果还存在2个问题:
1.代码中的word最大行(”For i = 2 To 6“的6),如何实现自动化获取?
如何在不同表格行的word文件中自动获取到最大行值的信息?
2.提取结果中最大行的word提取信息正确。但是小于最大行的word文件提取的信息,则用最后一行数据补齐到最大行的数据列。
比如在例子中最大行是6的word信息提取正确,但是5行和4行的word文件用最后一行数据补齐到6行,多出来这些补齐的数据。
红色底纹为补齐的多出的数据.png

TA的精华主题

TA的得分主题

发表于 2022-11-28 10:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
For i = 2 To .Tables(1).Rows.Count
    For j = 1 To .Tables(1).Columns.Count

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-28 11:56 | 显示全部楼层
本帖最后由 yuhan4488 于 2022-11-29 11:49 编辑

经过“liulang0808”老师、“小花鹿”老师和“云南邦盈顾问”老师三位老师的指导,问题完美解决,感谢三位老师。以下是三位老师指导后的代码,分享:


Sub 提取word信息()
     Sheet1.Cells.ClearContents
     Dim fso, fp, arr, wd, f, n%, fname$
    Set fso = CreateObject("scripting.filesystemobject")
    Set fp = fso.getfolder(ThisWorkbook.Path)
    ReDim arr(1 To 1000, 1 To 100)
    Set wd = CreateObject("word.application")
    n = 0
    For Each f In fp.Files
        If Right(f, 3) = "doc" Or Right(f, 4) = "docx" Then
        n = n + 1:
        arr(n, 1) = fso.getbasename(f)
        fname = fso.getfilename(f)
        With wd.Documents.Open(ThisWorkbook.Path & "\" & fname, True, True)
            wd.Visible = True
            
           r = 1
           For i = 2 To .Tables(1).Rows.Count
           For j = 1 To .Tables(1).Columns.Count
                    r = r + 1
                    arr(n, r) = .Tables(1).Cell(i, j).Range
                Next j
            Next i
            
        .Close
        End With
        End If
        Next
        wd.Quit

    Sheets(1).[a1].Resize(UBound(arr), UBound(arr, 2)) = arr
    ActiveSheet.UsedRange.Replace "", ""
    ActiveSheet.UsedRange.NumberFormatLocal = "@"
End Sub

TA的精华主题

TA的得分主题

发表于 2022-11-28 12:04 | 显示全部楼层
liulang0808 发表于 2022-11-27 21:53
r = 1
            For i = 2 To 6
                For j = 1 To 4

最近正在研究 word  vba  你真是厉害

点评

群里有很多大咖的总结,有问题的时候参***例而已。。。  发表于 2022-11-28 12:08

TA的精华主题

TA的得分主题

发表于 2022-11-29 09:10 | 显示全部楼层
yuhan4488 发表于 2022-11-28 11:56
经过“liulang0808”老师、“小花鹿”老师和“云南邦盈顾问”老师三位老师的指导,问题完美解决,感谢三位 ...

麻烦放一个完整的附件

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-11-29 10:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好的,我放一个修改后完整的附件

0-批量提取word信息(new).rar

40.61 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2022-11-29 17:22 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 19:23 , Processed in 0.051286 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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