<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=11242&amp;type=atom" />
	<updated>2016-02-09T12:33:58Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=11242</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100958#p100958" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>P.S Вижу, что в большинстве случаев используют <strong>oFolderSrc.Items.Restrict</strong>. Т.е работают не c текущими сообщениями в каталоге, а с результатом фильтрации. Может это тоже решает проблему ?</p></blockquote></div><p><strong>Нет</strong>. С результатом фильтрации работать удобнее, т.к. мы можем заранее прикинуть какое кол-во сообщений будем перемещать. Но используя потом <span style="color: blue">For Each</span> для перемещения опять наступаем на те же грабли. Так что последний пример - вранье!<br />С двумя первыми вариантами можно поиграться, по логике должно работать, но тут (я уже начинаю капризничать) мы узнаем количество перемещенных сообщений только по окончании процесса.<br />Так что, самый лучший и надежный вариант:</p><div class="codebox"><pre><code>Set oOApp = CreateObject(&quot;Outlook.Application&quot;)
Set oSrcFolder = oOApp.GetNamespace(&quot;MAPI&quot;).Folders.Item(folder0)
Set oDestFolder = oOApp.GetNamespace(&quot;MAPI&quot;).Folders.Item(folder1)

WScript.Echo &quot;В исходной папке: &quot; &amp; oSrcFolder.Items.Count
WScript.Echo &quot;В получателе: &quot; &amp; oDestFolder.Items.Count

strFilter = &quot;[ReceivedTime] &lt; &#039;1/1/2016&#039;&quot;
Set oFilterRecItems = oSrcFolder.Items.Restrict(strFilter)

WScript.Echo &quot;Собираемся переместить: &quot; &amp; oFilterRecItems.Count

j = 0
For i = oFilterRecItems.Count To 1 Step -1
	Set Item = oFilterRecItems(i)
	If Left(Item.MessageClass, 8) = &quot;IPM.Note&quot; Then
		WScript.StdOut.Write Item.ReceivedTime &amp; vbCr
		Item.Move oDestFolder
		j = j + 1
	End If
Next

