Microsoftは2023年10月にVBScriptを非推奨としました. これは、VBScriptが将来的にはWindowsリリースから削除される予定であることを意味します。しかし、すぐに削除されるわけではなく、VBScriptはオンデマンド機能として提供される予定です。VBScriptを利用しているユーザーは、代替手段を検討する必要があります。具体的な手段としてはPowerShellが有力です。
ここではVBScriptを利用してAccessプロシージャを起動する方法のPowerShell置き換えを説明します。Excelのプロシージャも同様の方法で実行可能です。
ここで使うAccessファイルについて
呼び出されるAccessファイルには単純な引数なしのプロシージャと引数付きのプロシージャを準備します。引数なしのプロシージャは確認用にテーブルにレコードを追加するクエリを準備しています。
ファイル名は「AccessVBA.accdb」とします。また「C:\Script\」に格納していることを前提とします。
'引数つきプロシージャのテスト Function FncScriptTest(strHikisu1 As String, strHikisu2 As String) As String FncScriptTest = "【Access】" + strHikisu1 + "と" + strHikisu2 + "が引数として指定されました。" End Function '引数なしプロシージャのテスト Sub subScriptTest() With DoCmd .SetWarnings False .OpenQuery "Q_データ追加" .SetWarnings True End With End Sub
VBScriptでAccessVBAのプロシージャを実行する方法
VBScriptとVBScriptを実行するバッチファイルを作成します。VBScriptとバッチファイルの文字コードはメモ帳では標準の「UTF-8」ではなく「ANSI」設定します。この設定で全角文字の文字化け防ぎます。
※文字コードはエディタによって「SJIS」の場合もあります。
AccessVBAのプロシージャを実行するVBScript作成
VBS実行時に引数を2つ指定するスクリプトです。Accessは画面に表示せずに指定したファイルのプロシージャを実行します。
ファイル名は「AccessVBA.vbs」とします。
Msg1 =Wscript.Arguments(0) Msg2 =Wscript.Arguments(1) runAccessVBA Msg1,Msg2 Function runAccessVBA(str1,str2) Dim Acc Dim fs Dim FileName Dim Ret 'Accessオブジェクト Set Acc = CreateObject("Access.Application") 'WindowsShellオブジェクト Set Fs = CreateObject("WScript.Shell") FileName = Fs.CurrentDirectory & "\AccessVBA.accdb" With Acc .OpenCurrentDatabase FileName .Visible = False '引数なしのプロシージャを実行(文法はどちらでもOK) .Run "SubScriptTest" .Run("SubScriptTest") '引数ありのプロシージャを実行 Ret = .Run("FncScriptTest",str1,str2) WScript.Echo Ret .Quit End with Set Acc = Nothing End Function
VBScritを実行するバッチファイル作成
引数を2つ指定して 「AccessVBA.vbs」を実行します。
ファイル名を「 AccessVBA_VS.bat」とします。
※「pause」はテスト用に実行します。実運用では不要です。
cscript AccessVBA.vbs 引数1 引数2 pause
バッチファイルでスクリプトを実行する
ファイルの準備ができましたので実行します。
ファイル構成は「C:¥Script」にこれまで作成したファイルが存在する状態です。
コマンドプロントを起動しバッチファイルを実行します。実行結果は下記の通りです。AccessVBA.accdbのテーブルにもレコードが追加されています。
PowerShellでAccessVBAのプロシージャを実行する方法
これまで実施したVBScriptをPowerShellで置き換えます。
AccessVBAのプロシージャを実行するPowerShell作成
最初に実行する「runAccessVBA $args[0] $args[1]」は必ず関数の下に記述します。ファイル名は「AccessVBA.ps1」とします。
メモ帳等で作成できますが、PowerShell用エディタもありますので是非活用してください。
Function runAccessVBA($x,$y){ $Acc=New-object -Comobject Access.Application $FileName = (Convert-Path .) + "\AccessVBA.accdb" $Acc.OpenCurrentDatabase($FileName) $Acc.Visible = $False $Acc.Run("SubScriptTest") $Ret = $Acc.Run("FncScriptTest",[ref]$x,[ref]$y) echo $Ret $Acc.Quit() } runAccessVBA $args[0] $args[1]
PowerShellのエディタは標準で「Windows PowerShell」と「Windows PowerShell ISE」がありますが、「Windows PowerShell ISE」が機能が充実していますので便利です。
起動方法:Windowsキー → WindowsPowerShell → Windows PowerShell ISE
PowerShellを実行するバッチファイル作成
powershellコマンドで実行します。「-ExecutionPolicy」は実行ポリシーのことで「RemoteSigned」を指定することでローカルに保存されたスクリプトを実行するできます。
ファイル名は「AccessVBA_PS.bat」で保存します。
powershell -ExecutionPolicy RemoteSigned .\AccessVBA.ps1 引数1 引数2 pause
PowerShellの実行ポリシーについて
コマンドで「powershell Set-ExecutionPolicy RemoteSigned -Scope CurrentUser」を実行することで実行ポリシーが変更され引数なしでスクリプトが実行可能になります。
ただ、セキュリティが緩くなるため慎重に検討してください。
戻したい場合は「powershell Set-ExecutionPolicy Restricted -Scope CurrentUser」で元に戻すことができます。
バッチファイルでスクリプトを実行する
ファイルの準備ができましたので実行します。
ファイル構成は「C:¥Script」にこれまで作成したファイルが存在する状態です。
コマンドプロンプトから「AccessVBA_PS.bat」を実行しました。VBScriptと同じ結果になりました。
Excelのプロシージャ実行について
今回はAccessのVBA実行を触れましたがVBScriptおよびPowerShellの「Access.Application」を「Excel.Application」に変更することで同等のことが実行可能です。
コメント