#c# #ms-word #ms-office #vsto
#c# #ms-word #ms-office #vsto
Вопрос:
В office 2010, если вы записываете макрос для разделения экрана, вы получаете
ActiveWindow.SplitVertical = 50
Но если я сделаю то же самое в Office 2013, я получу
ActiveWindow.Panes(3).Activate
ActiveWindow.SplitVertical = 50
Чего я не понимаю, так это панели номер 3. Как это может быть, когда у меня, кажется, есть только 2 панели (после разделения экрана)? Также я удаляю разделение, затем снова запускаю макрос, он падает, что неудивительно, поскольку он пытается активировать панель, которая не существует, до того, как она разделила экран. Таким образом, запись макроса не дает того, что должна.
Это важно для меня, поскольку у меня есть проект c # vsto, который разделяет экран и выделяет определенный фрагмент текста на верхней панели и что-то еще на нижней панели. В Office 2010 это работало отлично, активируя панель 1 или панель 2 по мере необходимости, но не работает с Office 2013. Я нашел способ обойти это, если я активирую pane3, а не pane2, когда мне нужна нижняя панель, она делает то, что я хочу, но это кажется ненадежным, поскольку я не понимаю, что такое панель 2. Кто-нибудь может объяснить, что происходит, и посоветовать надежный способ активировать интересующую меня панель?
Ответ №1:
В Word 2013 коллекция панелей включает в себя некоторые, но не все панели задач Word в своих элементах. Например, панель навигации может отображать три типа информации: заголовки, страницы и результаты. При установке значения Заголовки эта панель не учитывается в коллекции панелей. При установке значения Pages оно учитывается в коллекции панелей.
Что еще более усложняет ситуацию, активированная панель, которая является членом коллекции Panes, иногда сохраняет свой индекс в коллекции в течение всего сеанса Word. Таким образом, если для панели навигации установлено значение Pages, используется в документе, а затем этот документ закрывается, на второй документ, открытый впоследствии, который разделяет его окно, все равно может повлиять индекс коллекции Panes, на который влияет использование панели навигации с первым документом. Я смог воспроизвести a Panes(3)
таким образом, а также с помощью панели навигации (настроенной на страницы), присутствующей на экране.
Я также смог создать Panes(4)
индекс и подозреваю, что более высокие номера индексов возможны из-за огромного разнообразия панелей задач (сноски, тезаурус, орфография и грамматика и т. Д.)
Однако можно активировать нужную панель документа с помощью кода. Свойство коллекции панелей Next
позволяет перемещаться между панелями документа. Кроме того, при разделении активного окна нижняя панель становится активной. Эта информация позволяет использовать приведенный ниже код VBA (который может быть адаптирован к C # для надстройки VSTO) для работы:
Sub SelectCorrectPane()
Dim DocPaneTop As Integer
Dim DocPaneBottom As Integer
Dim PaneCount As Integer
PaneCount = ActiveDocument.ActiveWindow.Panes.Count
'The Next property switches between document panes but
'if the user is clicked into a task pane when the code executes Next
'cycles through the task panes until it gets to the document pane
For i = 1 To PaneCount
ActiveDocument.ActiveWindow.ActivePane.Next.Activate
Next
ActiveWindow.SplitVertical = 50 'This activates bottom pane
DocPaneBottom = ActiveDocument.ActiveWindow.ActivePane.Index
ActiveDocument.ActiveWindow.ActivePane.Next.Activate 'this activates the top pane
DocPaneTop = ActiveDocument.ActiveWindow.ActivePane.Index
ActiveDocument.ActiveWindow.Panes(DocPaneTop).Activate
'Select text in top pane per OP
ActiveDocument.ActiveWindow.Panes(DocPaneBottom).Activate
'perform other actions in bottom pane per OP
End Sub
И последнее замечание: по какой-то неизвестной причине приведенный выше код не будет работать на моем компьютере при сокращении с помощью
With ActiveDocument.ActiveWindow
'code here
End With
хотя это может быть связано с моей настройкой.
Комментарии:
1. Большое вам спасибо, Джошва, это именно то, что мне было нужно. Что касается вашего последнего комментария по поводу оператора With, мне было проще изменить DocPaneTop и DocPaneBottom на тип Pane, а не integer . Затем установите их, установив DocPaneBottom = ActiveDocument . ActiveWindow. ActivePane Таким образом, когда вы ссылаетесь на них, все, что вам нужно указать, это: DocPaneBottom . Активировать еще раз спасибо
2. Рад, что это помогло @user3568495. Я согласен. Установка DocPaneTop / DocPaneBottom в качестве панели типов — это правильный путь. Чище, лучше использовать объектную модель, а код легче читать. Собирался отредактировать оригинальный ответ, но решил не делать этого, поскольку ваш комментарий очень понятен и, оставаясь как есть (я надеюсь), позволит будущим читателям лучше понять этот разговор.