WScript.Echo &quot;                   &quot;
WScript.Echo &quot;Реально перемещено: &quot; &amp; j
WScript.Echo &quot;В исходной папке: &quot; &amp; oSrcFolder.Items.Count
WScript.Echo &quot;В получателе: &quot; &amp; oDestFolder.Items.Count
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-02-09T12:33:58Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100958#p100958</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100952#p100952" />
			<content type="html"><![CDATA[<p><strong>mozers</strong></p><p>Нашёл ещё несколько примеров реализации:</p><p>Тут решается за счёт метода <strong>FindNext</strong><br /><a href="https://msdn.microsoft.com/en-us/library/office/ff860683.aspx">https://msdn.microsoft.com/en-us/librar … 60683.aspx</a><br /></p><div class="codebox"><pre><code>
Dim myNameSpace As Outlook.NameSpace 
Dim myInbox As Outlook.Folder 
Dim myDestFolder As Outlook.Folder 
Dim myItems As Outlook.Items 
Dim myItem As Object 

Set myNameSpace = Application.GetNamespace(&quot;MAPI&quot;) 
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox) 
Set myItems = myInbox.Items 
Set myDestFolder = myInbox.Folders(&quot;Personal Mail&quot;) 
Set myItem = myItems.Find(&quot;[SenderName] = &#039;Dan Wilson&#039;&quot;) 
While TypeName(myItem) &lt;&gt; &quot;Nothing&quot; 
	myItem.Move myDestFolder 
	Set myItem = myItems.FindNext 
Wend 
</code></pre></div><p>Тут вообще как-то иначе решается: <a href="http://superuser.com/a/476193">http://superuser.com/a/476193</a></p><p>А тут всё-таки используют For Each. Интересно работает ли это ?<br /><a href="http://www.extendoffice.com/documents/outlook/1990-outlook-move-after-read.html">http://www.extendoffice.com/documents/o … -read.html</a></p><div class="codebox"><pre><code>Sub MoveInbox2Reviewed()
On Error Resume Next
Set oOutlook = CreateObject(&quot;Outlook.Application&quot;)
Set oNamespace = oOutlook.GetNamespace(&quot;MAPI&quot;)
Set oFolderSrc = oNamespace.GetDefaultFolder(olFolderInbox)
Set oFolderDst = oFolderSrc.Folders(&quot;Reviewed&quot;)
Set oFilteredItems = oFolderSrc.Items.Restrict(&quot;[UnRead] = False&quot;)
For Each oMessage In oFilteredItems
    oMessage.Move oFolderDst
Next
End Sub</code></pre></div><p>P.S Вижу, что в большинстве случаев используют <strong>oFolderSrc.Items.Restrict</strong>. Т.е работают не c текущими сообщениями в каталоге, а с результатом фильтрации. Может это тоже решает проблему ?</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2016-02-09T08:32:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100952#p100952</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100950#p100950" />
			<content type="html"><![CDATA[<p>Ошибка оказалась настолько банальной, что и признаться стыдно.<br />Её знают все, кто хотя бы раз пробовал удалять в цикле данные из массива.<br />И решение тут - классическое - удалять с конца, а не с начала.<br />Т.е. вместо <span style="color: blue">For Each Item In oSrcFolder.Items</span> следует писать<br /></p><div class="codebox"><pre><code>For i = oSrcFolder.Items.Count To 1 Step -1
	Set Item = oSrcFolder.Items(i)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-02-09T06:35:38Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100950#p100950</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100940#p100940" />
			<content type="html"><![CDATA[<p><strong>Xameleon</strong>, спасибо за идею. Нет не помогло, но заставило думать в правильном направлении.<br />&quot;Правильным направлением&quot; оказался подсчет кол-ва перемещаемых файлов.<br />Да, я дико извиняюсь. Задача изначально была сформулирована неверно. На самом деле мне надо не скопировать сообщения, а переместить их в другую папку. Я полагал что тут нет принципиальной разницы, поэтому и написал &quot;скопировать&quot;. На деле оказывается что в этом вся проблема.<br />Подсчет выявил престранную вещь: Если я копирую <span style="color: blue">Item.Copy.Move oDestFolder</span>, то в папку назначения попадают <span class="bbu">все</span> выбранные сообщения.<br />Если я меняю эту строчку на <span style="color: blue">Item.Move oDestFolder</span>, то в папку назначения перемещается <span class="bbu">ровно половина</span> из выбранных сообщений (точнее - каждое 2е). Походу что то я делаю неправильно...<br />P.S. Вариант сначала скопировать все файлы, а потом махом удалить на источнике скопированные прошу не предлагать.</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-02-08T18:04:56Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100940#p100940</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100914#p100914" />
			<content type="html"><![CDATA[<p><strong>mozers</strong>, предполагаю, что счётчик даст возможность определить <span class="bbu">момент</span> когда копирование текущего сообщения дошло до конца и можно переходить к следующему, а до того продолжать крутить цикл с ожиданием.</p><p>Если через Shell.Application производить копирование больших файлов, то на экране появляется прогрессбар. При этом &quot;за кулисами&quot; происходит создание временного файла в Temporary директории, и пока идёт процесс копирования, файл в конечном каталоге не появляется. Только по концу процесса происходит перемещение временного файла в конечную директорию с нужным именем. Поэтому иногда такую задачу решают с помощью счётчика. Проще говоря - мы начали копировать и нарастили счётчик <strong>i++</strong>. В нём уже значение 1. Теперь крутим цикл и проверяем когда <strong>items.Count</strong> сменится с 0 на 1. И так далее.</p><p>Я имею в виду нечто вроде этого:<br /></p><div class="codebox"><pre><code>
Option Explicit

Dim oOApp, oSrcFolder, oDestFolder, i
Set oOApp = CreateObject(&quot;Outlook.Application&quot;)
&#039;... 
&#039;Присвоение значений folder0, folder1
&#039;... 
Set oSrcFolder = oOApp.GetNamespace(&quot;MAPI&quot;).Folders.Item(folder0)
Set oDestFolder = oOApp.GetNamespace(&quot;MAPI&quot;).Folders.Item(folder1)
On Error Resume Next
For Each Item In oSrcFolder.Items
	If Left(Item.MessageClass, 8) = &quot;IPM.Note&quot; and Year(Item.CreationTime) &lt; 2016 Then
		WScript.Echo Item.CreationTime
		Item.Copy.Move oDestFolder
		i = i + 1
		While oDestFolder.Items.Count &lt; i
			WScript.Sleep 100
		Wend
	End If
Next
</code></pre></div><p>P.S Проверить опять же не могу, так как нет у меня аутлука (.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2016-02-07T14:04:52Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100914#p100914</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100886#p100886" />
			<content type="html"><![CDATA[<p><strong>Xameleon</strong><br />Не понимаю что мне даст счетчик. Я и без него знаю что часть сообщений почему то не копируется. Сравнивал копируемое сообщение с некопируемым по всем атрибутам. Нет никаких существенных различий! Непонимаю...<br />ИМХО - просто тупой баг Outlook.Application - самого глюкавого из всех майкрософтовских ActiveX.</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-02-06T15:44:47Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100886#p100886</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100852#p100852" />
			<content type="html"><![CDATA[<p>Предполагаю, что тут может быть так же как в случае работы с zip архивами через Shell.Application. Там процесс добавления элементов и извлечения асинхронный. Если файл большого размера, то он не успевает быстро извечься. В случае с письмами, думаю это может быть из-за объёмных вложений. Можно попробовать, наращивать счётчик копирования и проверять <strong>items.count</strong> в конечной папке. Вставить это в цикл со Sleep(100) и ждать совпадения количества файлов со счётчиком.</p><p>P.S но это лишь предположение. Проверить пока не на чем к сожалению.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2016-02-05T06:24:32Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100852#p100852</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100708#p100708" />
			<content type="html"><![CDATA[<p>Увы, тема не закрыта.<br />Обнаружилось что копируются не все сообщения. Почему ???<br />Удалил <span style="color: blue">On Error Resume Next</span>. Добавил запись в лог. Ошибок - нет, а копируется только 70% всех писем.<br />Это пипец какой то...</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-01-28T14:18:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100708#p100708</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100549#p100549" />
			<content type="html"><![CDATA[<p>Допетрил:<br />Все дело в том, что в почтовом ящике, помимо нормальных сообщений порой присутствует всякая хрень (например, отзывы сообщений). Когда Outlook, побуждаемый скриптом, доходит до копирования таких сообщений, то тогда он и выдает вышеупомянутый алерт &quot;<span style="color: blue">Невозможно открыть пользовательскую форму...</span>&quot;.<br />Как избавиться от этих назойливых алертов и обеспечить бесперебойное копирование? - очевидно копировать только &quot;нормальные&quot; сообщения, пропуская все остальное. Отличить обычные сообщения от всякой ерунды можно анализируя имя класса сообщения. В данном случае имя класса должно начинаться с текста &quot;<span style="color: blue">IPM.Note</span>&quot;:<br /></p><div class="codebox"><pre><code>If Left(Item.MessageClass, 8) = &quot;IPM.Note&quot; Then
  Item.Copy.Move oDestFolder
End If</code></pre></div><p>Вопрос решен!</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-01-20T11:42:56Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100549#p100549</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100525#p100525" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>mozers пишет:</cite><blockquote><p>на сервере Exchange</p></blockquote></div><p>Всё, понял какой сервер. Отбой.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2016-01-19T18:59:24Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100525#p100525</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100518#p100518" />
			<content type="html"><![CDATA[<p><strong>Flasher</strong><br />А Вы знаете способ копирования <em>почтовых сообщений Outlook</em> с помощью Shell.Application? Я - нет.</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-01-19T18:14:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100518#p100518</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100513#p100513" />
			<content type="html"><![CDATA[<p><strong>mozers</strong><br />Нет возможности тестировать. Вопрос только, чем альтернатива с Shell.Application не годна?</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2016-01-19T15:54:28Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100513#p100513</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS, Outlook: Копирование сообщений — как убить алерт?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=100509#p100509" />
			<content type="html"><![CDATA[<p>Outlook 2010. Простенький VBS скрипт копирует прошлогодние сообщения из одной папки (расположенной в ящике на сервере Exchange) в другую (расположенную в локальном pst-шнике).<br />Эпизодически, ни с того ни с сего, в Outlook всплывает сообщение:</p><div class="quotebox"><blockquote><p>Невозможно открыть пользовательскую форму. Вместо нее будет использована форма Outlook. Объект не поддерживает требуемое действие. [OK]</p></blockquote></div><p>и, пока его не ткнешь, скрипт висит на строке с копированием.<br />Что за бред? Какая нах &quot;пользовательская форма&quot;?<br />И, собственно, главный вопрос: Как предотвратить появление этого долбанного сообщения? <br /></p><div class="codebox"><pre><code>Set oOApp = CreateObject(&quot;Outlook.Application&quot;)
Set oSrcFolder = oOApp.GetNamespace(&quot;MAPI&quot;).Folders.Item(folder0)
Set oDestFolder = oOApp.GetNamespace(&quot;MAPI&quot;).Folders.Item(folder1)
On Error Resume Next
For Each Item In oSrcFolder.Items
  If Year(Item.CreationTime) &lt; 2016 Then
    WScript.Echo Item.CreationTime
    Item.Copy.Move oDestFolder
  End If
Next</code></pre></div><p>P.S. Хотя код VBS, запостил в треде VBA, т.к. полагаю что тематически это более верно. Да и в VBA можно использовать почти без изменений.</p>]]></content>
			<author>
				<name><![CDATA[mozers]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=4112</uri>
			</author>
			<updated>2016-01-19T12:45:01Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=100509#p100509</id>
		</entry>
</feed>
