<?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>自動処理</title>
	<atom:link href="https://javeo.jp/tag/%E8%87%AA%E5%8B%95%E5%87%A6%E7%90%86/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Sun, 17 Aug 2025 05:36:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2025/08/cropped-ExcelPython_future-32x32.jpg</url>
	<title>自動処理</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【VBA】Excelマクロをタスクスケジューラで定期実行する</title>
		<link>https://javeo.jp/excel-macro-auto-run/</link>
					<comments>https://javeo.jp/excel-macro-auto-run/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Mon, 11 Aug 2025 14:39:43 +0000</pubDate>
				<category><![CDATA[VBA・Excel]]></category>
		<category><![CDATA[EXCEL]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[自動処理]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3184</guid>

					<description><![CDATA[目次 PowerShellのサンプルプログラム最初にマクロファイル有無チェック一番大事なExcel操作部分最後にオブジェクト（プロセス）を開放タスクスケジューラの設定&#8220;全般&#8221;タブ&#8220;トリ [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>Windowsの定期実行と言えばタスクスケジューラですが、Excelマクロを実行するにはクセがありまして直接指定することはできません</p>



<p>その昔はVBSとbatファイルを組み合わせていましたが、2023年10月にVBSが非推奨になったので<span class="bold">PowerShellでの実行プログラム作成</span>と<strong>タスクスケジューラ設定</strong>をご紹介します</p>
</div>




  <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">PowerShellのサンプルプログラム</a><ol><li><a href="#toc2" tabindex="0">最初にマクロファイル有無チェック</a></li><li><a href="#toc3" tabindex="0">一番大事なExcel操作部分</a></li><li><a href="#toc4" tabindex="0">最後にオブジェクト（プロセス）を開放</a></li></ol></li><li><a href="#toc5" tabindex="0">タスクスケジューラの設定</a><ol><li><a href="#toc6" tabindex="0">&#8220;全般&#8221;タブ</a></li><li><a href="#toc7" tabindex="0">&#8220;トリガー&#8221;タブ</a></li><li><a href="#toc8" tabindex="0">&#8220;操作&#8221;タブ</a><ol><li><a href="#toc9" tabindex="0">普通にPowerShellを実行する場合</a></li><li><a href="#toc10" tabindex="0">コンソール画面を出さずにPowerShellを実行する場合</a></li></ol></li><li><a href="#toc11" tabindex="0">&#8220;条件&#8221;タブ</a></li><li><a href="#toc12" tabindex="0">&#8220;設定&#8221;タブ</a></li></ol></li><li><a href="#toc13" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">PowerShellのサンプルプログラム</span></h2>



<p>早速ですがまずはPowerShellのサンプルプログラムを</p>



<p>※Chatwork前提のプログラムなので適宜改修してください</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-powerwhell" data-file="ExcelMacroRun.ps1" data-lang="PowerShell"><code># 最初に変数をまとめる
$excelFilePath = &quot;C:\Users\javeo\Documents\テストマクロ.xlsm&quot;  # マクロ入りファイルのフルパス
$macroNoArgs = &quot;SampleMacro&quot;                                  # 引数なしマクロ
$macroWithArgs = &quot;ArgsMacro&quot;                                  # 引数ありマクロ
$arg1 = &quot;Hello&quot;                                               # 引数その1
$arg2 = 12345                                                 # 引数その2
$token = &quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;                   # 通知用チャットワークのトークン
$roomId = &quot;000000000&quot;                                         # 通知用チャットワークのルームID
$scriptPath = $MyInvocation.MyCommand.Path                    # このps1のフルパス

# ファイル有無を最初にチェック
if (-Not (Test-Path $excelFilePath)) {
    # ファイルが見つからなかったらチャットワークで通知する
    $message = &quot;「$excelFilePath」が見つかりませんでした。`nパスを変更する場合は「$scriptPath」を修正してください。&quot;
    Invoke-RestMethod -Uri &quot;https://api.chatwork.com/v2/rooms/$roomId/messages&quot; `
        -Method Post `
        -Headers @{ &quot;X-ChatWorkToken&quot; = $token } `
        -Body @{ body = $message }
    return
}

# エラーハンドリングしつつエクセルマクロを実行
try {
    # Excelアプリケーションを起動
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false                                    #　画面は非表示にしておく

    # エクセルファイルを開く
    $workbook = $excel.Workbooks.Open($excelFilePath)

    # マクロを実行する ※マクロに引数がある場合は値を続けて入力するだけ
    $excel.Run($macroNoArgs)
    $excel.Run($macroWithArgs, $arg1, $arg2)

    # ファイルを保存して閉じる
    $workbook.Close($true)
    $excel.Quit()
}
catch {
    # マクロでのエラーはキャッチできないはずなのでじつはこの分岐には来ないはず
    $message = &quot;「$excelFilePath」でエラーが発生しました。&quot;
    Invoke-RestMethod -Uri &quot;https://api.chatwork.com/v2/rooms/$roomId/messages&quot; `
        -Method Post `
        -Headers @{ &quot;X-ChatWorkToken&quot; = $token } `
        -Body @{ body = $message }}
finally {
    # 最後に各プロセスを開放する
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}
</code></pre></div>



<p>&#8220;<span class="marker-under">PowerShellわからないよ</span>&#8220;、って人でも最初の変数部分を変更するだけのテンプレで使えます</p>



<p>続いてパーツを分けて解説です</p>



<h3 class="wp-block-heading"><span id="toc2">最初にマクロファイル有無チェック</span></h3>



<p>最初にマクロファイルの有無をチェックします</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-powerwhell" data-lang="PowerShell"><code># ファイル有無を最初にチェック
if (-Not (Test-Path $excelFilePath)) {
    # ファイルが見つからなかったらチャットワークで通知する
    $message = &quot;「$excelFilePath」が見つかりませんでした。`nパスを変更する場合は「$scriptPath」を修正してください。&quot;
    Invoke-RestMethod -Uri &quot;https://api.chatwork.com/v2/rooms/$roomId/messages&quot; `
        -Method Post `
        -Headers @{ &quot;X-ChatWorkToken&quot; = $token } `
        -Body @{ body = $message }
    return
}</code></pre></div>



<p>私はChatwork利用者なので専用のトークルームにエラー通知するようにしていますが、他にも</p>



<ul class="wp-block-list has-watery-yellow-background-color has-background">
<li>Outlookでメール通知</li>



<li>メッセージボックス風に通知</li>



<li>BurntToastの通知（デスクトップ右下に出てくる通知）</li>
</ul>



<p>とかやり方は様々</p>



<p>完全バックグラウンドで処理させるのでエラー発生時に何かしら通知する仕組みはあった方が吉です</p>



<p>とは言え、あった方がいい機能レベルなのでよくわからない場合は丸ごと削除しても問題ないです</p>



<h3 class="wp-block-heading"><span id="toc3">一番大事なExcel操作部分</span></h3>



<p>最低限ここさえあればOKなExcelマクロの実行部分</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-powerwhell" data-lang="PowerShell"><code># Excelアプリケーションを起動
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false                                    #　画面は非表示にしておく

# エクセルファイルを開く
$workbook = $excel.Workbooks.Open($excelFilePath)

# マクロを実行する ※マクロに引数がある場合は値を続けて入力するだけ
$excel.Run($macroNoArgs)
$excel.Run($macroWithArgs, $arg1, $arg2)

# ファイルを保存して閉じる
$workbook.Close($true)
$excel.Quit()</code></pre></div>



<p>マクロの中でエラーが発生してもExcel側で検知してしまい、PowerShell上ではエラーにならないので&#8221;<span class="marker-under">try chatch</span>&#8220;はただのおまじない</p>



<h3 class="wp-block-heading"><span id="toc4">最後にオブジェクト（プロセス）を開放</span></h3>



<p>finallyの中ですが説明用に切り出し</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-powerwhell" data-lang="PowerShell"><code># 最後に各プロセスを開放する
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()</code></pre></div>



<p>サイトによっては上2行だけの説明もありますが、なぜかExcel.exeのプロセスが残るときがあるのでこの4行を書いておくのが安心</p>



<h2 class="wp-block-heading"><span id="toc5">タスクスケジューラの設定</span></h2>



<p>続いてタスクスケジューラ側の設定です</p>



<p>各タブに説明付けますが大事なのは結局大事なのは&#8221;操作タブ&#8221;です</p>



<h3 class="wp-block-heading"><span id="toc6">&#8220;全般&#8221;タブ</span></h3>



<p>特に説明するようなことはないタブ</p>



<p>名前と説明はお好きに設定してもらってセキュリティオプション以下は基本何も触らなくてOK</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_00.png"><img fetchpriority="high" decoding="async" width="542" height="390" src="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_00.png" alt="" class="wp-image-3193" srcset="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_00.png 542w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_00-300x216.png 300w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_00-150x108.png 150w" sizes="(max-width: 542px) 100vw, 542px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc7">&#8220;トリガー&#8221;タブ</span></h3>



<p>ここも特に説明することはないので、実行頻度に合わせて各設定をどうぞ</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_11.png"><img decoding="async" width="606" height="516" src="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_11.png" alt="" class="wp-image-3194" srcset="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_11.png 606w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_11-300x255.png 300w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_11-150x128.png 150w" sizes="(max-width: 606px) 100vw, 606px" /></a></figure>



<h3 class="wp-block-heading"><span id="toc8">&#8220;操作&#8221;タブ</span></h3>



<p>ここがちょっとミソポイント</p>



<p>2パターンの設定がありまして後半の設定がおススメです</p>



<h4 class="wp-block-heading"><span id="toc9">普通にPowerShellを実行する場合</span></h4>



<p>まずはサンプル画像</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h09_39.png"><img decoding="async" width="454" height="500" src="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h09_39.png" alt="" class="wp-image-3196" srcset="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h09_39.png 454w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h09_39-272x300.png 272w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h09_39-136x150.png 136w" sizes="(max-width: 454px) 100vw, 454px" /></a></figure>



<p>&#8220;PowerShellをタスクスケジューラで設定する&#8221;と言われればこの設定が一般的</p>



<p>ただこれだとここれだとコンソール画面（真っ黒な画面）が立ち上がるのでそれが嫌な人は<a href="#headless-header">後半の設定へ</a></p>



<p>コンソール画面は動いていることを確認できるし、処理状況もわかるメリットもあるのでコンソール画面の表示・非表示はお好みで</p>



<h5 class="wp-block-heading">&#8220;プログラム/スクリプト&#8221;</h5>



<p>普通はpowershell.exeだけで大丈夫なはず</p>



<p>もし動かない場合などフルパスで書くなら</p>



<ul class="wp-block-list has-watery-yellow-background-color has-background">
<li>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</li>



<li>C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe</li>
</ul>



<p>のどちらかにexeファイルがあるはず</p>



<h5 class="wp-block-heading">引数の追加（オプション）</h5>



<p>画像は見切れていますが記載しているのは</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-plain"><code>-ExecutionPolicy Bypass -File &quot;C:\Users\javeo\Documents\excel-macro-auto-run.ps1&quot;</code></pre></div>



<p>&#8220;<span class="marker-under">-ExecutionPolicy Bypass</span>&#8220;で実行ポリシーを制限無視にしておくのがポイント</p>



<p>&#8220;<span class="marker-under">-File</span>&#8220;の後ろに上部で作成したPowerShellファイル（ps1ファイル）のフルパスを記載</p>



<h5 class="wp-block-heading">開始（オプション）</h5>



<p>設定しなくても動く（はず）</p>



<p>PowerShellファイルが保存し手あるフォルダを設定するのがおまじない</p>



<h4 class="wp-block-heading" id="headless-header"><span id="toc10">コンソール画面を出さずにPowerShellを実行する場合</span></h4>



<p>こちらもまずはサンプル画面</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_23.png"><img decoding="async" width="454" height="500" src="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_23.png" alt="" class="wp-image-3195" srcset="https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_23.png 454w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_23-272x300.png 272w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-11_22h08_23-136x150.png 136w" sizes="(max-width: 454px) 100vw, 454px" /></a></figure>



<p>&#8220;<span class="marker-under">conhost.exe</span>&#8220;と引数の&#8221;<span class="marker-under">&#8211;headless powershell.exe</span>&#8220;にすることでコンソール画面を非表示で実行することが可能になります</p>



<h5 class="wp-block-heading">プログラム/スクリプト</h5>



<p>ここも<code>conhost.exe</code>だけで大丈夫なはず</p>



<p>フルパスで書くなら</p>



<ul class="wp-block-list has-watery-yellow-background-color has-background">
<li><code>C:\Windows\System32\conhost.exe</code></li>
</ul>



<p>にいるはず</p>



<p>ちなみにconhost.exeとは</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><code>conhost.exe</code>&nbsp;は、**Console Window Host（コンソール ウィンドウ ホスト）**の略で、Windowsオペレーティングシステムの一部です。主に&nbsp;<strong>コマンドプロンプト（cmd.exe）や PowerShell などのコンソールアプリケーションの表示と操作をサポートする役割</strong>&nbsp;を担っています。</p>
</blockquote>



<p>ってことで、実はPowerShellを実行したときに表示されるコンソール画面もconhost.exeなんですね</p>



<p>PowerShellを実行しようとした時にconhostと一緒に起動するか、conhostを起動して中でPowerShellを実行するのか、の起動方法の違いで実際はほぼ同じです</p>



<h5 class="wp-block-heading">引数の追加（オプション）</h5>



<p>PowerShellを実行する場合と理屈は同じ</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-plain"><code>--headless powershell.exe -NoProfile -ExecutionPolicy Bypass -File&quot;C:\Users\javeo\Documents\excel-macro-auto-run.ps1&quot;</code></pre></div>



<p>conhost.exeから画面非表示なので&#8221;<span class="marker-under">&#8211;headless powershell.exe</span>&#8220;を指定するだけ</p>



<p>&#8220;<span class="marker-under">-NoProfile</span>&#8220;はなくてもよさそうだけどここもおまじない</p>



<p>それ以降はPoweShell実行時と同じ引数で</p>



<h5 class="wp-block-heading">開始（オプション）</h5>



<p>ここはPowerShellとおなじ</p>



<h3 class="wp-block-heading"><span id="toc11">&#8220;条件&#8221;タブ</span></h3>



<p>特に触る必要はないはず</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_28.png"><img decoding="async" width="542" height="390" src="https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_28.png" alt="" class="wp-image-3204" srcset="https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_28.png 542w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_28-300x216.png 300w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_28-150x108.png 150w" sizes="(max-width: 542px) 100vw, 542px" /></a></figure>



<p>使い方によっては&#8221;<span class="marker-under">タスクを実行するためにスリープを解除する</span>&#8220;にチェックを入れたほうがいいかも</p>



<h3 class="wp-block-heading"><span id="toc12">&#8220;設定&#8221;タブ</span></h3>



<p>ここも特に触る必要はない</p>



<figure class="wp-block-image size-full"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_35.png"><img decoding="async" width="542" height="390" src="https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_35.png" alt="" class="wp-image-3205" srcset="https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_35.png 542w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_35-300x216.png 300w, https://javeo.jp/wp-content/uploads/2025/08/2025-08-12_10h57_35-150x108.png 150w" sizes="(max-width: 542px) 100vw, 542px" /></a></figure>



<p>&#8220;タスクが既に実行中の場合に適用される規則&#8221;はプログラムの仕様に合わせて変えていいかもです</p>



<h2 class="wp-block-heading"><span id="toc13">あとがき</span></h2>



<p>ここまで書いといてなんですが、、正直私はExcelはUI前提のアプリだと思っているタイプなのでマクロをバックグラウンドで定期実行することはあまり推奨したくありません</p>



<p>ですが、Excelは汎用性高すぎる超絶便利アプリなのは否定できず、需要ありそうなのでまとめてみました（まとめてるってことはなんだかんだで私も使ってます）</p>



<p>世の中的に脱Excelをよく聞きますがなんだかんだで便利ですよね</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/excel-macro-auto-run/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
