<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=18547</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=18547&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBA: Непонятки с перехватом событий Word (WithEvents)».]]></description>
		<lastBuildDate>Sun, 01 Feb 2026 13:19:13 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163061#p163061</link>
			<description><![CDATA[<div class="quotebox"><cite>EgorS пишет:</cite><blockquote><p>Private Sub btnAction_Click()</p><p>&nbsp; &nbsp; Word_Events_UnRegister &#039; выключили перехват событий<br />&nbsp; &nbsp; Selection.Move Unit:=wdCharacter, Count:=1 &#039; сдвинули курсор на 1 символ вправо<br />&nbsp; &nbsp; Word_Events_Register &#039; включили перехват обратно</p><p>End Sub</p></blockquote></div><div class="codebox"><pre><code>
Private Sub btnAction_Click()

    Word_Events_UnRegister &#039; выключили перехват событий
Do_100
    Selection.Move Unit:=wdCharacter, Count:=1 &#039; сдвинули курсор на 1 символ вправо
Do_2000
    Word_Events_Register &#039; включили перехват обратно

End Sub

Function Do_(byval H)
Dim x as integer
for x=0 to H
Doevents
next 
end function
</code></pre></div><p><a href="xxxx://learn.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/doevents-function">xxxx://learn.microsoft.com/ru-ru/office … s-function</a></p>]]></description>
			<author><![CDATA[null@example.com (3wedsmncjklvjvd73734)]]></author>
			<pubDate>Sun, 01 Feb 2026 13:19:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163061#p163061</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163060#p163060</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p> Попробуйте добавить небольшую паузу</p></blockquote></div><br /><p>В своё время, я так ловил проблемы в прогах на медленных машинах. Там очень хорошо было видно как выполняется прога, потому что машины очень медленные... Из-за памяти. И поэтому что бы прога работала компы лезли в виртуальную память. И вот поэтому прекрасно было видно как и что там творилось в проге.</p><div class="quotebox"><cite>EgorS пишет:</cite><blockquote><p>(функция Timer в VBA) 10 секунд</p></blockquote></div><p>Не не так надо.<br />Там в VB и в VBA есть <br /></p><div class="codebox"><pre><code>Doevents</code></pre></div><p>Код останавливается и ждёт.. Обычно это делают что бы не было подвисания в циклах, и что бы юзер смог остановить цикл. В VBS такого нет, и пришлось писать собственную ожидалку с системным таймером. Хотя есть в VBS и sleep, но бывает он не срабатывает полностью как надо.</p>]]></description>
			<author><![CDATA[null@example.com (3wedsmncjklvjvd73734)]]></author>
			<pubDate>Sun, 01 Feb 2026 13:08:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163060#p163060</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163059#p163059</link>
			<description><![CDATA[<p>У меня тоже была мысль, что может быть там какая-то нестыковка по времени. Я пробовал добавлять паузу (ещё до того как спросил тут на форуме): отключаем обработчик -&gt; двигаем курсор -&gt; пауза (функция Timer в VBA) 10 секунд -&gt; включаем обработчик -- та же самая погань: как только пауза истекает происходит реакция на сдвиг курсора.</p><p>Но если делать все вручную (я писал уже про это, просто повторю для наглядности) отдельными кнопками: включили обработчик (кнопкой No1 на форме) -&gt; подвигали курсор (руками с клавы стрелками или отдельную кнопку можно сделать) -- перехват есть -&gt; выключили/или уничтожили обработчик (кнопкой No2 на форме) -&gt; подвигали курсор -- всё нормально: нет реакции на движение. А вот программно почему-то так не работает...</p>]]></description>
			<author><![CDATA[null@example.com (EgorS)]]></author>
			<pubDate>Sun, 01 Feb 2026 11:30:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163059#p163059</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163056#p163056</link>
			<description><![CDATA[<p>Не, мне вряд ли понадобится, никогда не писал на VBA. Предполагаю, проблема в том, что программное движение курсора происходит асинхронно, и получается, что следующая строчка выполняется, когда оно ещё только началось. Попробуйте добавить небольшую паузу после передвижения курсора.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 31 Jan 2026 22:54:10 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163056#p163056</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163055#p163055</link>
			<description><![CDATA[<p>В общем, попробовал я как вы предлагаете — с глобальным флагом (т.е. без уничтожения объекта-обработчика) — та же самая фигня: при включении флага (не реагировать) реакции нет (так и должно быть), но при выключении флага событие (имеется в виду событие ДО включения флага) перехватывается (так быть вроде бы по логике не должно, но так почему-то происходит).</p><p>Короче, добиться того, что мне надо, никак не получается (отключить обработчик, что-то сделать, включить снова).</p><p>Если есть желание и/или возможность поковыряться — могу выложить файл Word с примером.</p>]]></description>
			<author><![CDATA[null@example.com (EgorS)]]></author>
			<pubDate>Sat, 31 Jan 2026 19:19:19 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163055#p163055</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163052#p163052</link>
			<description><![CDATA[<p>Если нужно временно отключать выделение программно, то вместо отписки/подписки сделайте глобальный флаг, подавляющий действие в AppWord_WindowSelectionChange.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 30 Jan 2026 22:00:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163052#p163052</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163051#p163051</link>
			<description><![CDATA[<p>Перед тем, как задавать вопрос тут на форуме, я всё проверил. Всё там вызывается: если в моём коде выше убрать последнюю строку (Word_Events_Register), то будет как и должно быть: &quot;слово&quot; -- кликаем (допустим) перед первым &quot;о&quot; -- получаем: &quot;сл|ово&quot;.</p><p>Сначала (для отработки) я сделал на форме 2 вспомогательне кнопки (писал о них выше), одна включает перехват, другая выключает. В моём коде есть места, где мне надо отключить перехват, что-то сделать и потом включить его снова. Пока я делал это кнопками вручную всё было нормально, но когда стал делать программно (как и должно быть, ведь я же не буду потом в готовой программе руками тыкать кнопки включения/отключения перехвата) вылез вот такой странный глюк. Хотя может это и не глюк, а я просто что-то не понимаю в этом дурацком VBA …</p>]]></description>
			<author><![CDATA[null@example.com (EgorS)]]></author>
			<pubDate>Fri, 30 Jan 2026 21:14:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163051#p163051</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163050#p163050</link>
			<description><![CDATA[<p>Проверяйте, вызывается ли Word_Events_UnRegister в этом случае.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 30 Jan 2026 17:46:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163050#p163050</guid>
		</item>
		<item>
			<title><![CDATA[VBA: Непонятки с перехватом событий Word (WithEvents)]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=163049#p163049</link>
			<description><![CDATA[<p>Здравствуйте! Не могу разобраться с такими непонятками. Допустим, мне надо перехватывать клики в Word. Пусть есть форма &quot;myForm1&quot; с двумя кнопками:</p><p>&quot;Включить перехват&quot; -- запускает процедуру &quot;Word_Events_Register&quot; (её код см. ниже)<br />&quot;Выключить перехват&quot; -- запускает процедуру &quot;Word_Events_UnRegister&quot; (её код см. ниже)</p><p>Есть модуль класса &quot;clsWordEvents&quot; с таким кодом</p><div class="codebox"><pre><code>&#039; Этот объект (класс) нужен для перехвата событий Word.
&#039; В данном случаю он использ-ся для перехвата события
&#039; WindowSelectionChange (это когда кликаешь курсором в
&#039; разных местах)
&#039;
Option Explicit

Public WithEvents AppWord As Word.Application

Private Sub AppWord_WindowSelectionChange(ByVal Sel As Selection)

    Dim FontName As String
    Dim SymbCode As Integer
    Dim SymbCodeS As String

    FontName = Sel.Range.Font.Name

    If FontName &lt;&gt; &quot;Verdana&quot; Then
       &#039; шрифт не Verdana -- выходим
       Exit Sub
    End If
    &#039; Шрифт Verdana -- продолжаем

    &#039; выделяем смивол, по которому (перед которым) кликнули курсором
    &#039;
    If Sel.Type = wdSelectionIP Then
       Sel.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    End If

End Sub</code></pre></div><p>есть модуль &quot;Module1&quot; с кодом:</p><div class="codebox"><pre><code>Option Explicit

Private obWordEvents As clsWordEvents
&#039;
&#039; Объект класса clsWordEvents, после своего создания он будет
&#039; реагир на события Word (тут на событ WindowSelectionChange)
&#039;
&#039; NOTES:
&#039;
&#039; 1. чтобы это работало, в VBA-проекте должен быть класс
&#039;    clsWordEvents -- проверь!
&#039;
&#039; 2. создание obj obWordEvents -- в sub Word_Events_Register,
&#039;    уничтожен -- в sub Word_Events_UnRegister (после уничтож
&#039;    Word не будет реагир на событие WindowSelectionChange --
&#039;    это сделано для удобства, чтобы отключ. перехват событий
&#039;    когда это не нужно и мешает. Запуск этих SUB -- вручную
&#039;    из окна макросов Word.
&#039;

Sub Word_Events_Register()

    &#039; Создает объект (обработчик событий), перехватывающий события
    &#039; Word (в данном случае это будет событ WindowSelectionChange)

    If Not obWordEvents Is Nothing Then
       &#039; ветка, когда объект-обработчик событий Word уже
       &#039; существует, so его создавать не надо -- выходим.
       &#039;
       &#039; MsgBox &quot;Обработчик событий уже был создан&quot; &amp; Chr(13) &amp; _
       &#039; &quot;и не требует повторной регистрации&quot; &amp; Chr(13) &amp; _
       &#039; &quot;(просто выходим).&quot;
       Exit Sub
    End If

    Set obWordEvents = New clsWordEvents
    Set obWordEvents.AppWord = Word.Application

End Sub

Sub Word_Events_UnRegister()

    &#039; Уничтожает объект (если он ранее был создан запуском
    &#039; Word_Events_Register), перехватывающий события Word.
    &#039; Я сделал это просто для удобства, чтобы при необходимости
    &#039; отключать перехват событий.

    If obWordEvents Is Nothing Then
       &#039; ветка, когда объект-обработчик событий Word не
       &#039; существует, so его уничтожать не надо -- выход.
       &#039;
       &#039; MsgBox &quot;Обработчик событий не существует,&quot; &amp; Chr(13) &amp; _
       &#039; &quot;поэтому его уничтожение не нужно.&quot; &amp; Chr(13) &amp; _
       &#039; &quot;(просто выходим).&quot;
       Exit Sub
    End If
    Set obWordEvents = Nothing

End Sub</code></pre></div><p>Есть модуль &quot;FormsView&quot; с кодом:</p><div class="codebox"><pre><code>Option Explicit

&#039; В этом модуле Е макросы для отображения или скрытия
&#039; разного рода диалоговых окон (форм, сообщений итп.)

Sub myForm1_Show()
    myForm1.Show &#039; отображ. форму myForm1
End Sub</code></pre></div><p>Теперь делаем следующее. Выводим форму &quot;myForm1&quot; (запуском в окне макросов процедуры&nbsp; &quot;myForm1_Show&quot;). Жмём кнопку &quot;Включить перехват&quot; (сработает процедура &quot;Word_Events_Register&quot;). Кликаем по тексту в Word и после клика курсор превращается в выделение — примерно так: &quot;сл|ово&quot; --&gt; &quot;сл[о]во&quot; (&quot;|&quot; означает курсор, а &quot;[]&quot; выделение).</p><p>Жмем кнопку &quot;Выключить перехват&quot; (сработает процедура &quot;Word_Events_UnRegister&quot;) и теперь при кликах выделения не будет: &quot;сл|ово&quot;. — Всё так как мне и надо, это понятно и нормально.</p><p>Допустим теперь, что на форме есть третья кнопка &quot;Action&quot; (название условное), которая запускает такой код:</p><div class="codebox"><pre><code>Private Sub btnAction_Click()

    Word_Events_UnRegister &#039; выключили перехват событий
    Selection.Move Unit:=wdCharacter, Count:=1 &#039; сдвинули курсор на 1 символ вправо
    Word_Events_Register &#039; включили перехват обратно

End Sub</code></pre></div><p>То есть тут по идее происходит то же самое, что было описано выше с нажатием кнопок, только отключение/включение перехвата событий делается не вручную (кнопками), а программно прямым запуском соотв-х процедур. Но вот тут и возникают лютые непонятки: при этом после клика получается так:</p><p>&quot;сл|ово&quot; --&gt; &quot;сл[о]во&quot;<br />-- а должно быть (по идее) так: --<br />&quot;сл|ово&quot;</p><p>То есть такое впечатление, что движение курсора (Selection.Move) почему-то перехватывается, хотя перехват вроде бы выключен. Может кто-нибудь объяснить, почему так происходит?</p>]]></description>
			<author><![CDATA[null@example.com (EgorS)]]></author>
			<pubDate>Fri, 30 Jan 2026 11:26:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=163049#p163049</guid>
		</item>
	</channel>
</rss>
