词 | VBA - 如何在大纲视图中启动 Word - 恰好在您离开的地方打开?
Word | VBA - How to start Word in Outline view - opened exactly where you left off?
在 MsWord 中,即使光标的最后位置是自动保存的,您也可以通过 Shift+F5 在 re-opening 文档中调用,
- 您不能将其设置为以大纲视图启动。
- 也不要在折叠的大纲视图上使用该书签或任何其他书签来跳转。
折叠大纲的书签位置不可见。
最接近的选择是打开大纲的所有级别,然后跳到书签上。
对于我们每天使用的几百页的科学文档来说,这是不能接受的,因为它大大降低了大纲编辑器的可用性。
Web-view 现在也有一个可折叠的 Heading-system(具有讽刺意味的是书签 goto 也可以正常工作),但是缺少真正的大纲视图所具有的其他重要功能。
似乎两个 sub-project 团队在 Office 开发团队中很难协作。
我好几天都没有在网上找到可行的解决方案,所以最后我坐下来想出了一个可靠的可行解决方案(在丢弃了 3 dead-end 个想法之后)。
我将 post 响应中的 VBA 代码片段。
对于我的解决方案,我必须为光标位置上方的每个标题级别创建一个单独的书签,以便能够在文档为 re-opened.
时一个一个地打开它们
注意:我在使用 range.goto 时遇到了一些问题,所以我现在不得不坚持操作选择。
有两个部分 - 一个用于保存位置和关闭文档,另一个用于正确打开它。 - 最好将它们放在 Normal.dot 个模块中。
DocumentClosing 宏:
Sub SaveAndClose()
Application.ScreenUpdating = False
Call IttTartok
ActiveDocument.Close savechanges:=True
Application.ScreenUpdating = True
End Sub
Private Sub IttTartok()
Application.ScreenUpdating = False
Dim Level As Variant
Dim InduloSel As Range, KereSel As Range
Dim myLevel As Long
'Delete all aiding bookmarks from the last save cycle.
If ActiveDocument.Bookmarks.Exists("IttL1") = True Then ActiveDocument.Bookmarks("IttL1").Delete
If ActiveDocument.Bookmarks.Exists("IttL2") = True Then ActiveDocument.Bookmarks("IttL2").Delete
If ActiveDocument.Bookmarks.Exists("IttL3") = True Then ActiveDocument.Bookmarks("IttL3").Delete
If ActiveDocument.Bookmarks.Exists("IttL4") = True Then ActiveDocument.Bookmarks("IttL4").Delete
If ActiveDocument.Bookmarks.Exists("IttL5") = True Then ActiveDocument.Bookmarks("IttL5").Delete
If ActiveDocument.Bookmarks.Exists("IttL6") = True Then ActiveDocument.Bookmarks("IttL6").Delete
If ActiveDocument.Bookmarks.Exists("IttL7") = True Then ActiveDocument.Bookmarks("IttL7").Delete
If ActiveDocument.Bookmarks.Exists("IttL8") = True Then ActiveDocument.Bookmarks("IttL8").Delete
If ActiveDocument.Bookmarks.Exists("IttL9") = True Then ActiveDocument.Bookmarks("IttL9").Delete
If ActiveDocument.Bookmarks.Exists("IttLAll") = True Then ActiveDocument.Bookmarks("IttLAll").Delete
'Save the cursor location in a Bookmark and check if it is a heading or Bodytext
ActiveDocument.Bookmarks.Add Range:=selection.Range, Name:="IttLAll"
myLevel = selection.Paragraphs(1).OutlineLevel
If myLevel = 10 Then
selection.GoTo wdGoToHeading, wdGoToPrevious, 1
myLevel = selection.Paragraphs(1).OutlineLevel
ActiveDocument.Bookmarks.Add Range:=selection.Range, Name:="IttL" & myLevel
End If
'Search for the upline headings of the original cursor location
For Level = myLevel - 1 To 1 Step -1
selection.Find.ClearFormatting
selection.Find.Style = ActiveDocument.Styles(((-(Level + 1))))
With selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = False
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
End With
'...and save the location of every upline heading in a separate Bookmark
If selection.Find.Found Then
ActiveDocument.Bookmarks.Add Range:=selection.Range, Name:="IttL" & Level
End If
Next
Application.ScreenUpdating = True
End Sub
...和 Opener 宏:
(注意:保留名称,新文档启动时自动执行所需的名称。)
Sub AutoOpen()
Application.ScreenUpdating = False
ActiveWindow.View = wdOutlineView
ActiveWindow.View.ShowHeading 1
Call WhereILeftOff
End If
Application.ScreenUpdating = True
End Sub
Private Sub WhereILeftOff()
Dim i As Variant
If ActiveDocument.Bookmarks.Exists("IttLAll") = True Then
For i = 1 To 9
If ActiveDocument.Bookmarks.Exists("IttL" & i) = True Then
ActiveWindow.View.ExpandOutline ActiveDocument.Bookmarks("IttL" & i).Range
Else
selection.GoTo wdGoToBookmark, , , "IttLAll"
selection.EndKey Unit:=wdLine, Extend:=wdMove
Exit For
End If
Next
End If
End Sub
在 MsWord 中,即使光标的最后位置是自动保存的,您也可以通过 Shift+F5 在 re-opening 文档中调用,
- 您不能将其设置为以大纲视图启动。
- 也不要在折叠的大纲视图上使用该书签或任何其他书签来跳转。
折叠大纲的书签位置不可见。
最接近的选择是打开大纲的所有级别,然后跳到书签上。
对于我们每天使用的几百页的科学文档来说,这是不能接受的,因为它大大降低了大纲编辑器的可用性。
Web-view 现在也有一个可折叠的 Heading-system(具有讽刺意味的是书签 goto 也可以正常工作),但是缺少真正的大纲视图所具有的其他重要功能。
似乎两个 sub-project 团队在 Office 开发团队中很难协作。
我好几天都没有在网上找到可行的解决方案,所以最后我坐下来想出了一个可靠的可行解决方案(在丢弃了 3 dead-end 个想法之后)。
我将 post 响应中的 VBA 代码片段。
对于我的解决方案,我必须为光标位置上方的每个标题级别创建一个单独的书签,以便能够在文档为 re-opened.
时一个一个地打开它们
注意:我在使用 range.goto 时遇到了一些问题,所以我现在不得不坚持操作选择。
有两个部分 - 一个用于保存位置和关闭文档,另一个用于正确打开它。 - 最好将它们放在 Normal.dot 个模块中。
DocumentClosing 宏:
Sub SaveAndClose()
Application.ScreenUpdating = False
Call IttTartok
ActiveDocument.Close savechanges:=True
Application.ScreenUpdating = True
End Sub
Private Sub IttTartok()
Application.ScreenUpdating = False
Dim Level As Variant
Dim InduloSel As Range, KereSel As Range
Dim myLevel As Long
'Delete all aiding bookmarks from the last save cycle.
If ActiveDocument.Bookmarks.Exists("IttL1") = True Then ActiveDocument.Bookmarks("IttL1").Delete
If ActiveDocument.Bookmarks.Exists("IttL2") = True Then ActiveDocument.Bookmarks("IttL2").Delete
If ActiveDocument.Bookmarks.Exists("IttL3") = True Then ActiveDocument.Bookmarks("IttL3").Delete
If ActiveDocument.Bookmarks.Exists("IttL4") = True Then ActiveDocument.Bookmarks("IttL4").Delete
If ActiveDocument.Bookmarks.Exists("IttL5") = True Then ActiveDocument.Bookmarks("IttL5").Delete
If ActiveDocument.Bookmarks.Exists("IttL6") = True Then ActiveDocument.Bookmarks("IttL6").Delete
If ActiveDocument.Bookmarks.Exists("IttL7") = True Then ActiveDocument.Bookmarks("IttL7").Delete
If ActiveDocument.Bookmarks.Exists("IttL8") = True Then ActiveDocument.Bookmarks("IttL8").Delete
If ActiveDocument.Bookmarks.Exists("IttL9") = True Then ActiveDocument.Bookmarks("IttL9").Delete
If ActiveDocument.Bookmarks.Exists("IttLAll") = True Then ActiveDocument.Bookmarks("IttLAll").Delete
'Save the cursor location in a Bookmark and check if it is a heading or Bodytext
ActiveDocument.Bookmarks.Add Range:=selection.Range, Name:="IttLAll"
myLevel = selection.Paragraphs(1).OutlineLevel
If myLevel = 10 Then
selection.GoTo wdGoToHeading, wdGoToPrevious, 1
myLevel = selection.Paragraphs(1).OutlineLevel
ActiveDocument.Bookmarks.Add Range:=selection.Range, Name:="IttL" & myLevel
End If
'Search for the upline headings of the original cursor location
For Level = myLevel - 1 To 1 Step -1
selection.Find.ClearFormatting
selection.Find.Style = ActiveDocument.Styles(((-(Level + 1))))
With selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = False
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
End With
'...and save the location of every upline heading in a separate Bookmark
If selection.Find.Found Then
ActiveDocument.Bookmarks.Add Range:=selection.Range, Name:="IttL" & Level
End If
Next
Application.ScreenUpdating = True
End Sub
...和 Opener 宏:
(注意:保留名称,新文档启动时自动执行所需的名称。)
Sub AutoOpen()
Application.ScreenUpdating = False
ActiveWindow.View = wdOutlineView
ActiveWindow.View.ShowHeading 1
Call WhereILeftOff
End If
Application.ScreenUpdating = True
End Sub
Private Sub WhereILeftOff()
Dim i As Variant
If ActiveDocument.Bookmarks.Exists("IttLAll") = True Then
For i = 1 To 9
If ActiveDocument.Bookmarks.Exists("IttL" & i) = True Then
ActiveWindow.View.ExpandOutline ActiveDocument.Bookmarks("IttL" & i).Range
Else
selection.GoTo wdGoToBookmark, , , "IttLAll"
selection.EndKey Unit:=wdLine, Extend:=wdMove
Exit For
End If
Next
End If
End Sub