<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sleep | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/vba%E5%85%B1%E9%80%9A/other-application-operation/windowsapi-vbscript/sleep/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Sun, 14 Jun 2020 09:01:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://officevba.info/wp-content/uploads/2017/04/cropped-Excel_1-32x32.jpg</url>
	<title>Sleep | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<link>https://officevba.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>スリープしない状態を必要な時だけ維持するマクロ（VBA）</title>
		<link>https://officevba.info/preventsleepfile/</link>
					<comments>https://officevba.info/preventsleepfile/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Fri, 09 Sep 2016 13:44:09 +0000</pubDate>
				<category><![CDATA[Sleep]]></category>
		<category><![CDATA[キーボードイベント]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=671</guid>

					<description><![CDATA[目次 マクロ実行中以外の強制的なスリープ作成するスリープ防止マクロの機能DoEventsについて作成したファイルの説明①作成したフォーム②フォームのコード③ブックのイベントプロシージャ④標準モジュール マクロ実行中以外の [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">マクロ実行中以外の強制的なスリープ</a></li><li><a href="#toc2" tabindex="0">作成するスリープ防止マクロの機能</a></li><li><a href="#toc3" tabindex="0">DoEventsについて</a></li><li><a href="#toc4" tabindex="0">作成したファイルの説明</a><ol><li><a href="#toc5" tabindex="0">①作成したフォーム</a></li><li><a href="#toc6" tabindex="0">②フォームのコード</a></li><li><a href="#toc7" tabindex="0">③ブックのイベントプロシージャ</a></li><li><a href="#toc8" tabindex="0">④標準モジュール</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">マクロ実行中以外の強制的なスリープ</span></h2>
<p>私の勤めている会社のPCは情報漏洩防止のため、キーボードに触らないまま一定時間が過ぎるとセキュリティソフトが働いてPCをスリープ状態にします。</p>
<p>仕事で動画再生が必要な同僚から「PCで動画の再生中にスリープになって困る」との相談があったのでそれを解決するためのマクロ（VBA）を作成しました。<br />
その作成したスリープを禁止するVBAコードについて紹介します。</p>
<h2><span id="toc2">作成するスリープ防止マクロの機能</span></h2>
<p>強制的なスリープが困ると相談があった同僚の要望を解決するために必須の機能は以下の3点です。</p>
<p>①マクロやVBAに詳しくない人でも簡単に実行できること<br />
②他のパソコン操作に関して影響を及ぼさず、きちんと動画が再生できること<br />
③自由なタイミングで開始・終了できること</p>
<p>「①誰でも簡単に実行できること」はボタンを作成して実行したりストップしたりすることで解決できます。</p>
<p>「②の他の操作に影響を及ぼさないこと」はスリープを防止するためのキー操作をなるべく影響の少ないキーにして、回数もあまり頻繁にしないようにすれば問題ありません。これは前回のCtrlキーを押すコードをVBA中に挿入して、スリープを防止するというコードを応用して解決しています。</p>
<p>「③の自由なタイミングで開始・終了ができること」が今回最も苦戦した部分です。<br />
通常VBAやマクロを実行したときはコードの最後まで実行されるか、決めたタイミングで中断するものなので、自由なタイミングで終了するのは難しいです。<br />
Escapeキーで強制終了するのも難しいこともあります。</p>
<p>この問題は（1）フォームを作成して、ボタンを押しやすくしたことと、（2）「DoEvents」というコードを使用して、フォーム中のボタンをクリックできるようにしたことの2つのアイデアで解決しました。</p>
<h2><span id="toc3">DoEventsについて</span></h2>
<p>DoEventsはコードの処理中に操作をWindows側に戻すというコードです。<br />
時間のかかる処理などでは通常では処理が終わるまで新たな操作を行うことができませんが、このコードをいれておくことにより、コードの実行中の時間にボタンを押したり何か別の操作ができるようになります。</p>
<h2><span id="toc4">作成したファイルの説明</span></h2>
<h3><span id="toc5">①作成したフォーム</span></h3>
<p>ボタンは2つで、一つはスリープ禁止を開始するボタン・もう一つはスリープ禁止コードを中断するボタンです。<br />
VBAコードは以下の②のようになっています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2016/09/40-001.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2016/09/40-001-300x119.jpg" alt="40-001" width="300" height="119" class="alignnone size-medium wp-image-674" srcset="https://officevba.info/wp-content/uploads/2016/09/40-001-300x119.jpg 300w, https://officevba.info/wp-content/uploads/2016/09/40-001-320x127.jpg 320w, https://officevba.info/wp-content/uploads/2016/09/40-001.jpg 376w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<h3><span id="toc6">②フォームのコード</span></h3>
<p>フォームのコードはスリープ禁止ボタンをクリックするとずっと無限ループで続きますが、停止ボタンを押すと「StopFlag」という変数がTrueになって無限ループから抜けてコードが終了するというものです。「終了前に終了しますか？」と質問されて「はい」を選択するとコードが終了します。</p>
<div class="VBACode">
Dim StopFlag As Boolean<br />
Private Sub スリープ禁止_Click()<br />
<span class="VBA_Tab1">Dim i As Long</span><br />
<span class="VBA_Tab1">StopFlag = False</span><br />
<span class="VBA_Tab1">Cells(1, 1) = &#8220;&#8221;</span><br />
<span class="VBA_Tab1">Do Until Cells(2, 1) <> &#8220;&#8221;</span><br />
<span class="VBA_Tab2">Cells(1, 1) = Cells(1, 1) + 1</span><br />
<span class="VBA_Tab2">If Cells(1, 1) = 1001 Then</span><br />
<span class="VBA_Tab3">Cells(1, 1) = 1</span><br />
<span class="VBA_Tab3">DoEvents</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab2">If Cells(1, 1) = 1000 Then</span><br />
<span class="VBA_Tab3">キー入力</span><span class="VBA_Comment">’標準モジュールのコードを実行する</span><br />
<span class="VBA_Tab3">DoEvents</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab2">待ち時間10分の1秒</span><span class="VBA_Comment">’標準モジュールのコードを実行する</span><br />
<span class="VBA_Tab2">DoEvents</span><br />
<span class="VBA_Tab2">If StopFlag = True Then</span><br />
<span class="VBA_Tab3">If MsgBox(&#8220;中断しますか？&#8221;, vbQuestion + vbYesNo) = vbYes Then</span><br />
<span class="VBA_Tab1"><span class="VBA_Tab3">Exit Do</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab1"><span class="VBA_Tab3">StopFlag = False</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab1">Loop</span><br />
End Sub<br />
<br />
Private Sub 停止_Click()<br />
<span class="VBA_Tab1">StopFlag = True</span><br />
End Sub</div>
<h3><span id="toc7">③ブックのイベントプロシージャ</span></h3>
<p>ファイルのマクロを有効にした段階ですぐにフォームが立ち上がるように以下のコードを記載しています。</p>
<div class="VBACode">
Private Sub Workbook_BeforeClose(Cancel As Boolean)<br />
<span class="VBA_Tab1">Cells(1, 1).Value = &#8220;&#8221;</span><br />
End Sub<br />
<br />
Private Sub Workbook_Open()<br />
<span class="VBA_Tab1">操作.Show Modeless</span><br />
End Sub</div>
<h3><span id="toc8">④標準モジュール</span></h3>
<p>キーボードイベントのCtrlキーをクリックするVBAコード、待ち時間を入力するVBAコード、操作パネルを立ち上げるVBAコードの3つを記載しています。<br />
キーボードイベントのための宣言セクションの記載事項がフォームには記載できないようなので、このように処理しています。<br />
操作パネルを立ち上げるコードは誤って閉じてしまった場合に再び表示させられるようにボタンを作り、実行できるようにしています。</p>
<div class="VBACode">
Declare Sub keybd_event Lib &#8220;user32&#8221; (ByVal bVk As Byte, ByVal bScan As Byte, _<br />
ByVal dwFlags As Long, ByVal dwExtraInfo As Long)<br />
Private Const KEYEVENTF_EXTENDEDKEY = &#038;H1<br />
Private Const KEYEVENTF_KEYUP = &#038;H2<br />
Private Const fKEYDOWN = KEYEVENTF_EXTENDEDKEY<br />
Private Const fKEYUP = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP<br />
Declare Sub Sleep Lib &#8220;kernel32&#8221; (ByVal dwMilliseconds As Long)<br />
Private Const VK_CONTROL = &#038;H11<br />
Private Const VK_A = &#038;H41<br />
<br />
Sub キー入力()<br />
<span class="VBA_Tab1">keybd_event VK_CONTROL, 0, fKEYDOWN, 0 &#8216;Controlを押す</span><br />
<span class="VBA_Tab1">keybd_event VK_CONTROL, 0, fKEYUP, 0 &#8216;Controlを離す</span><br />
End Sub<br />
<br />
Sub 待ち時間10分の1秒()<br />
<span class="VBA_Tab1">Sleep 100</span><br />
End Sub<br />
<br />
Sub 操作パネル立ち上げ()<br />
<span class="VBA_Tab1">操作.Show Modeless</span><br />
End Sub</div>
<p><a href="https://officevba.info/wp-content/uploads/2016/09/40-002.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2016/09/40-002-300x164.jpg" alt="40-002" width="300" height="164" class="alignnone size-medium wp-image-675" srcset="https://officevba.info/wp-content/uploads/2016/09/40-002-300x164.jpg 300w, https://officevba.info/wp-content/uploads/2016/09/40-002-768x419.jpg 768w, https://officevba.info/wp-content/uploads/2016/09/40-002-700x382.jpg 700w, https://officevba.info/wp-content/uploads/2016/09/40-002-320x175.jpg 320w, https://officevba.info/wp-content/uploads/2016/09/40-002.jpg 1920w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>今回のファイルの作成はステップがいくつかに分かれていて作るのが面倒なので、ファイル自体も載せておきます。<br />
使用してみたい方は<a href="https://officevba.info/wp-content/uploads/2016/09/スリープ禁止マクロ.xlsm">こちら</a>からダウンロードしてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/preventsleepfile/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VBA（マクロ）の処理を一時停止するコード</title>
		<link>https://officevba.info/sleep/</link>
					<comments>https://officevba.info/sleep/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Wed, 13 Jul 2016 22:41:37 +0000</pubDate>
				<category><![CDATA[Sleep]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=334</guid>

					<description><![CDATA[目次 一時停止が必要となる場合一時停止のVBAコード①Application.Waitコードを使用する(ExcelVBAのみ)②Sleep関数を使用する（WindowsAPI） 一時停止が必要となる場合 Internet [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">一時停止が必要となる場合</a></li><li><a href="#toc2" tabindex="0">一時停止のVBAコード</a><ol><li><a href="#toc3" tabindex="0">①Application.Waitコードを使用する(ExcelVBAのみ)</a></li><li><a href="#toc4" tabindex="0">②Sleep関数を使用する（WindowsAPI）</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">一時停止が必要となる場合</span></h2>
<p>InternetExplorerやコマンドライン、その他のアプリケーションをVBAで操作するときには、命令を受け取ったそれぞれのアプリケーションが命令を実行するのにかかる時間の分、次の命令を受け付けられない場合があります。</p>
<p>本来は操作する側のアプリケーション（ExcelVBAなど）に、操作される側の状態を逐一認識させればよいのかもしれませんが、処理がものすごく複雑になるので個人で使用するVBA（マクロ）でそれを作成するのは現実的ではありません。</p>
<p>そんな時によく使われるのが、VBA（マクロ）の処理を一時停止するコードをアプリケーションに対する命令文の間に入れておく方法です。<br />
VBAを使って操作したいアプリケーションが命令を実行するのにかかる時間をおおよそ予測して、それよりも長い時間VBAの処理を一時停止しておくという原始的な対応です（笑）<br />
しかしこの原始的な対応はかなり便利で、他のアプリケーションを操作する際には必須のコードになります。</p>
<h2><span id="toc2">一時停止のVBAコード</span></h2>
<p>VBAの処理を一時停止するコードは大きく2つあります。それぞれメリットデメリットがあります。</p>
<h3><span id="toc3">①Application.Waitコードを使用する(ExcelVBAのみ)</span></h3>
<p>VBAに元々存在するコードなので事前に準備をする必要なく、処理を停止したいところに1行記載するだけで一時停止できるお手軽な方法です。<br />
以下の形式でコードを記載することで一時停止を行います。下の例は1秒処理を停止してから再開するコードです。</p>
<p></p>
<div class="VBACode">
Application.Wait Now + TimeValue(&#8220;00:00:01&#8221;)
</div>
<h3><span id="toc4">②Sleep関数を使用する（WindowsAPI）</span></h3>
<p>VBAの標準のコードではなく、WindowsAPIというWindowsに搭載されている関数をVBAで使用する方法です。細かい停止時間の調節が可能で、正確な時間一時停止しますが、事前に「Sleep関数を使用します」という意味のコードを記載しておく必要があります。<br />
標準モジュールの宣言セクション（Subよりも上の部分）に以下のVBAコードを記載します。</p>
<div class="VBACode">
Declare Sub Sleep Lib &#8220;kernel32&#8221; (ByVal dwMilliseconds As Long)
</div>
<p></p>
<p>※【追記】Sleep関数の宣言セクションの記載については32bit版、64bit版のどちらでもSleep関数がきちんと動作するように宣言セクションには下記のように書く方が良いようです。</p>
<div class="VBACode">
#If VBA7 Then<br />
Private Declare PtrSafe Sub Sleep Lib &#8220;kernel32&#8221; (ByVal ms As LongPtr)<br />
#Else<br />
Private Declare Sub Sleep Lib &#8220;kernel32&#8221; (ByVal ms As Long)<br />
#End If</div>
<p></p>
<p>あとは他のアプリエーションに対する2つ以上の命令と命令の間など、一時停止したいところで以下のようなコードを記載します。数字部分は停止時間を1/1000秒単位で記載します。よって1000と記載すれば1秒一時停止するということです。</p>
<div class="VBACode">
Sleep 1000
</div>
<p></p>
<p>全体の構成は以下のようになります。</p>
<div class="VBACode">
Declare Sub Sleep Lib &#8220;kernel32&#8221; (ByVal dwMilliseconds As Long)<br />
Sub IE操作()<br />
命令文①<br />
Sleep 1000<br />
命令文②<br />
End Sub
</div>
<p>時間を細かく調節できるので私は基本Sleep関数を使います。1回の時間では大差がありませんが、繰り返しの処理で一時停止を500回行う場合、1秒待つのと0.5秒で済むのだと終了までに4分以上の差が出ます。</p>
<p>Sleepは重い処理をしたときにWindows自体に負荷がかかりにくくする場合にも使用されます。記載方法についてはまた別の機会にお伝えします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/sleep/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
