在我的代码中,我使用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
,谢谢你。我的问题原来是标题的格式问题。
答案 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.