从Word文档中提取数据到Excel电子表格

9
我需要每天从Word文档中提取一个值,并将其写入Excel工作簿。目前我手动完成此操作,这对于我来说是最有效的方法。
以下是步骤:
1. 使用Excel文件创建vba脚本并添加任何Word文档引用。
2. 在Word中导航到“9. STOCKS…” 表(如附录A所示),并读取以红色突出显示的柴油(升)日常使用量。
3. 将此值写入电子表格单元格。
4. 此值的日期也很关键,但它保存在Word文档的另一个部分中(附录B)。日期也在文件名中,但我们相信内部值比Word文档名称更可靠。有了第3和第4点的知识,将相关日期提取到相邻的电子表格单元格中。
具体如下表所示,由于格式问题,我无法提供确切的表格,但可以发送其值。
9.STOCKS (截至报告发布日00:01小时)。 存储库存 日常使用 最低库存
柴油(升) 390436 15012 25000
氮(mm) 35 1 19
冠军1033个(塔) 15 1 4
Nexguard(锅炉) 4 0.25 4 x 200 ltrs
附录B: Beatrice报告期: 2010年8月10日00:01-24:00
如果您对我的问题有任何疑问,请与我联系,感谢您的努力和提前感谢。

2
希望我没有理解错,但是读了三遍后,我不明白你的问题或目标(你想得到什么数字?步骤1、2、3、1、9是过程还是方法?)。也许可以更直接地重新陈述一下。此外,除非这是在循环中重复1000次,否则如果代码完成了它的工作,“最有效的方法”可能并不需要。 - ForEachLoop
1个回答

10

以下是使用晚期绑定的一些代码(声明对象而不是 word.application 等)。从 Excel 2003 开始,它:

  1. 打开一个 WORD 文档
  2. 搜索字符串“minimum stock”
  3. 将光标向下移动几行/单词
  4. 扩展/选择 WORD 光标
  5. 将此 WORD 选区粘贴到 EXCEL 中

步骤2-5针对“Period of report:”重复执行(请注意,":"是单词边界,因此我们需要向右跳8个单词才能到达日期)。

对于WORD,我直接从您的 Q 中复制了纯文本(没有表格)。如果您使用表格,则可能需要调整各种Move语句的单位(例如,对于单元格unit:=12);但策略仍然相同:查找常量文本,将光标移动到最终目的地,扩展选区,创建Word范围并传输。

两个项目都放置在Excel中当前单元格及其右侧邻居单元格中。

Sub GrabUsage()
Dim FName As String, FD As FileDialog
Dim WApp As Object, WDoc As Object, WDR As Object
Dim ExR As Range

    Set ExR = Selection ' current location in Excel Sheet

    'let's select the WORD doc
    Set FD = Application.FileDialog(msoFileDialogOpen)
    FD.Show
    If FD.SelectedItems.Count <> 0 Then
        FName = FD.SelectedItems(1)
    Else
        Exit Sub
    End If

    ' open Word application and load doc
    Set WApp = CreateObject("Word.Application")
    ' WApp.Visible = True
    Set WDoc = WApp.Documents.Open(FName)

    ' go home and search
    WApp.Selection.HomeKey Unit:=6
    WApp.Selection.Find.ClearFormatting
    WApp.Selection.Find.Execute "Minimum Stock"

    ' move cursor from find to final data item
    WApp.Selection.MoveDown Unit:=5, Count:=1
    WApp.Selection.MoveRight Unit:=2, Count:=2

    ' the miracle happens here
    WApp.Selection.MoveRight Unit:=2, Count:=1, Extend:=1

    ' grab and put into excel        
    Set WDR = WApp.Selection
    ExR(1, 1) = WDR ' place at Excel cursor

    'repeat
    WApp.Selection.HomeKey Unit:=6
    WApp.Selection.Find.ClearFormatting
    WApp.Selection.Find.Execute "Period of Report:"
    WApp.Selection.MoveRight Unit:=2, Count:=8
    WApp.Selection.MoveRight Unit:=2, Count:=3, Extend:=1

    Set WDR = WApp.Selection
    ExR(1, 2) = WDR ' place in cell right of Excel cursor

    WDoc.Close
    WApp.Quit

End Sub
您可以创建一个按钮并从那里调用该子程序,或将GrabUsage()链接到功能键。
我注释掉了,因为在生产中您不希望WORD甚至显示出来,但您需要它进行调试和玩弄光标移动。
晚绑定(而不使用对Word库的引用)的缺点是硬编码单位(6=story,5=line,2=word),而不是使用Word枚举,但我有时会遇到早期绑定的操作系统崩溃……不太性感,但它似乎可以工作。
FileDialog对象需要对MS Office Office Library的引用。据我所知,这在Excel 2003中是标准的,但最好检查一下以免出现崩溃。
我没有包含代码来检查项目是否真正找到;我留给您的创造力。
希望这有所帮助。

当我尝试使用这个例程时,我遇到了Excel宏安全错误,阻止了它的完成,因为它在打开Word文档时在"C:\Users\00000000\AppData\Local\Microsoft\Windows\INetCache\Content.Word~WRC0001.tmp"中创建了临时文件。XLSM所在的目录已被信任,并且我无法将上述路径添加为信任目录。我该如何强制Excel在运行此例程的Excel文档的工作目录中创建所需的临时文件? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接