Excel 从A列的“我的字符串”(即段落)中删除特定词类和标点符号,并在B列中输入结果

Excel 从A列的“我的字符串”(即段落)中删除特定词类和标点符号,并在B列中输入结果,excel,excel-formula,vlookup,Excel,Excel Formula,Vlookup,请看标题。这是我的密码: Option Explicit Sub MakeWordList() Dim mObjWord As Word.Application Dim InputSheet As Worksheet Dim WordListSheet As Worksheet Dim PuncChars As Variant, x As Variant Dim i As Long, r As Long Dim txt As String

请看标题。这是我的密码:

Option Explicit
Sub MakeWordList()
    Dim mObjWord As Word.Application
    Dim InputSheet As Worksheet
    Dim WordListSheet As Worksheet
    Dim PuncChars As Variant, x As Variant
    Dim i As Long, r As Long
    Dim txt As String
    Dim wordCnt As Long
    Dim AllWords As Range
    Dim oString As String

    Set mObjWord = CreateObject("Word.Application")

    Application.ScreenUpdating = True
    Set InputSheet = ActiveSheet
    Set WordListSheet = Worksheets.Add(After:=Worksheets(Sheets.Count))
    WordListSheet.Range("A1") = "All Words"
    WordListSheet.Range("A1").Font.Bold = True
    InputSheet.Activate
    wordCnt = 2
    PuncChars = Array(".", ",", ";", ":", "'", "!", "#", _
        "$", "%", "&", "(", ")", " - ", "_", "--", "+", _
        "=", "~", "/", "\", "{", "}", "[", "]", """", "?", "*")
    r = 1
    oString = ""
    'Loop until blank cell is encountered and add the word to oString

    Do While Cells(r, 1) <> ""
        txt = Cells(r, 1)
        For i = 0 To UBound(PuncChars)
            txt = Replace(txt, PuncChars(i), "")
        Next i
        'Remove excess spaces
        txt = WorksheetFunction.Trim(txt)
        'Extract the words
        x = Split(txt)
        For i = 0 To UBound(x)
        Set mObjWord = CreateObject("Word.Application")
        ' it does not run from here
            Select Case x(i)
                Case wdAdverb, wdVerb, wdConjunction, wdIdiom, wdInterjection, wdPronoun, wdPreposition
                Case Else
                oString = oString & " " & x(i)
            End Select
        Next i
        InputSheet.Range("r, 2").Value = oString
        r = r + 1
    Loop

End Sub
选项显式
子MakeWordList()
Dim mObjWord作为Word.Application
将输入表作为工作表进行调整
将单词列表表设置为工作表
变型为暗蓬卡,变型为x
暗淡的i一样长,r一样长
以字符串形式显示文本
模糊的词
将所有单词作为范围
像细绳一样变暗
设置mObjWord=CreateObject(“Word.Application”)
Application.ScreenUpdating=True
设置InputSheet=ActiveSheet
Set WordListSheet=Worksheets.Add(后面:=Worksheets(Sheets.Count))
WordListSheet.Range(“A1”)=“所有单词”
WordListSheet.Range(“A1”).Font.Bold=True
输入表。激活
wordCnt=2
PuncChars=数组(“.”、“,”、“;”、“:”、“'”、“!”、“#”_
"$", "%", "&", "(", ")", " - ", "_", "--", "+", _
"=", "~", "/", "\", "{", "}", "[", "]", """", "?", "*")
r=1
oString=“”
'循环,直到遇到空白单元格并将单词添加到oString
“当单元格(r,1)”时执行”
txt=单元格(r,1)
对于i=0至UBound(PuncChars)
txt=替换(txt,PuncChars(i),“”)
接下来我
'删除多余的空格
txt=工作表函数.Trim(txt)
"摘抄文字,
x=拆分(txt)
对于i=0到UBound(x)
设置mObjWord=CreateObject(“Word.Application”)
“它不是从这里跑出来的
选择案例x(i)
副词,动词,连词,成语,感叹词,代词,介词
其他情况
oString=oString&&&x(i)
结束选择
接下来我
InputSheet.Range(“r,2”)。值=oString
r=r+1
环
端接头

似乎您希望加载MS Word的实例(实际上,您的代码在一个循环中加载了许多实例,可能有数百个),以访问诸如wdVerb之类的枚举,您希望这些枚举能够识别文本中的动词。枚举是数字,精确地说是长整数。例如,wdVerb表示值3(在单词VBE的即时窗口中键入?wdVerb)。 我不知道单词对这些数字有什么作用,但你的x(I)包含一个字符串

Select Case x(i)
    Case wdAdverb, wdVerb
    Case Else
因此必须始终默认为Else,除非它是2或3或您列出的其他数字之一。 我想到的第一个问题是你为什么不使用这个词。在Word文档中使用Word表格。 其次,你的想法无法实现。识别“我去了吗?”或“我是中间人”中的动词是一项艰巨的任务。不要期望它在一个数字下降时由单词来执行。 第三,您似乎希望提取大部分单词。为什么不先提取所有单词,然后列出你想排除的单词并过滤掉呢。 最后,您的数组(“.”、“,”、“;”)看起来很复杂。以下结构的篇幅较小

PuncChars = ".,;" 
and
For i = 1 to Len(PuncChars)
    Txt = Replace(Txt, Mid(PuncChars, i, 1), "")
Next i
您可以使用非常类似的系统过滤掉不想提取的单词。

以下是新代码:
here is the new code now:

Option Explicit
Sub MakeWordList()
    Dim mObjWord As Word.Application
    Dim mySynInfo As Word.SynonymInfo
    Dim InputSheet As Worksheet
    Dim PuncChars As Variant, x As Variant
    Dim i As Long, r As Long, j As Long
    Dim txt As String
    Dim oString As String
    Dim myList As Variant
    Dim myPos As Variant
    Dim skipWord As Boolean

    Set mObjWord = CreateObject("Word.Application")

    Application.ScreenUpdating = True
    Set InputSheet = ActiveSheet
    InputSheet.Activate
    PuncChars = Array(".", ",", ";", ":", "'", "!", "#", _
        "$", "%", "&", "(", ")", " - ", "_", "--", "+", _
        "=", "~", "/", "\", "{", "}", "[", "]", """", "?", "*")
    r = 1
    oString = ""
    'Loop until blank cell is encountered and add the word to oString

    Do While Cells(r, 1) <> ""
        txt = Cells(r, 1)
        For i = 0 To UBound(PuncChars)
            txt = Replace(txt, PuncChars(i), "")
        Next i
        'Remove excess spaces
        txt = WorksheetFunction.Trim(txt)
        'Extract the words
        x = Split(txt)
        For i = 0 To UBound(x)
        ' getting insufficient memory error at the following command after have
        ' completed a few iteratons of the For loop successfully
            Set mySynInfo = SynonymInfo(Word:=x(i), LanguageID:=wdEnglishUS)
            If mySynInfo.MeaningCount <> 0 Then
                myList = mySynInfo.MeaningList
                myPos = mySynInfo.PartOfSpeechList
                For j = 1 To UBound(myPos)
                    Select Case myPos(j)
                        Case wdAdverb, wdVerb, wdConjunction, wdIdiom, wdInterjection, wdPronoun, wdPreposition
                            skipWord = True
                        Case Else
                            skipWord = False
                    End Select
                Next j
                If Not skipWord Then
                    oString = oString & " " & x(i)
                End If
            End If
        Next i
        InputSheet.Cells(r, 2).Value = oString
        r = r + 1
    Loop
End Sub
选项显式 子MakeWordList() Dim mObjWord作为Word.Application 将mysynfo设置为Word.SynonymInfo 将输入表作为工作表进行调整 变型为暗蓬卡,变型为x 我长,r长,j长 以字符串形式显示文本 像细绳一样变暗 Dim myList作为变体 Dim myPos作为变体 Dim skipWord作为布尔值 设置mObjWord=CreateObject(“Word.Application”) Application.ScreenUpdating=True 设置InputSheet=ActiveSheet 输入表。激活 PuncChars=数组(“.”、“,”、“;”、“:”、“'”、“!”、“#”_ "$", "%", "&", "(", ")", " - ", "_", "--", "+", _ "=", "~", "/", "\", "{", "}", "[", "]", """", "?", "*") r=1 oString=“” '循环,直到遇到空白单元格并将单词添加到oString “当单元格(r,1)”时执行” txt=单元格(r,1) 对于i=0至UBound(PuncChars) txt=替换(txt,PuncChars(i),“”) 接下来我 '删除多余的空格 txt=工作表函数.Trim(txt) "摘抄文字, x=拆分(txt) 对于i=0到UBound(x) '在执行以下命令后出现内存不足错误 '成功完成了For循环的几次迭代 设置mysynfo=SynonymInfo(Word:=x(i),LanguageID:=wdenglishhus) 如果mysynfo.MeaningCount为0,则 myList=mysynfo.MeaningList myPos=mysynfo.PartOfSpeechList 对于j=1至UBound(myPos) 选择案例myPos(j) 副词,动词,连词,成语,感叹词,代词,介词 斯基普沃德=真 其他情况 skipWord=False 结束选择 下一个j 如果不是skipWord那么 oString=oString&&&x(i) 如果结束 如果结束 接下来我 InputSheet.Cells(r,2).Value=oString r=r+1 环 端接头
RegEx将是一个更好的选择。我在a列的每个单元格中都有一个文本段落。我正在尝试删除某些词类,包括介词、动词、副词等以及标点符号,并将结果输入B列的相应单元格。我还选择了Microsoft Word参考库。我的程序不会超出“选择…”命令的范围运行。我需要有人给我建议。我是一个新手。请问一个实际问题在对代码做了一些更改后,我能够部分运行此代码,然后它停止运行,并显示运行时错误5824消息“内存或磁盘空间不足。你能看看这段代码并建议如何避免内存崩溃吗?:这是一个完全不同的问题,我不想参与其中,不是因为你的问题是一个后续问题,我不这样做,而是因为我不知道