【问题标题】:Extract text from string generated from selected endnotes从选定尾注生成的字符串中提取文本
【发布时间】:2017-11-02 22:03:38
【问题描述】:

在 Word 中,当我选择一个段落时,我需要一个 MsgBox 来显示尾注中某个部分的列表(即每个新行)。

下面的代码将在选择中显示一个带有完整尾注文本的 MsgBox,但我只希望在 MsgBox 中列出短语“Extracted material is from”和下一个分号之间的信息。 (下面的尾注示例以粗体显示)

尾注格式:

[1] 位置1文本;位置2文本;位置3文本;位置4文本;位置5文本; Position6 提取材料来自EDIBLE//FRUIT//APPPLES;位置7文本;位置8文本

[2] 位置1文本;位置2文本;位置3文本;位置4文本;位置5文本; Position6 提取的素材来自NONEDIBLE//FURNITURE//CHAIR;位置7文本;位置8文本

我想读取 MsgBox:

本段包含:

食用//水果//苹果

不可食用的//家具//椅子

Sub TestEndNoteMsg()
Dim e As Endnote
Dim str As String
For Each e In Selection.Endnotes
    str = str & e.Range.Text
Next e
MsgBox str
End Sub

【问题讨论】:

    标签: vba ms-word extract


    【解决方案1】:

    这没有优化,因此您可以更好地了解它是如何工作的。您可以轻松地将 InStr 函数嵌套到一行中,但它有点难以理解。

    您可以在下面看到您首先找到短语“Extracted material is from”的位置,并在该位置添加27个字符(字符串的长度 - 1)。这给了我们想要开始提取的字符位置。

    然后使用这个位置作为新的起点,找到下一个分号并将那个位置保存在lngEnd中。然后转换str,只提取你想要的数据。

    编辑 忘记了循环,我保护str,直到创建解析的字符串,然后将每个元素附加到变量中。我将str改为e.Range.Text,只处理当前尾注处理,避免截断之前的尾注。

    Sub TestEndNoteMsg()
    Dim e As Endnote
    Dim str As String
    Dim lngStart As Long
    Dim lngEnd As Long
    For Each e In Selection.Endnotes
        lngStart = InStr(1, e.Range.Text, "Extracted material is from ", 1) + 27
        lngEnd = InStr(lngStart, e.Range.Text, ";", 1)
        str = str & MID(e.Range.Text, lngStart, lngEnd - lngStart) & vbcrlf
    Next e
    MsgBox "This paragraph contains:" & vbcrlf & str
    End Sub
    

    【讨论】:

    • 感谢 Christopher - 我尝试了上面的代码,但得到了运行时错误 13:类型不匹配,调试器突出显示了这一行:lngStart = InStr(1, e.Range.Text, "Extracted material is from " + 28, 1)
    • 抱歉,不知道我在想什么。我已经更新了代码。
    • 克里斯托弗,这行得通,但它将“提取的材料来自”放在 MsgBox 中,而不仅仅是 EDIBLE//FRUIT//APPPLES。它也不会将每次提取放在 MsgBox 中的新行上。
    • 嗯,这很奇怪,你复制了最新的更新吗?它对我很有用。
    • 知道了 - 键盘和椅子之间存在问题...顺便说一句,两台机器的手卡住了。解决了!感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    相关资源
    最近更新 更多