自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/VBA/GAS/JavaScript/Raspberry Piなどで色んなことを自動化

パスワード付きExcelのVBAを完全自動実行する方法(PowerShell/PowerAutomateDesktop/VBScript)

業務の効率化を目的に、Excel VBAでの自動化を行っている方は多いと思います。しかし、せっかくVBAマクロを作成しても、定期的に人間がボタンを押して実行しているのでは、自動化の意味が半減してしまいます。

そこで今回は、パスワード付きのExcelファイル内のVBAマクロをPowerShellとタスクスケジューラーを使って完全自動実行する方法をご紹介します。


1. 課題:VBAは作れても自動実行できない

Excel VBAは簡易な自動化手段として有効ですが、以下のような課題があります:

  • Excelファイルにパスワードが設定されている
  • マクロを手動で実行している
  • 定期実行の仕組みがなく人間が介在している

このような状況を打破するには、PowerShellWindowsタスクスケジューラーを活用した仕組み作りが有効です。


2. 解決策:PowerShell + タスクスケジューラー

以下のようなPowerShellスクリプトを用意します。

$excelFilePath = "C:\Path\To\Your\File.xlsm"
$password = "your_excel_password"

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Open($excelFilePath, 0, $false, 5, $password)

# VBAマクロの実行("Module1.MacroName"など)
$excel.Run("YourMacroName")

$workbook.Close($false)
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)

これを.ps1ファイルとして保存し、タスクスケジューラーで実行するように設定します。

タスクスケジューラーの設定手順

  1. 「タスクスケジューラー」を開く
  2. 「基本タスクの作成」を選択
  3. トリガーで実行タイミング(例:毎日9時)を設定
  4. 操作で「プログラムの開始」→ powershell.exe を指定
  5. 引数に -ExecutionPolicy Bypass -File "C:\Path\To\Script.ps1" を設定

3. 他の自動実行手段との比較と設定手順

Power Automate Desktop(無料RPAツール)を使う方法

長所:GUI操作も含めた自動化が可能、Microsoft公式、無料

短所:設定に慣れが必要、実行速度が遅めな場合も

設定手順

  1. Power Automate Desktopをインストール
  2. 新しいフローを作成
  3. 「Excelの起動」アクションを追加し、パスワード付きファイルを開く設定
  4. 「マクロの実行」アクションを使って、マクロ名を指定
  5. フローを保存し、Power Automateポータルでスケジュールフローを作成

VBScript(.vbs)で実行する方法

長所:古くからのWindows標準スクリプト

短所:今後のサポートが不透明、セキュリティ警告が出やすい

設定手順

  1. 以下のような.vbsファイルを作成:
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objWorkbook = objExcel.Workbooks.Open("C:\Path\To\File.xlsm", , False, , "your_excel_password")
objExcel.Run "YourMacroName"
objWorkbook.Close False
objExcel.Quit
Set objWorkbook = Nothing
Set objExcel = Nothing
  1. タスクスケジューラーで wscript.exe を起動プログラムに指定し、引数で上記スクリプトパスを指定

注意:VBScriptは将来的にWindowsでのサポートが廃止される予定です。Microsoftの発表によると、2027年には完全にサポートが終了する予定です(2024年に非推奨化)。新しいプロジェクトには代替手段を検討することを推奨します。


4. 各手法の比較表

手法 長所 短所
PowerShell+タスク 標準機能のみで実装可、細かい制御も可能 初心者にはやや難解
Power Automate Desktop GUI操作も可能、ノーコードで直感的 設定に慣れが必要、動作が重くなる可能性
VBSスクリプト Windowsとの親和性が高い 2027年にサポート終了予定、使用は非推奨

まとめ

Excel VBAによる自動化は「実行」まで含めて初めて効果を発揮します。PowerShellとタスクスケジューラーを組み合わせれば、パスワード付きExcelファイルであっても定期実行が可能です。

今後は用途やセキュリティ要件に応じて、他の手段との使い分けも検討してみてください。

For文での線形探索より高速 VBAで連想配列 Dictionaryオブジェクト

以下のような検索キー列がユニークであるテーブルからデータを取得したい(VLOOKUPみたいなイメージ)場合、処理回数が多いと WorksheetFanction.Vlookup やFor文での線形探索では時間がかかり過ぎる。

そんなときに役立つのが連想配列(Dictionaryオブジェクト)。

配列のようにインデックス番号からデータを取り出すのではなくキーの完全一致で要素を取り出せるので、処理が理解しやすいかつ高速であることが最大の利点。

f:id:maru0014:20200912124247p:plain

 

続きを読む

Slackのログ(JSONファイル)をExcel PowerQuery だけでなるべく楽に解析

Slackのログを分析するときは管理画面から一括ダウンロードするのが早い。しかし、出てくるデータはチャンネルごとにフォルダがバラバラかつ日付ごとにバラバラのJSONファイルとして出てくる。

CSVならあまり頭を使わなくてもそのまま開いたり、日付ごとのファイルでもbatで統合するなりすればいいがJSONファイルをExcelで扱うにはPowerQueryが最適VBA-JSONを使う手もあるが、初心者向けではない。


手順概要

  1. Slackからごそっとデータをダウンロード
  2. ZIPファイルを解凍
  3. Excel のデータタブでデータの取得→ファイルから→フォルダから
  4. 自動生成された関数を手直し
  5. シートに読み込む

 

1. Slackからごそっとデータをダウンロード

Slackの管理画面https://<ワークスペース名>.slack.com/admin/settings にアクセスし、画面右上の「データのインポート/エクスポート」をクリック。

f:id:maru0014:20200912123159p:plain  

続きを読む

【ExcelVBAでスクレイピング入門】Googleで検索順位を自動取得してみる③ ~複数キーワードの検索とデータ取得~

第二回では1キーワードを検索してExcelシートにキーワード、検索順位、ページタイトルを入力するところまでできました。

code-life.hatenablog.com

code-life.hatenablog.com

今回やっていくのは以下の内容。ここまでできれば検索結果のスクレイピングとしては十分な機能かな。

  • リンクURL、ディスクリプション
  • 複数のキーワードを検索
  • 2ページ目や3ページ目の結果も取得
続きを読む

【VBA】querySelectorAllで取得した要素に対してForEachを使うと謎のエラーが発生する

この記事でできるようになること

  • querySelectorAllで取得したコレクションに対してループ処理

ExcelVBAでWebページから情報を自動収集(スクレイピング)する時に超便利なメソッド querySelectorquerySelectorAll

CSSセレクタがそのまま使えて超便利だが、何故かquerySelectorAllに対してFor Eachを使ってループ処理を行うと処理を終えるタイミングで謎のエラーが発生して切断される事象に頭を悩ませていました。

f:id:maru0014:20190517222059p:plain
このWebページに問題があるため、Internet Explorerのタブを開き直しました

会社の人に相談しながらどうにか回避策を見つけたので共有したい。

続きを読む