VBA:Range.Find嵌套在另一个Range.Find中

时间:2016-06-01 21:25:17

标签: vba ms-word word-vba

在我的代码中,我使用Range.Find将单词文档拆分为多个,以选择文本正文(startoftext * endoftext),然后保存它。在这个选定的文本中,我试图使用嵌套的Range.Find'调用为粗体标题搜索选定的文本正文,并将其用作SaveAs [FileName]。

使用当前代码,除了嵌套的Range.Text之外,一切都有效,返回初始设置范围内的所有文本。

Sub DocSplitter()

Dim R As Range
Dim inR As Range
Set R = ActiveDocument.Range.Duplicate
Dim name As String
Application.ScreenUpdating = False

With R.Find
    .Text = "^m*^l^t^l" ' <- Copies all text from ^m to "^l^t^l"
    .MatchWildcards = True
    While .Execute
        Set inR = R.Duplicate '<- Setting Range equal to selected text range
        With inR.Find
            .Format = True
            .Font.Bold = True
            .Text = "^13([0-9]).([0-9])*^13^13" '<- Selecting header within
            .MatchWildcards = True
            .Execute
        End With
        CopyAndSave R, inR
    Wend
End With
R.Collapse wdCollapseEnd
R.End = R.Parent.Range.End
CopyAndSave R, inR

End Sub




Static Sub CopyAndSave(R As Range, inR As Range)
Dim D As Document
Dim Count As Long
Count = Count + 1
R.Copy
Set D = Documents.Add
D.Range.PasteAndFormat wdFormatOriginalFormatting
D.SaveAs R.Parent.Path & Application.PathSeparator & _
inR.Text, wdFormatFilteredHTML '<-- File Name ERROR: Too long
D.Close

End Sub

所以inR.Text返回R.Find.Execute选择的整个文本。 任何想法?

编辑:我更新了Set inR = R.Duplicate,谢谢你。我的问题原来是标题的格式问题。

2 个答案:

答案 0 :(得分:1)

当您将一个Range设置为另一个Range时,两个对象都指向完全相同的东西。这与我们在VBA中使用的其他所有内容不同,其中第二个对象成为第一个对象的独立副本。

为了基于另一个创建第二个Range,但与之无关,您需要var array = [{"name":"one","value":0.33},{"name":"one","value":0.54},{"name":"one"},{"name":"two","value":0.3},{"name":"two"},{"name":"two"},{"name":"three"},{"name":"three"},{"name":"three"}], obj = {} array.forEach(function(e) { if(!obj[e.name]) obj[e.name] = 0; if(typeof e.value == 'number') obj[e.name]+=1; }); var result = Object.keys(obj).some(e => { return obj[e] == 1}); console.log(result)属性。所以:

Duplicate

答案 1 :(得分:0)

如果设置Set inR = R然后在inR上执行find命令,R也会改变。这与Excel不同。如果您了解C语言,则将范围变量视为指针会有所帮助。使用Set inR = R意味着两个变量都指向同一个东西;改变一个,改变另一个。

解决这个问题的一种方法是在搜索之前将R.Start和R.End存储为整数,然后在完成内部搜索后,可以从activedocument.Range(r.Start,r.End)重新创建R.