【VBScript非推奨対策】今後はPowerShellで対応

【アイキャッチ】VBScript_PowerShell Access小ネタ

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」の場合もあります。

VBScriptからPowerShell


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」にこれまで作成したファイルが存在する状態です。

VBScriptからPowerShell


コマンドプロントを起動しバッチファイルを実行します。実行結果は下記の通りです。AccessVBA.accdbのテーブルにもレコードが追加されています。

VBScriptからPowerShell
VBScriptからPowerShell

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

VBScriptからPowerShell

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」にこれまで作成したファイルが存在する状態です。

VBScriptからPowerShell

コマンドプロンプトから「AccessVBA_PS.bat」を実行しました。VBScriptと同じ結果になりました。

VBScriptからPowerShell
VBScriptからPowerShell

Excelのプロシージャ実行について

今回はAccessのVBA実行を触れましたがVBScriptおよびPowerShellの「Access.Application」を「Excel.Application」に変更することで同等のことが実行可能です。

コメント

タイトルとURLをコピーしました