ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎样把大量Word文件中包含某字符串的句子整理到Excel中

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-20 14:31 | 显示全部楼层 |阅读模式
我的问题下图所示:

问题.JPG

我想把某文件夹及其子文件夹下的所有Word文档里包含 interesting 字符串的句子整理到根目录Excel文件里。

句子截取规则:发现 interesting 字符串后,截取完整句子,以句号 "." 开始(如果没有句号 "." ,则从第一个字母开始截取),以句号 "." 终止。

整理到Excel文件后用 "__________"替换interesting 字符串。

求助文件附件已上传。谢谢大家!

summary.zip (33.1 KB, 下载次数: 22)

TA的精华主题

TA的得分主题

发表于 2018-9-20 19:20 | 显示全部楼层
本帖最后由 182197315 于 2018-9-20 19:34 编辑

Sub 提取()
    Dim fso As Object, Folder As Object, arr$(), brr(1 To 100, 1 To 1), m%, i%
    Dim wdApp As New Word.Application, wdD As Word.Document, tempRange As Word.Range
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Folder = fso.GetFolder(ThisWorkbook.Path)
    Application.ScreenUpdating = False
    Call GetFiles(Folder, arr, m)
    For i = 1 To m
        Set wdD = wdApp.documents.Open(arr(i))
        Set tempRange = wdD.Content
        With tempRange
            If .Find.Execute("interesting") Then
                .Expand wdSentence
                brr(i, 1) = Replace(.Text, "interesting", "____________")
            End If
        End With
        wdD.Close
    Next
    wdApp.Quit
    Range("A2").CurrentRegion.ClearContents
    Range("A2").Resize(m) = brr
    Set wdD = Nothing
    Set tempRange = Nothing
    Set Folder = Nothing
    Set File = Nothing
    Set fso = Nothing
    Application.ScreenUpdating = True
End Sub

Sub GetFiles(ByVal Folder As Object, arr$(), m%)
    Dim SubFolder As Object
    Dim File As Object
    If Folder.Path <> ThisWorkbook.Path Then
        For Each File In Folder.Files
            If File.Name Like "*.doc?" Then
                m = m + 1
                ReDim Preserve arr(1 To m)
                arr(m) = File
            End If
        Next
    End If
    For Each SubFolder In Folder.SubFolders
        Call GetFiles(SubFolder, arr, m)
    Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-21 14:35 | 显示全部楼层
本帖最后由 beleqing 于 2018-9-21 14:38 编辑
182197315 发表于 2018-9-20 19:20
Sub 提取()
    Dim fso As Object, Folder As Object, arr$(), brr(1 To 100, 1 To 1), m%, i%
    Dim  ...

首先谢谢大神,代码解决了我的问题。现在有一个新的问题,有时候一个Word文件搜索 “interesting”字符串会有多个结果(比如图片中右上的Word文件里有两句话包含字符串 “interesting”),请问如何将所有结果所在的句子给截取出来?
请问是要修改下列代码吗?

  1. With tempRange
  2.      If .Find.Execute("interesting") Then
  3.           .Expand wdSentence
  4.           brr(i, 1) = Replace(.Text, "interesting", "____________")
  5.      End If
复制代码


谢谢!
问题.JPG


TA的精华主题

TA的得分主题

发表于 2018-9-21 15:24 | 显示全部楼层
  1. Option Explicit
  2. Sub Test()
  3.     Dim arrList As Variant, strContent As String
  4.     Dim objReg As Object, strTemp As String, strPat As String
  5.     Dim objMatchs As Object, objMatch As Object
  6.     Dim arrResult As Variant, lngID As Long
  7.    
  8.     arrList = GetFileNameList(ThisWorkbook.Path, ".doc*")
  9.     strContent = GetTextFromDoc(arrList)
  10.     Debug.Print strContent
  11.    
  12.     strPat = "([^\.]*)interesting([^\.]*\.)"
  13.     Set objReg = CreateObject("VBScript.RegExp")
  14.     With objReg
  15.         .Global = True
  16.         .Pattern = strPat
  17.     End With
  18.     Set objMatchs = objReg.Execute(strContent)

  19.     If objMatchs.Count = 0 Then Exit Sub
  20.    
  21.     ReDim arrResult(1 To objMatchs.Count, 1 To 1)
  22.     lngID = 1
  23.     For Each objMatch In objMatchs
  24.         strTemp = objMatch
  25.         strTemp = Replace(strTemp, "interesting", String(10, "_"))
  26.         arrResult(lngID, 1) = Trim(strTemp)
  27.         lngID = lngID + 1
  28.     Next
  29.    
  30.     Sheet1.UsedRange.ClearContents
  31.     Sheet1.Range("A1").Resize(UBound(arrResult), 1) = arrResult
  32.     MsgBox "OK"
  33. End Sub

  34. '读取WORD 文档中的文字
  35. Function GetTextFromDoc(arrFileList As Variant) As String
  36.     Dim objWord As Object, objDoc As Object, lngR As Long
  37.     Dim strPath As String, strFileName As String
  38.     Dim strTemp As String
  39.    
  40.     Set objWord = CreateObject("word.application")
  41.    
  42.     For lngR = LBound(arrFileList) To UBound(arrFileList)
  43.         strPath = arrFileList(lngR): strFileName = ""
  44.         If strPath <> "" Then strFileName = Dir(strPath)
  45.         If strFileName <> "" Then
  46.             Set objDoc = objWord.Documents.Open(strPath, True, True)
  47.             strTemp = strTemp & " " & objDoc.Content
  48.             objDoc.Close False
  49.         End If
  50.     Next
  51.    
  52.     objWord.Quit
  53.     Set objDoc = Nothing: Set objWord = Nothing
  54.    
  55.     strTemp = Replace(strTemp, Chr(10), " ")
  56.     strTemp = Replace(strTemp, Chr(13), " ")
  57.    
  58.     GetTextFromDoc = strTemp
  59. End Function

  60. '得到当前目录及子目录下,指定后缀的文件列表
  61. Function GetFileNameList(strPath As String, Optional strFileType As String = "*") As Variant
  62.     Dim strFileList As String
  63.     Dim arrResult As Variant

  64.     With CreateObject("Wscript.Shell")
  65.         strFileList = .exec("cmd /c dir /a-d/b/s/n " & strPath & " | findstr /I ." & strFileType).StdOut.Readall
  66.     End With

  67.     If strFileList = "" Then
  68.         ReDim arrResult(1 To 1)
  69.         arrResult(1) = "False"
  70.     Else
  71.         arrResult = Split(strFileList, vbCrLf)
  72.     End If

  73.     GetFileNameList = arrResult
  74. End Function
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-15 21:37 , Processed in 0.023015 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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