ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] Word表格转Excel后提取列数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-28 22:21 | 显示全部楼层
aman1516 发表于 2015-3-28 19:40
而我用来复制旧WORD到工作表的代码,对同样的文档却不会出现此问题,点解?

7/8楼问题:
原因是代码执行时会打开文档,默认是不可见的. 当代码执行错误时,强制退出VBA,但打开的文档并没有正常关闭,再次打开同一档就会出现"锁定"状态;即使关闭系统重启,在同一目录下也会遗留一个以"~"开头不可见的系统word文件. 这时运行代码,会打开该文件,从而导致后续代码执行出错.
所以在调试时最好设置:wd.visible=true;这样如果代码运行出错,但打开的word文档是可见的,可手动正常关闭文档,避免出现上面提到的问题.

TA的精华主题

TA的得分主题

发表于 2015-3-28 22:28 | 显示全部楼层
第一个附件:
由于word表格特点,在表格中存在编号为7所在行最后一个单元格被分为三个单元格的情形,导致出错.
第二个附件:
表格第一行的格式发生了改变.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-28 23:06 | 显示全部楼层
liu-aguang 发表于 2015-3-28 22:28
第一个附件:
由于word表格特点,在表格中存在编号为7所在行最后一个单元格被分为三个单元格的情形,导致出错 ...

谢谢老师,
第二个问题对同格式的WORD修改代码可获取数据了;
第一个问题这种情况,请教下如何识别处理?

另外 ,如何修改代码可历遍多级子文件夹?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-28 23:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一个编号在不同列都可能会有对应多行的情况发生(相当于EXCEL的合并单元格),头痛......

TA的精华主题

TA的得分主题

发表于 2015-3-29 19:43 | 显示全部楼层
aman1516 发表于 2015-3-28 23:06
谢谢老师,
第二个问题对同格式的WORD修改代码可获取数据了;
第一个问题这种情况,请教下如何识别处理 ...

多行单元格容错代码:
1. 编号行,第四列以后出现多行单元格,可以正确读出所需要值;
2 .编号行,第二/三列出现多行单元格,则该编号行只能读出多行单元格的第一行值;
3. 上面第二个问题,由于项目名称以及表格格式差异较大,必须另写代码.
4. 关于遍历各子文件夹.论坛较多论述,自己去研究.(早晚得过这一关)
  1. Sub test()
  2.     Dim arr(1 To 3000, 1 To 9), ar, fso, fp, n%, subp, f, i%, s$, k$, k1$, br, cr, m%
  3.     ar = [{1,3;2,3;3,3;1,5;2,5;3,5}]
  4.     Set fso = CreateObject("scripting.filesystemobject")
  5.     Set fp = fso.getfolder(ThisWorkbook.Path)
  6.     Set wd = CreateObject("word.application")
  7.     wd.Visible = True
  8.     n = 1
  9.     For Each subp In fp.subfolders
  10.         For Each f In subp.Files
  11.             If f Like "*.doc*" Then
  12.                 With wd.documents.Open(f & "")
  13.                     For i = 1 To UBound(ar)
  14.                         arr(n, i) = Application.Clean(.tables(1).Cell(ar(i, 1), ar(i, 2)))
  15.                     Next
  16.                     On Error Resume Next
  17.                     For Each tabe In .tables
  18.                         m = 5
  19.                         s = Application.Clean(tabe.Cell(m, 1))
  20.                         Do While IsNumeric(s)
  21.                             If Err = 0 Then
  22.                                 arr(n, 7) = s
  23.                                 k = tabe.Cell(m, 2): k = Left(k, Len(k) - 2)
  24.                                 k1 = tabe.Cell(m, 3): k1 = Left(k1, Len(k1) - 2)
  25.                                 br = Split(k, vbCr): cr = Split(k1, vbCr)
  26.                                 If UBound(br) = UBound(cr) Then
  27.                                     For i = 0 To UBound(br)
  28.                                         arr(n, 8) = br(i): arr(n, 9) = cr(i)
  29.                                         n = n + 1
  30.                                     Next
  31.                                 Else
  32.                                     arr(n, 8) = k: arr(n, 9) = k1: n = n + 1
  33.                                 End If
  34.                             Else
  35.                                 Err.Clear
  36.                             End If
  37.                             m = m + 1
  38.                             If tabe.Rows.Count = m Then Exit Do
  39.                             s = Application.Clean(tabe.Cell(m, 1))
  40.                         Loop
  41.                     Next
  42.                     On Error GoTo 0
  43.                     .Close False
  44.                 End With
  45.             End If
  46.         Next
  47.     Next
  48.     wd.Quit: Set fso = Nothing
  49.     Sheets("主文件").Range("a4").Resize(n, 9) = arr
  50. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-29 23:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢老师这么仔细,我有一个想法:
    能否通过 i=m to tabe.Rows.Count ,现加上 s1 = Application.Clean(tabe.Cell(m, 1)) ,   IsNumeric(s1)为条件,并设 s2= Application.Clean(tabe.Cell(m+1,1))  ,当s2=s1时(相当于判断Cell(m, 1))为合并单元格),再通过j=2 to tabe.Columns.Count  判断那一列是包含多个行,最后获取该编号一对多行的数据,
    看上去很复杂,但似乎能解决表格不规范的问题.

点评

不想去研究了. word表格没有合并单元格的概念,多行单元格的行列索引也很奇怪:比如,假如第2列有多行单元格,则多行单元格的第二个以后的单元格分别单独成行,并且不存在cell(m,1),该行是从cell(m,2)开始的.  发表于 2015-3-30 22:25

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-30 21:35 | 显示全部楼层
本帖最后由 aman1516 于 2015-3-30 23:35 编辑

在WORD文档中,运行宏,查看表格是如何“定位”的:
Sub test()
    Dim vt As Table, vCell As Cell, n As Long
    n = 1
    For Each vt In ThisDocument.Tables
        Debug.Print "第" & CStr(n) & "张表格"
        For Each vCell In vt.Range.Cells
            Debug.Print vCell.RowIndex, vCell.ColumnIndex, vCell.Range.Text
        Next
        n = n + 1
    Next
End Sub
在本地立即窗中看到:
1)[表格定位]文档中的两个表能全部历遍,结果OK;
2)而[CJ202铝外壳]文档中的各个表格的信息却不齐全,结果NG,难怪执行代码时会出借了。
请教下老师是什么原因呢?

详见附件: 表格定位.rar (29.21 KB, 下载次数: 33)

点评

不明白说的什么信息不全.  发表于 2015-3-30 22:36
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 02:54 , Processed in 0.045025 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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