<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; HTA: нанесение (расстановка) OMR-меток в файле MS Word]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=2612&amp;type=atom" />
	<updated>2008-12-31T11:51:01Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=2612</id>
		<entry>
			<title type="html"><![CDATA[Re: HTA: нанесение (расстановка) OMR-меток в файле MS Word]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=17729#p17729" />
			<content type="html"><![CDATA[<p><strong>OMR 1.5 RC1</strong>:</p><p>* окно HTA использует стандартные цвета установленной цветовой схемы: для фона — фон окна диалога («background-color: ButtonFace»), для текста — цвет переднего плана окна («color: WindowText»).<br />* для формирования нового имени документа используется компонент «Scripting.FileSystemObject».<br />+ теперь, чтобы переключить флажок печати содержимого документа после обработки, можно щёлкать и по имени принтера.<br />+ для информирования о завершении обработки используется мигание фоном окна («.backgroundColor = &quot;ActiveCaption&quot;/&quot;InactiveCaption&quot;» в процедуре «FlashBody») и звуковой сигнал («bgsound id=&quot;Sound&quot;…») на основе <a href="http://forum.script-coding.com/viewtopic.php?pid=7807#p7807">VBScript: воспроизведение аудио</a>. Мигание и звуковой сигнал останавливаваются при движении мышки над рабочим пространством окна приложения (процедура «FlashBodyStop»). Поддерживаются стандартные форматы *.wav и *.mid.<br /></p><div class="codebox"><pre><code>&lt;html id=&quot;appHTML&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;windows-1251&quot;&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
        &lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
        &lt;title&gt;Нанесение (расстановка) OMR-меток в файле MS Word&lt;/title&gt;
        &lt;hta:Application
            Icon = &quot;%ProgramFiles%\Microsoft Office\OFFICE11\WINWORD.EXE&quot;
            Id=&quot;oHTA&quot;
            ApplicationName=&quot;Нанесение (расстановка) OMR-меток в файле MS Word&quot;
            Border=&quot;normal&quot;
            BorderStyle=&quot;normal&quot;
            Caption=&quot;yes&quot;
            ContextMenu=&quot;no&quot;
            InnerBorder=&quot;yes&quot;
            MaximizeButton=&quot;no&quot;
            MinimizeButton=&quot;yes&quot;
            Navigable=&quot;no&quot;
            Scroll=&quot;auto&quot;
            ScrollFlat=&quot;no&quot;
            Selection=&quot;no&quot;
            ShowInTaskbar=&quot;yes&quot;
            SingleInstance=&quot;yes&quot;
            SysMenu=&quot;yes&quot;
            Version=&quot;1.5 RC1&quot;
            WindowState=&quot;normal&quot;
        /&gt;
        &lt;bgsound id=&quot;Sound&quot; Loop=&quot;1&quot; src=&quot;&quot;&gt;
        &lt;style type=&quot;text/css&quot;&gt;
            BODY {
                font: x-small Verdana, Arial, sans-serif;
                color: WindowText;
                background-color: ButtonFace;
            }
            .Row{
                clear:both;
            }
            .Left{
                float:Left;
                clear:none;
            }
            .Right{
                float:Right;
                clear:none;
            }
            .NonValid { color:FireBrick; }
            #Status { font: xx-small; }
        &lt;/style&gt;
        
        &lt;script language=&quot;VBScript&quot;&gt;
            Option Explicit
            
            &#039;----------------------------------------------------------------------
            Sub SetOMR_OnClick
                &#039; Если введённые данные корректны…
                If ValidateFields() Then
                    With document
                        .getElementByID(&quot;Status&quot;).innerText              = &quot;Идёт обработка…&quot;
                        
                        .getElementByID(&quot;SelFile&quot;).disabled              = True
                        .getElementByID(&quot;FindTextField&quot;).disabled        = True
                        .getElementByID(&quot;PrintAfterProcessing&quot;).disabled = True
                        .getElementByID(&quot;SetOMR&quot;).disabled               = True
                        
                        .getElementByID(&quot;tagBody&quot;).style.cursor          = &quot;wait&quot;
                    End With
                    
                    &#039; Опосредованно вызываем основную процедуру обработки документа
                    setTimeout &quot;SetOMR&quot;, 0
                End If
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            Sub SetOMR_OnBlur()
                &#039; При потере фокуса элементом SetOMR очистить строку статуса
                &#039; и стили элементов управления
                With document
                    .getElementByID(&quot;Status&quot;).innerText           = &quot;&quot;
                    
                    .getElementByID(&quot;lblSelFile&quot;).className       = &quot;&quot;
                    .getElementByID(&quot;SelFile&quot;).className          = &quot;&quot;
                    
                    .getElementByID(&quot;lblFindTextField&quot;).className = &quot;&quot;
                    .getElementByID(&quot;FindTextField&quot;).className    = &quot;&quot;
                End With
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            &#039; Функция проверки введённых данных на корректность
            &#039;----------------------------------------------------------------------
            Function ValidateFields()
                Dim objFSO
                Dim strFullFileName
                Dim strValidateResult
                
                Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
                
                ValidateFields    = True
                strValidateResult = &quot;&quot;
                
                With document
                    strFullFileName = .getElementByID(&quot;SelFile&quot;).value
                    
                    &#039; Указанный или введённый файл должен существовать и иметь расширение Doc/Rtf
                    If Not objFSO.FileExists(strFullFileName) Or Not ( _
                        UCase(objFSO.GetExtensionName(strFullFileName)) = &quot;DOC&quot; Or _
                        UCase(objFSO.GetExtensionName(strFullFileName)) = &quot;RTF&quot; _
                        ) Then
                        
                        strValidateResult = strValidateResult &amp; &quot;Выбран неверный файл. &quot;
                        
                        .getElementByID(&quot;lblSelFile&quot;).className       = &quot;NonValid&quot;
                        .getElementByID(&quot;SelFile&quot;).className          = &quot;NonValid&quot;
                        
                        ValidateFields = False
                    End If
                    
                    &#039; Уникальная фраза для поиска должна быть не пуста
                    If Len(document.getElementByID(&quot;FindTextField&quot;).value) = 0 Then
                        strValidateResult = strValidateResult &amp; &quot;Нужна фраза для поиска.&quot;
                        
                        .getElementByID(&quot;lblFindTextField&quot;).className = &quot;NonValid&quot;
                        .getElementByID(&quot;FindTextField&quot;).className    = &quot;NonValid&quot;
                        
                        ValidateFields = False
                    End If
                    
                    .getElementByID(&quot;Status&quot;).innerText = strValidateResult
                End With
                
                Set objFSO = Nothing
            End Function 
            &#039;----------------------------------------------------------------------
            
            &#039;Расстановка меток, основная процедура
            &#039;----------------------------------------------------------------------
            Sub SetOMR()
                Const wdActiveEndPageNumber        =   3 &#039; Константа из WdInformation
                Const wdCollapseStart              =   1 &#039; Константа из WdCollapseDirection
                Const wdGoToAbsolute               =   1 &#039; Константа из WdGoToDirection
                Const wdGoToPage                   =   1 &#039; Константа из WdGoToDirection
                Const msoTextOrientationHorizontal =   1 &#039; Горизонтальная ориентация текста
                
                Const TextBoxLeft                  =   0 &#039; Надпись. Отступ слева.
                Const TextBoxTop                   = 214 &#039; Надпись. Отступ сверху 
                Const TextBoxWidth                 =  40 &#039; Надпись. Ширина.
                Const TextBoxHeight                =  45 &#039; Надпись. Высота
                
                Const strSoundFileName             = &quot;tada.wav&quot;
                &#039;Const strSoundFileName             = &quot;flourish.mid&quot;
                
                Dim objWord                              &#039; Объект Microsoft Word
                Dim objFSO
                Dim PageDictTemp                         &#039; Временный словарь страниц с метками
                Dim PageDict                             &#039; Перенумерованный словарь
                Dim FindText                             &#039; Фраза для поиска
                Dim PrintStatus                          &#039; Текст для сообщения. Связан с ReadyToPrint.
                Dim StartTime                            &#039; Время начала операции расстановки меток.
                Dim PageCount                            &#039; Количество страниц в документе
                Dim ArrItems                             &#039; Массив элементов словаря PageDict
                Dim FileNameWithOMR                      &#039; Имя файла для сохранения
                Dim TextBox1                             &#039; Надпись с метками
                Dim strTwoLabels                         &#039; Строка с двумя метками    (для надписи)
                Dim strFourLabels                        &#039; Строка с четырьмя метками (для надписи)
                Dim strDocumentFullFileName
                Dim strDocumentNewFullFileName
                Dim strSoundFullFileName
                Dim i                                    &#039; Счётчик
                
                &#039;Создание объектов.
                Set objWord             = CreateObject(&quot;Word.Application&quot;)
                Set objFSO              = CreateObject(&quot;Scripting.FileSystemObject&quot;)
                Set PageDictTemp        = CreateObject(&quot;Scripting.Dictionary&quot;)
                Set PageDict            = CreateObject(&quot;Scripting.Dictionary&quot;)
                
                FindText                = document.getElementByID(&quot;FindTextField&quot;).value
                strDocumentFullFileName = document.getElementByID(&quot;SelFile&quot;).value
                
                &#039; Строка с двумя метками    (для надписи)
                strTwoLabels = _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    vbCrLf &amp; _
                    vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500)
                
                &#039; Строка с четырьмя метками (для надписи)
                strFourLabels = _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500)
                
                
                &#039;Время начала работы
                StartTime = Timer
                
                With objWord
                    &#039;Открытие документа
                    .Documents.Open(strDocumentFullFileName)
                    
                    &#039;Количество страниц
                    PageCount = .ActiveDocument.ActiveWindow.Panes(1).Pages.Count
                    
                    With .Selection
                        While .Find.Execute(FindText)
                            &#039;Формирование временного массива страниц с найденой фразой
                            PageDictTemp.Add .Information(wdActiveEndPageNumber), &quot;&quot;
                        Wend
                    End With
                    
                    &#039;Перенумерация
                    For i = 1 To PageCount
                        If PageDictTemp.Exists(i) Then
                            PageDict.Add i, i
                        Else
                            PageDict.Add i, 0
                        End If
                    Next
                    
                    PageDict.Add PageCount + 1, PageCount + 1
                    
                    ArrItems = PageDict.Items
                    
                    &#039;отключение проверки орфографии и пунктуации
                    With .Options
                        .CheckSpellingAsYouType = False
                        .CheckGrammarAsYouType  = False
                    End With
                    
                    With .ActiveDocument
                        .ShowGrammaticalErrors  = False
                        .ShowSpellingErrors     = False
                    End With
                    
                    &#039;&quot;Замораживание&quot;
                    .ScreenUpdating = False
                    .System.Cursor  = 0
                    
                    &#039;Перебор по всем страницам
                    For i = 1 To PageCount
                        document.getElementByID(&quot;Status&quot;).innerText = &quot;Обрабатывается страница &quot; &amp; CStr(i) &amp; &quot;.&quot;
                        
                        With .Selection
                            &#039;&quot;Сброс&quot; выделения и переход на страницу i
                            .Collapse wdCollapseStart
                            .GoTo wdGoToAbsolute, wdGoToPage, i
                        End With
                        
                        &#039;Создание надписи
                        Set Textbox1 = .ActiveDocument.Shapes.AddTextbox (msoTextOrientationHorizontal, TextBoxLeft, TextBoxTop, TextBoxWidth, TextBoxHeight)
                        
                        With Textbox1
                            &#039;Установка прозрачности границ и фона надписи
                            .Line.Transparency = 1
                            .Fill.Transparency = 1
                            
                            With .TextFrame.TextRange
                                &#039;Установка характеристик параграфа
                                With .ParagraphFormat
                                    .LineSpacingRule = 5
                                    .LineSpacing     = objWord.LinesToPoints(0.58)
                                End With
                                
                                &#039;Установка характеристик шрифта
                                With .Font
                                    .Name = &quot;Times New Roman&quot;
                                    .Size = 16
                                End With
                                
                                &#039;Нанесение меток.
                                &#039;Если (Страница не последняя) И (На следующей странице нет фразы) То
                                &#039;    Наносим 2 линии
                                &#039;Иначе
                                &#039;    Наносим 4 линии
                                &#039;Конец Если
                                If (i &lt; PageCount) And (ArrItems(i) = 0) Then
                                    .InsertAfter strTwoLabels
                                Else
                                    .InsertAfter strFourLabels
                                End If
                            End With
                        End With
                    Next
                    
                    &#039;&quot;Размораживаем&quot;
                    .System.Cursor  = 2
                    .ScreenUpdating = True
                    
                    &#039;Проверка, отправлять ли на печать
                    If document.getElementByID(&quot;PrintAfterProcessing&quot;).checked Then
                        PrintStatus = &quot;Отправлено на печать&quot;
                        .PrintOut
                    Else
                        PrintStatus = &quot;На печать не отправлено&quot;
                    End If
                    
                    &#039;Формирование нового имени
                    strDocumentNewFullFileName = objFSO.BuildPath( _
                        objFSO.GetParentFolderName(strDocumentFullFileName), _
                        objFSO.GetBaseName(strDocumentFullFileName) &amp; &quot;_OMR.&quot; &amp; _
                        objFSO.GetExtensionName(strDocumentFullFileName))
                    
                    &#039;Сохранение под новым именем и закрытие
                    .ActiveDocument.SaveAs strDocumentNewFullFileName
                    .ActiveDocument.Close
                End With
                
                &#039;Закрытие объекта
                objWord.Quit
                
                With document
                    &#039;Вывод собщения
                    .getElementByID(&quot;Status&quot;).innerText = &quot;На обработку затрачено: &quot; &amp; _
                        TimeSerial(0, 0, Timer - StartTime) &amp; &quot;. &quot; &amp; _
                        &quot;Файл сохранён как [&quot; &amp; strDocumentNewFullFileName &amp; &quot;]. &quot; &amp; PrintStatus &amp; &quot;.&quot;
                    
                    .getElementByID(&quot;SelFile&quot;).disabled              = False
                    .getElementByID(&quot;FindTextField&quot;).disabled        = False
                    .getElementByID(&quot;PrintAfterProcessing&quot;).disabled = False
                    .getElementByID(&quot;SetOMR&quot;).disabled               = False
                    
                    With .getElementByID(&quot;tagBody&quot;)
                        With .style
                            .cursor          = &quot;auto&quot;
                            &#039; Меняем цвет фона приложения
                            .backgroundColor = &quot;ActiveCaption&quot;
                        End With
                        
                        &#039; Задаём остановку индикации через вызов процедуры
                        &#039; «FlashBodyStop» при движении мышки над рабочим пространством приложения
                        .onmousemove = GetRef(&quot;FlashBodyStop&quot;)
                    End With
                    
                    &#039; Формируем имя звукового файла для воспроизведения
                    strSoundFullFileName = objFSO.BuildPath(objFSO.GetSpecialFolder(0), &quot;Media\&quot; &amp; strSoundFileName)
                    
                    &#039; Если указанный звуковой файл существует…
                    If objFSO.FileExists(strSoundFullFileName) Then
                        &#039; Опосредованно задаём звуковой файл для воспроизведения
                        &#039; через процедуру «PlaySound(…)»
                        setTimeout &quot;PlaySound(&quot;&quot;&quot; &amp; strSoundFullFileName &amp; &quot;&quot;&quot;)&quot;, 0
                    End If
                End With
                
                &#039; Для начала индикации фоном рабочего пространства приложения
                &#039; назначаем вызов процедуры «FlashBody()» каждые 0.5 секунды
                intIntervalID = setInterval(&quot;FlashBody()&quot;, 500)
                
                Set PageDict     = Nothing
                Set PageDictTemp = Nothing
                Set objFSO       = Nothing
                Set objWord      = Nothing
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            Sub PlaySound(strSoundFullFileName)
                &#039; Назначаем источник данных для тэга «BGSOUND», после чего
                &#039; начнётся фоновое воспроизведение звукового файла
                document.getElementByID(&quot;Sound&quot;).src = strSoundFullFileName
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            Sub FlashBody()
                With document.getElementByID(&quot;tagBody&quot;).style
                    &#039; Меняем цвет фона рабочего пространства приложения
                    &#039; «ActiveCaption» &lt;———&gt; «InactiveCaption»
                    Select Case UCase(.backgroundColor)
                        Case UCase(&quot;ActiveCaption&quot;)
                            .backgroundColor = &quot;InactiveCaption&quot;
                        Case UCase(&quot;InactiveCaption&quot;)
                            .backgroundColor = &quot;ActiveCaption&quot;
                        &#039; Если цвет какой-либо иной, останавливаем индикацию
                        &#039; (здесь больше возможный задел на будущее)
                        Case Else
                            FlashBodyStop
                    End Select
                End With
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            Sub FlashBodyStop()
                &#039; …останавливаем периодический вызов процедуры FlashBody
                clearInterval intIntervalID
                
                With document
                    With .getElementByID(&quot;tagBody&quot;)
                        &#039; Отключаем отслеживание перемещений мышки
                        .onmousemove           = Nothing
                           &#039; …задаём стандартный цвет фона рабочего пространства приложения
                        .style.backgroundColor = &quot;ButtonFace&quot;
                    End With
                    
                    &#039; …останавливаем воспроизведение фонового звука,
                    .getElementByID(&quot;Sound&quot;).src = &quot;&quot;
                End With
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            &#039; При щелчке мышки на имени принтера, переключить флажок печати
            &#039;----------------------------------------------------------------------
            Sub lblPrintAfterProcessing_OnClick()
                With document.getElementByID(&quot;PrintAfterProcessing&quot;)
                    .focus
                    .checked = Not .checked
                End With
            End Sub
            &#039;----------------------------------------------------------------------
        &lt;/script&gt;
    &lt;/head&gt;
    &lt;body id=&quot;tagBody&quot; scroll=&quot;auto&quot;&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;&lt;span id=&quot;lblSelFile&quot;&gt;1. Выберите файл .rtf или .doc&lt;/span&gt;&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;&lt;input type=&quot;File&quot; name=&quot;SelFile&quot; value=&quot;&quot; size=&quot;64&quot;&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;&lt;span id=&quot;lblFindTextField&quot;&gt;2. Введите уникальную фразу&lt;/span&gt;&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;&lt;input type=&quot;Text&quot; name=&quot;FindTextField&quot; value=&quot;&quot; size=&quot;40&quot;&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;span Class=&quot;Row&quot; id=&quot;SectionPrintAfterProcessing&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;3. Установите флажок для печати содержимого документа после обработки&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;
                    &lt;input type=&quot;CheckBox&quot; name=&quot;PrintAfterProcessing&quot;&gt;
                    &lt;span id=&quot;lblPrintAfterProcessing&quot;&gt;Печатать документ&lt;/span&gt;
                &lt;/span&gt;
            &lt;/span&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;&lt;span id=&quot;lblSetOMR&quot;&gt;4. Нажмите кнопку &quot;Расставить метки&quot;&lt;/span&gt;&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;&lt;input type=&quot;Button&quot; name=&quot;SetOMR&quot; value=&quot;Расставить метки&quot;&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;hr Class=&quot;Row&quot; /&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span id=&quot;Status&quot;&gt;&amp;nbsp;&lt;/span&gt;
            &lt;/span&gt;
    &lt;/body&gt;
    &lt;script language=&quot;VBScript&quot;&gt;
        Public intIntervalID
        
        Dim objSWbemServices
        Dim collSWbemObjectSet_Win32_Printer
        Dim objSWbemObjectEx_Win32_Printer
        
        Set objSWbemServices                 = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;)
        Set collSWbemObjectSet_Win32_Printer = objSWbemServices.ExecQuery(&quot;SELECT * FROM Win32_Printer WHERE Default = &#039;True&#039;&quot;)
        
        If collSWbemObjectSet_Win32_Printer.Count &lt;&gt; 0 Then
            For Each objSWbemObjectEx_Win32_Printer In collSWbemObjectSet_Win32_Printer
                With document
                    .getElementByID(&quot;SectionPrintAfterProcessing&quot;).style.display = &quot;inline&quot;
                    .getElementByID(&quot;lblPrintAfterProcessing&quot;).innerText         = objSWbemObjectEx_Win32_Printer.DeviceID
                    .getElementByID(&quot;PrintAfterProcessing&quot;).checked              = True
                End With
                
                Exit For
            Next
        Else
            With document
                .getElementByID(&quot;SectionPrintAfterProcessing&quot;).style.display = &quot;none&quot;
                .getElementByID(&quot;lblPrintAfterProcessing&quot;).innerText         = &quot;&quot;
                .getElementByID(&quot;PrintAfterProcessing&quot;).checked              = False
            End With
        End If
        
        Set collSWbemObjectSet_Win32_Printer = Nothing
        Set objSWbemServices                 = Nothing
        
        &#039;Позиционирование и изменение размера окна
        With window
            .resizeTo tagBody.scrollWidth + 25, tagBody.scrollHeight + 32
            .moveTo (.screen.availWidth - tagBody.offsetWidth) \ 2, (.screen.availHeight - tagBody.offsetHeight) \ 2
        End With
    &lt;/script&gt;
&lt;/html&gt;</code></pre></div><p>Авторы скрипта <strong>MikeSh</strong> и <strong>alexii</strong>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2008-12-31T11:51:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=17729#p17729</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: HTA: нанесение (расстановка) OMR-меток в файле MS Word]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=17727#p17727" />
			<content type="html"><![CDATA[<p><strong>OMR 1.4 RC0</strong>:</p><p>! если обработка займёт свыше 9 часов 6 минут и 8 секунд, скрипт сломается на функции TimeSerial . Также не учитывается переход через полночь.<br />* всё, что связано с печатью, — перенесено в саму форму. В принципе, ежели будет потребно, можно по аналогии вместо одного checkbox&#039;а для default-принтера добавить выбор принтера через тег &lt;INPUT TYPE=&quot;RADIO&quot;&gt;.<br />+ размер окна подгоняется под содержимое документа; значения «25» и «32» в:<br /></p><div class="codebox"><pre><code>.resizeTo tagBody.scrollWidth + 25, tagBody.scrollHeight + 32</code></pre></div><p>подобраны опытным путём для конкретных размеров шрифтов, dpi и темы оформления. Экспериментируйте.<br />* убрана работа с .Selection при добавлении надписей. Сокращён код.<br />* вместо отдельных «.InsertSymbol» и «.TypeParagraph» сразу добавляется готовая строка («strTwoLabels» и «strFourLabels»).<br />* убраны все MsgBox&#039;ы. Их логика переложена на саму форму.<br /></p><div class="codebox"><pre><code>&lt;html id=&quot;appHTML&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;windows-1251&quot;&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
        &lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
        &lt;title&gt;Нанесение (расстановка) OMR-меток в файле MS Word&lt;/title&gt;
        &lt;hta:Application
            Icon = &quot;%ProgramFiles%\Microsoft Office\OFFICE11\WINWORD.EXE&quot;
            Id=&quot;oHTA&quot;
            ApplicationName=&quot;Нанесение (расстановка) OMR-меток в файле MS Word&quot;
            Border=&quot;normal&quot;
            BorderStyle=&quot;normal&quot;
            Caption=&quot;yes&quot;
            ContextMenu=&quot;no&quot;
            InnerBorder=&quot;yes&quot;
            MaximizeButton=&quot;no&quot;
            MinimizeButton=&quot;yes&quot;
            Navigable=&quot;no&quot;
            Scroll=&quot;auto&quot;
            ScrollFlat=&quot;no&quot;
            Selection=&quot;no&quot;
            ShowInTaskbar=&quot;yes&quot;
            SingleInstance=&quot;yes&quot;
            SysMenu=&quot;yes&quot;
            Version=&quot;1.4 RC0&quot;
            WindowState=&quot;normal&quot;
        /&gt;
        &lt;style type=&quot;text/css&quot;&gt;
            BODY {
                font: x-small Verdana, Arial, sans-serif;
            }
            .Row{
                clear:both;
            }
            .Left{
                float:Left;
                clear:none;
            }
            .Right{
                float:Right;
                clear:none;
            }
            .NonValid { color:FireBrick; }
            #Status { font: xx-small; }
        &lt;/style&gt;
        
        &lt;script language=&quot;VBScript&quot;&gt;
            Option Explicit
            
            &#039;----------------------------------------------------------------------
            Sub SetOMR_OnClick
                If ValidateFields() Then
                    With document
                        .getElementByID(&quot;Status&quot;).innerText              = &quot;Идёт обработка…&quot;
                        
                        .getElementByID(&quot;SelFile&quot;).disabled              = True
                        .getElementByID(&quot;FindTextField&quot;).disabled        = True
                        .getElementByID(&quot;PrintAfterProcessing&quot;).disabled = True
                        .getElementByID(&quot;SetOMR&quot;).disabled               = True
                        
                        .getElementByID(&quot;tagBody&quot;).style.cursor          = &quot;wait&quot;
                    End With
                    
                    setTimeout &quot;SetOMR&quot;, 0
                End If
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            Sub SetOMR_OnBlur()
                With document
                    .getElementByID(&quot;Status&quot;).innerText           = &quot;&quot;
                    
                    .getElementByID(&quot;lblSelFile&quot;).className       = &quot;&quot;
                    .getElementByID(&quot;SelFile&quot;).className          = &quot;&quot;
                    
                    .getElementByID(&quot;lblFindTextField&quot;).className = &quot;&quot;
                    .getElementByID(&quot;FindTextField&quot;).className    = &quot;&quot;
                End With
            End Sub
            &#039;----------------------------------------------------------------------
            
            &#039;----------------------------------------------------------------------
            Function ValidateFields()
                Dim objFSO
                Dim strFullFileName
                Dim strValidateResult
                
                Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
                
                ValidateFields    = True
                strValidateResult = &quot;&quot;
                
                With document
                    strFullFileName = .getElementByID(&quot;SelFile&quot;).value
                    
                    If Not objFSO.FileExists(strFullFileName) Or Not ( _
                        UCase(objFSO.GetExtensionName(strFullFileName)) = &quot;DOC&quot; Or _
                        UCase(objFSO.GetExtensionName(strFullFileName)) = &quot;RTF&quot; _
                        ) Then
                        
                        strValidateResult = strValidateResult &amp; &quot;Выбран неверный файл. &quot;
                        
                        .getElementByID(&quot;lblSelFile&quot;).className       = &quot;NonValid&quot;
                        .getElementByID(&quot;SelFile&quot;).className          = &quot;NonValid&quot;
                        
                        ValidateFields = False
                    End If
                    
                    If Len(document.getElementByID(&quot;FindTextField&quot;).value) = 0 Then
                        strValidateResult = strValidateResult &amp; &quot;Нужна фраза для поиска.&quot;
                        
                        .getElementByID(&quot;lblFindTextField&quot;).className = &quot;NonValid&quot;
                        .getElementByID(&quot;FindTextField&quot;).className    = &quot;NonValid&quot;
                        
                        ValidateFields = False
                    End If
                    
                    .getElementByID(&quot;Status&quot;).innerText = strValidateResult
                End With
                
                Set objFSO = Nothing
            End Function 
            &#039;----------------------------------------------------------------------
            
            &#039;Расстановка меток, основная процедура
            &#039;----------------------------------------------------------------------
            Sub SetOMR()
                Const wdActiveEndPageNumber        =   3 &#039; Константа из WdInformation
                Const wdCollapseStart              =   1 &#039; Константа из WdCollapseDirection
                Const wdGoToAbsolute               =   1 &#039; Константа из WdGoToDirection
                Const wdGoToPage                   =   1 &#039; Константа из WdGoToDirection
                Const msoTextOrientationHorizontal =   1 &#039; Горизонтальная ориентация текста
                
                Const TextBoxLeft                  =   0 &#039; Надпись. Отступ слева.
                Const TextBoxTop                   = 214 &#039; Надпись. Отступ сверху 
                Const TextBoxWidth                 =  40 &#039; Надпись. Ширина.
                Const TextBoxHeight                =  45 &#039; Надпись. Высота
                
                Dim objWord                              &#039; Объект Microsoft Word
                Dim PageDictTemp                         &#039; Временный словарь страниц с метками
                Dim PageDict                             &#039; Перенумерованный словарь
                Dim FindText                             &#039; Фраза для поиска
                Dim PrintStatus                          &#039; Текст для сообщения. Связан с ReadyToPrint.
                Dim StartTime                            &#039; Время начала операции расстановки меток.
                Dim PageCount                            &#039; Количество страниц в документе
                Dim ArrItems                             &#039; Массив элементов словаря PageDict
                Dim FileNameWithOMR                      &#039; Имя файла для сохранения
                Dim TextBox1                             &#039; Надпись с метками
                Dim strTwoLabels                         &#039; Строка с двумя метками    (для надписи)
                Dim strFourLabels                        &#039; Строка с четырьмя метками (для надписи)
                Dim i                                    &#039; Счётчик
                
                &#039;Создание объектов.
                Set objWord = CreateObject(&quot;Word.Application&quot;)
                Set PageDictTemp = CreateObject(&quot;Scripting.Dictionary&quot;)
                Set PageDict = CreateObject(&quot;Scripting.Dictionary&quot;)
                
                FindText = document.getElementByID(&quot;FindTextField&quot;).value
                
                &#039; Строка с двумя метками    (для надписи)
                strTwoLabels = _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    vbCrLf &amp; _
                    vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500)
                
                &#039; Строка с четырьмя метками (для надписи)
                strFourLabels = _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500) &amp; vbCrLf &amp; _
                    ChrW(&amp;H2500) &amp; ChrW(&amp;H2500)
                
                
                &#039;Время начала работы
                StartTime = Timer
                
                With objWord
                    &#039;Открытие документа
                    .Documents.Open(document.getElementByID(&quot;SelFile&quot;).value)
                    
                    &#039;Количество страниц
                    PageCount = .ActiveDocument.ActiveWindow.Panes(1).Pages.Count
                    
                    With .Selection
                        While .Find.Execute(FindText)
                            &#039;Формирование временного массива страниц с найденой фразой
                            PageDictTemp.Add .Information(wdActiveEndPageNumber), &quot;&quot;
                        Wend
                    End With
                    
                    &#039;Перенумерация
                    For i = 1 To PageCount
                        If PageDictTemp.Exists(i) Then
                            PageDict.Add i, i
                        Else
                            PageDict.Add i, 0
                        End If
                    Next
                    
                    PageDict.Add PageCount + 1, PageCount + 1
                    
                    ArrItems = PageDict.Items
                    
                    &#039;отключение проверки орфографии и пунктуации
                    With .Options
                        .CheckSpellingAsYouType = False
                        .CheckGrammarAsYouType  = False
                    End With
                    
                    With .ActiveDocument
                        .ShowGrammaticalErrors  = False
                        .ShowSpellingErrors     = False
                    End With
                    
                    &#039;&quot;Замораживание&quot;
                    .ScreenUpdating = False
                    .System.Cursor  = 0
                    
                    &#039;Перебор по всем страницам
                    For i = 1 To PageCount
                        document.getElementByID(&quot;Status&quot;).innerText = &quot;Обрабатывается страница &quot; &amp; CStr(i) &amp; &quot;.&quot;
                        
                        With .Selection
                            &#039;&quot;Сброс&quot; выделения и переход на страницу i
                            .Collapse wdCollapseStart
                            .GoTo wdGoToAbsolute, wdGoToPage, i
                        End With
                        
                        &#039;Создание надписи
                        Set Textbox1 = .ActiveDocument.Shapes.AddTextbox (msoTextOrientationHorizontal, TextBoxLeft, TextBoxTop, TextBoxWidth, TextBoxHeight)
                        
                        With Textbox1
                            &#039;Установка прозрачности границ и фона надписи
                            .Line.Transparency = 1
                            .Fill.Transparency = 1
                            
                            With .TextFrame.TextRange
                                &#039;Установка характеристик параграфа
                                With .ParagraphFormat
                                    .LineSpacingRule = 5
                                    .LineSpacing     = objWord.LinesToPoints(0.58)
                                End With
                                
                                &#039;Установка характеристик шрифта
                                With .Font
                                    .Name = &quot;Times New Roman&quot;
                                    .Size = 16
                                End With
                                
                                &#039;Нанесение меток.
                                &#039;Если (Страница не последняя) И (На следующей странице нет фразы) То
                                &#039;    Наносим 2 линии
                                &#039;Иначе
                                &#039;    Наносим 4 линии
                                &#039;Конец Если
                                If (i &lt; PageCount) And (ArrItems(i) = 0) Then
                                    .InsertAfter strTwoLabels
                                Else
                                    .InsertAfter strFourLabels
                                End If
                            End With
                        End With
                    Next
                    
                    &#039;&quot;Размораживаем&quot;
                    .System.Cursor  = 2
                    .ScreenUpdating = True
                    
                    &#039;Проверка, отправлять ли на печать
                    If document.getElementByID(&quot;PrintAfterProcessing&quot;).checked Then
                        PrintStatus = &quot;Отправлено на печать&quot;
                        .PrintOut
                    Else
                        PrintStatus = &quot;На печать не отправлено&quot;
                    End If
                    
                    &#039;Формирование нового имени
                    FileNameWithOMR = Left(SelFile.Value, Len(SelFile.Value) - 4) &amp; &quot;_OMR&quot; &amp; Right(SelFile.Value, 4)
                    
                    &#039;Сохранение под новым именем и закрытие
                    .ActiveDocument.SaveAs FileNameWithOMR
                    .ActiveDocument.Close
                End With
                
                &#039;Закрытие объекта
                objWord.Quit
                
                Set objWord = Nothing
                
                With document
                    &#039;Вывод собщения
                    .getElementByID(&quot;Status&quot;).innerText = &quot;На обработку затрачено: &quot; &amp; _
                        TimeSerial(0, 0, Timer - StartTime) &amp; &quot;. &quot; &amp; _
                        &quot;Файл сохранён как &quot; &amp; FileNameWithOMR &amp; &quot;. &quot; &amp; PrintStatus &amp; &quot;.&quot;
                    
                    .getElementByID(&quot;SelFile&quot;).disabled              = False
                    .getElementByID(&quot;FindTextField&quot;).disabled        = False
                    .getElementByID(&quot;PrintAfterProcessing&quot;).disabled = False
                    .getElementByID(&quot;SetOMR&quot;).disabled               = False
                    
                    .getElementByID(&quot;tagBody&quot;).style.cursor          = &quot;auto&quot;
                End With
            End Sub
            &#039;----------------------------------------------------------------------
        &lt;/script&gt;
    &lt;/head&gt;
    &lt;body id=&quot;tagBody&quot; bgcolor=&quot;#afb0b0&quot; background=&quot;&quot; scroll=&quot;auto&quot;&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;&lt;span id=&quot;lblSelFile&quot;&gt;1. Выберите файл .rtf или .doc&lt;/span&gt;&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;&lt;input type=&quot;File&quot; name=&quot;SelFile&quot; value=&quot;C:\0002\q.doc&quot; size=&quot;64&quot;&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;&lt;span id=&quot;lblFindTextField&quot;&gt;2. Введите уникальную фразу&lt;/span&gt;&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;&lt;input type=&quot;Text&quot; name=&quot;FindTextField&quot; value=&quot;&quot; size=&quot;40&quot;&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;span Class=&quot;Row&quot; id=&quot;SectionPrintAfterProcessing&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;3. Установите флажок для печати содержимого документа после обработки&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;
                    &lt;input type=&quot;CheckBox&quot; name=&quot;PrintAfterProcessing&quot;&gt;
                    &lt;span id=&quot;lblPrintAfterProcessing&quot;&gt;Печатать документ&lt;/span&gt;
                &lt;/span&gt;
            &lt;/span&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span Class=&quot;left&quot;&gt;&lt;span id=&quot;lblSetOMR&quot;&gt;4. Нажмите кнопку &quot;Расставить метки&quot;&lt;/span&gt;&lt;/span&gt;
                &lt;span Class=&quot;right&quot;&gt;&lt;input type=&quot;Button&quot; name=&quot;SetOMR&quot; value=&quot;Расставить метки&quot;&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;hr Class=&quot;Row&quot; /&gt;
            &lt;span Class=&quot;Row&quot;&gt;
                &lt;span id=&quot;Status&quot;&gt;&amp;nbsp;&lt;/span&gt;
            &lt;/span&gt;
    &lt;/body&gt;
    &lt;script language=&quot;VBScript&quot;&gt;
        Dim objSWbemServices
        Dim collSWbemObjectSet_Win32_Printer
        Dim objSWbemObjectEx_Win32_Printer
        
        Set objSWbemServices                 = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;)
        Set collSWbemObjectSet_Win32_Printer = objSWbemServices.ExecQuery(&quot;SELECT * FROM Win32_Printer WHERE Default = &#039;True&#039;&quot;)
        
        If collSWbemObjectSet_Win32_Printer.Count &lt;&gt; 0 Then
            For Each objSWbemObjectEx_Win32_Printer In collSWbemObjectSet_Win32_Printer
                With document
                    .getElementByID(&quot;SectionPrintAfterProcessing&quot;).style.display = &quot;inline&quot;
                    .getElementByID(&quot;lblPrintAfterProcessing&quot;).innerText         = objSWbemObjectEx_Win32_Printer.DeviceID
                    .getElementByID(&quot;PrintAfterProcessing&quot;).checked              = True
                End With
                
                Exit For
            Next
        Else
            With document
                .getElementByID(&quot;SectionPrintAfterProcessing&quot;).style.display = &quot;none&quot;
                .getElementByID(&quot;lblPrintAfterProcessing&quot;).innerText         = &quot;&quot;
                .getElementByID(&quot;PrintAfterProcessing&quot;).checked              = False
            End With
        End If
        
        Set collSWbemObjectSet_Win32_Printer = Nothing
        Set objSWbemServices                 = Nothing
        
        &#039;Позиционирование и изменение размера окна
        With window
            .resizeTo tagBody.scrollWidth + 25, tagBody.scrollHeight + 32
            .moveTo (.screen.availWidth - tagBody.offsetWidth) \ 2, (.screen.availHeight - tagBody.offsetHeight) \ 2
        End With
    &lt;/script&gt;
&lt;/html&gt;</code></pre></div><p>Авторы скрипта <strong>MikeSh</strong> и <strong>alexii</strong>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2008-12-31T11:46:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=17727#p17727</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[HTA: нанесение (расстановка) OMR-меток в файле MS Word]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=17487#p17487" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>MikeSh пишет:</cite><blockquote><p><em>&quot;А не замахнуться ли нам на ВильЯма нашего, так сказать, Шекспира?&quot; (цитата из фильма, может и не точная).</em></p><p>Немного предыстории.</p><p>В конторе куча корреспонденции, для её упаковки приобретена конвертовальная машина. Ежели бы в каждый конверт ложилось фиксированное количество листов, то вопрос бы не возник… Машина умеет читать OMR-метки. Проблема в том, как их нанести.<br />Поясню. OMR-метки (<a href="http://en.wikipedia.org/wiki/Optical_mark_recognition">Optical mark recognition</a>) — это штрихи на полях. В моём случае 2 штриха на 1-й странице и 4 штриха на последней (или единственной). Наверное, видали такие на документах, положим, из банка или счетах каких-нибудь. В общем, возникла у меня мысль написать скрипт для проставления сиих меток.</p><p>Файл представляет собой документ в формате Microsoft Word (.rtf или .doc), созданный программой, которая формирует уведомления о платежах и квитанции, и которая не умеет, а, по словам разработчиков, и не будет уметь, наносить OMR-метки.</p><p>Нужно пробежаться по нему 2 раза:<br />1. Поиск уникальной фразы, которая присутствует только на первом (или единственном) листе вложения (типа &quot;Адрес получателя&quot;) и запоминание массива страниц с этой фразой.<br />2. Расставление меток. Внесение в документ на поля элемента типа «Надпись», в котором содержится штрих.</p><p>Предположим, выгрузилось 100 уведомлений, у 10 нет квитанций (всё оплачено), у 50 есть квитанция на одном листе, у 40 есть квитанция на 2 листах. Всего получилось 10*1 + 50*2 + 40*3 = 230 страниц. Все уведомления идут по порядку, т.е. уведомление + квитанция … квитанция,&nbsp; уведомление, уведомление + квитанция и т.д. На странице с уведомлением есть уникальная фраза «время работы», на квитанциях её нет.</p><p>Алгоритм расстановки следующий.<br />Если (страница последняя) или (на следующей странице есть фраза) То<br />&nbsp; Ставь 4 полоски<br />Иначе<br />&nbsp; Ставь 2 полоски<br />Конец Если</p><p>Машина делает следующее.<br />Берёт лист, &quot;смотрит&quot; метку.<br />Если 2 полоски, то следующую.<br />Если 4, то запечатывает весь набор в конверт.</p><p>Это наипростейший пример реализации OMR.</p></blockquote></div><p><strong>OMR 1.3</strong><br /></p><div class="codebox"><pre><code>&lt;html id=&quot;appHTML&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;windows-1251&quot;&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=windows-1251&quot;&gt;
    &lt;meta http-equiv=&quot;Content-Language&quot; content=&quot;ru&quot;&gt;
    &lt;title&gt;OMR-метки.&lt;/title&gt;
    &lt;hta:Application
      Icon = &quot;&quot; 
      Id=&quot;oHTA&quot;
      ApplicationName=&quot;OMR&quot;
      Border=&quot;Dialog&quot;
      BorderStyle=&quot;Raised&quot;
      Caption=&quot;yes&quot;
      ContextMenu=&quot;no&quot;
      InnerBorder=&quot;yes&quot;
      MaximizeButton=&quot;no&quot;
      MinimizeButton=&quot;yes&quot;
      Navigable=&quot;no&quot;
      Scroll=&quot;no&quot;
      ScrollFlat=&quot;no&quot;
      Selection=&quot;yes&quot;
      ShowInTaskbar=&quot;yes&quot;
      SingleInstance=&quot;yes&quot;
      SysMenu=&quot;yes&quot;
      Version=&quot;1.3&quot;
      WindowState=&quot;normal&quot;

    /&gt;

    &lt;style type=&quot;text/css&quot;&gt;
      .h2 {
        color:#000000;
        font: 17px; &quot;Trebuchet MS&quot;, Verdana, Arial, Helvetica, sans-serif;
          }
      .readonly {
        background-color : #afb0b0;
        color : #000000;
        font: 15px; &quot;Trebuchet MS&quot;, Verdana, Arial, Helvetica, sans-serif;
        border: none;
                }
      .Capts {
        background-color : #afb0b0;
        color : #000000;
        font: 11px; &quot;Trebuchet MS&quot;, Verdana, Arial, Helvetica, sans-serif;
        border: none;
                }
      .copyright {
        color: #201868;
        font: normal 11px Verdana, Arial, Helvetica, sans-serif;
                 }
          a.copyright {
            color: #02036A;
            text-decoration: none;
                      }
          a.copyright:hover {
            color: #000000;
            text-decoration: underline;
                            }

    input {
      color : #02036A;
      font: normal 11px Verdana, Arial, Helvetica, sans-serif;
      padding: 0px 5px;
                                   }

    input.mainoption {
      background-color : #D4DB09;
      border-color : #0E0889;
      font-weight : bold;
                     }

    &lt;/style&gt;

    &lt;script language=&quot;VBScript&quot;&gt;

      &#039;Что ж, будем объявлять переменные...
      Option Explicit

      &#039;----------------------------------------------------------------------
  
      Sub SetWindowPosition(intWindowWidth, intWindowHeight)

        &#039;Позиционирование и изменение размера окна

        With window

          .resizeTo intWindowWidth, intWindowHeight
          .moveTo (.screen.availWidth - intWindowWidth) \ 2, (.screen.availHeight - intWindowHeight) \ 2

        End With

      End Sub

      &#039;----------------------------------------------------------------------
  
      Sub SelFile_OnChange

        &#039;Проверка выбранного файла
    
        If LCase(Right(SelFile.Value, 4)) &lt;&gt; &quot;.doc&quot; And LCase(Right(SelFile.Value, 4)) &lt;&gt; &quot;.rtf&quot; Then
          MsgBox &quot;Выбран неверный файл&quot;
          SelFile.Value =&quot;&quot;
        End If

      End Sub

      &#039;----------------------------------------------------------------------
  
      Sub SetOMR_OnClick

        &#039;Расстановка меток

        &#039;Константы
        Const wdActiveEndPageNumber = 3 &#039;Константа из WdInformation
        Const wdCollapseStart = 1 &#039;Константа из WdCollapseDirection
        Const wdGoToAbsolute = 1 &#039;Константа из WdGoToDirection
        Const wdGoToPage = 1 &#039;Константа из WdGoToDirection
        Const msoTextOrientationHorizontal = 1 &#039;Горизонтальная ориентация текста
        Const TextBoxLeft = 0 &#039;Надпись. Отступ слева.
        Const TextBoxTop = 214 &#039;Надпись. Отступ сверху 
        Const TextBoxWidth = 40 &#039;Надпись. Ширина.
        Const TextBoxHeight = 45 &#039;Надпись. Высота

        &#039;Переменные
        Dim objWord &#039;Объект Microsoft Word
        Dim PageDictTemp &#039;Временный словарь страниц с метками
        Dim PageDict &#039;Перенумерованный словарь
        Dim FindText &#039;Фраза для поиска
        Dim objWMIService &#039;Обьект WMI
        Dim colInstalledPrinters &#039;Колекция установленных принтеров
        Dim objPrinter &#039;Принтер в коллекции
        Dim ReadyToPrint &#039;Отправить на печать. Булево.
        Dim PrintStatus &#039;Текст для сообщения. Связан с ReadyToPrint.
        Dim StartTime &#039;Время начала операции расстановки меток.
        Dim PageCount &#039;Количество страниц в документе
        Dim ArrItems &#039;Массив элементов словаря PageDict
        Dim FileNameWithOMR &#039;Имя файла для сохранения
        Dim TextBox1 &#039;Надпись с метками
        Dim i &#039;Счётчик

        &#039;Проверка на наличие фразы
    
        If FindTextField.Value = &quot;&quot; Then
          MsgBox &quot;Нужна фраза для поиска&quot;
          Exit Sub
        End If
    
        &#039;Проверка на наличие файла

        If SelFile.Value = &quot;&quot; Then
          MsgBox &quot;Файл не выбран&quot;
          Exit Sub
        End If

        &#039;Проверки пройдены. Создание объектов.

        Set objWord = CreateObject(&quot;Word.Application&quot;)
        Set PageDictTemp = CreateObject(&quot;Scripting.Dictionary&quot;)
        Set PageDict = CreateObject(&quot;Scripting.Dictionary&quot;)


        FindText = FindTextField.Value

        &#039;Имя принтера по умолчанию

        Set objWMIService = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;)

        Set colInstalledPrinters =  objWMIService.ExecQuery (&quot;Select * from Win32_Printer Where Default = True&quot;)

        For Each objPrinter In colInstalledPrinters

          &#039;Будет ли отправлено на печать
          Select Case MsgBox (&quot;Принтер по умолчанию : &quot; &amp; objPrinter.DeviceID &amp; VbCrLf &amp; &quot;Распечатать файл после обработки?&quot; &amp; VbCrLf &amp; &quot;(Убедитесь, что принтер включен)&quot;, vbYesNo+vbQuestion+vbSystemModal, &quot;Печать&quot;)
            Case vbYes : ReadyToPrint = True
          End Select

        Next

        PrintStatus = &quot;На печать не отправлено&quot;

        &#039;Время начала работы
        StartTime = Time

        With objWord
    
          &#039;Открытие документа
          .Documents.Open(SelFile.Value)
          
          &#039;Количество страниц
          PageCount = .ActiveDocument.ActiveWindow.Panes(1).Pages.Count

          With .Selection

            While .Find.Execute(FindText)
              &#039;Формирование временного массива страниц с найденой фразой
              PageDictTemp.Add .Information(wdActiveEndPageNumber), &quot;&quot;
            Wend

          End With

          &#039;Перенумерация

          For i = 1 To PageCount

            If PageDictTemp.Exists(i) Then
              PageDict.Add i, i
            Else
              PageDict.Add i, 0
            End If

          Next

          PageDict.Add PageCount + 1, PageCount + 1
  
          ArrItems = PageDict.Items
    
          &#039;отключение проверки орфографии и пунктуации

          With .Options

            .CheckSpellingAsYouType = False
            .CheckGrammarAsYouType = False
    
          End With
    
    
          With .ActiveDocument

            .ShowGrammaticalErrors = False
            .ShowSpellingErrors = False

          End With

          &#039;&quot;Замораживание&quot;

          .Application.ScreenUpdating = False
          .System.Cursor = 0

          &#039;Перебор по всем страницам

          For i = 1 To PageCount
    
            With .Selection

              &#039;&quot;Сброс&quot; выделения и переход на страницу i
              .Collapse wdCollapseStart
              .GoTo wdGoToAbsolute, wdGoToPage, i
    
            End With

            &#039;Создание надписи
            Set Textbox1 = .ActiveDocument.Shapes.AddTextbox (msoTextOrientationHorizontal, TextBoxLeft, TextBoxTop, TextBoxWidth, TextBoxHeight)

            With Textbox1

              &#039;Установка размера шрифта и прозрачности
              .TextFrame.TextRange.Font.Size = 16
              .Line.Transparency = 1
              .Fill.Transparency = 1

            End With
    
            With .Selection

            &#039;Нанесение меток.

            &#039;Если (Страница не последняя) И (На следующей странице нет фразы) То
            &#039;  Наносим 2 линии
            &#039;Иначе
            &#039;  Наносим 4 линии
            &#039;Конец Если

            If (i &lt; PageCount) And (ArrItems(i) = 0) Then
              Textbox1.TextFrame.TextRange.Select
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .TypeParagraph
              .TypeParagraph
              .TypeParagraph
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              Textbox1.TextFrame.TextRange.Select
            Else
              Textbox1.TextFrame.TextRange.Select
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .TypeParagraph
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .TypeParagraph
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .TypeParagraph
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              .InsertSymbol &amp;H2500, &quot;Times New Roman&quot;, True
              Textbox1.TextFrame.TextRange.Select
            End If

              &#039;Форматируем надпись
    
              With .ParagraphFormat

                .LineSpacingRule = 5
                .LineSpacing = objWord.LinesToPoints(0.58)

              End With
    
            End With

          Next

          &#039;&quot;Размораживаем&quot;
          .System.Cursor = 2
          .ScreenUpdating = True

          &#039;Проверка, отправлять ли на печать
          If ReadyToPrint Then
             PrintStatus = &quot;Отправлено на печать&quot;
            .PrintOut
          End If

          &#039;Формирование нового имени
          FileNameWithOMR = Left(SelFile.Value, Len(SelFile.Value) - 4) &amp; &quot;_OMR&quot; &amp; Right(SelFile.Value, 4)

          &#039;Сохранение под новым именем и закрытие
          .ActiveDocument.SaveAs FileNameWithOMR
          .ActiveDocument.Close

        End With

        &#039;Закрытие объекта
        objWord.Quit

        Set objWord = Nothing

        &#039;Вывод собщения
        MsgBox &quot;На обработку затрачено &quot; &amp; Int(DateDiff(&quot;s&quot;, StartTime, Time)\60) &amp; &quot; мин. &quot; &amp; DateDiff(&quot;s&quot;, StartTime, Time) - Int(DateDiff(&quot;s&quot;, StartTime, Time)\60) * 60 &amp; &quot; сек.&quot; &amp; vbCrLf &amp; &quot;Файл сохранён как &quot; &amp; FileNameWithOMR &amp; vbCrLf &amp; PrintStatus, vbSystemModal, &quot;Метки расставлены&quot;
    
      End Sub

      &#039;----------------------------------------------------------------------

    &lt;/script&gt;

  &lt;/head&gt;

  &lt;body id=&quot;tagBody&quot; bgcolor=&quot;#afb0b0&quot; background=&quot;&quot; scroll=&quot;no&quot; onload=&quot;SetWindowPosition 800, 230&quot;&gt;

    &lt;div align=&quot;center&quot;&gt;
      &lt;table border=&quot;1&quot; bgcolor=&quot;black&quot; width=&quot;100%&quot;&gt;
        &lt;tr&gt;
          &lt;td width=&quot;100%&quot; bgcolor=&quot;f8f9d4&quot;&gt;
            &lt;div align=&quot;center&quot;&gt;
              &lt;span class=&quot;h2&quot;&gt;Здесь может быть ваша реклама
              &lt;/span&gt;&lt;br&gt;
            &lt;/div&gt;
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
     &lt;br&gt;
    &lt;/div&gt;
    &lt;table align = center&gt;
      &lt;tr&gt; 
        &lt;td&gt;
          1) Выберите файл .rtf или .doc (кнопка &quot;Обзор...&quot;)
        &lt;td&gt;
        &lt;td align = center&gt;
          &lt;input type=&quot;File&quot; size = 20 name=&quot;SelFile&quot; Class = ReadOnly&gt;
        &lt;td&gt;
      &lt;/tr&gt;
      &lt;tr&gt; 
        &lt;td&gt;
          2) Введите уникальную фразу
        &lt;td&gt;
        &lt;td align = center&gt;
          &lt;input type=&quot;Text&quot; Value=&quot;уникальная фраза&quot; size = 25 name = &quot;FindTextField&quot;&gt;
        &lt;td&gt;
      &lt;/tr&gt;
      &lt;tr&gt; 
        &lt;td&gt;
          3) Нажмите кнопку &quot;Расставить метки&quot;
        &lt;td&gt;
        &lt;td align = center&gt;
          &lt;input type=&quot;Button&quot; Value=&quot;Расставить метки&quot; name=&quot;SetOMR&quot;&gt;
        &lt;td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;

  &lt;/body&gt;
&lt;/html&gt;</code></pre></div><p>Автор скрипта — <strong>MikeSh</strong>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2008-12-22T03:08:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=17487#p17487</id>
		</entry>
</feed>
