1. ホーム
  2. スクリプト・コラム
  3. vbs

MSScriptControlの使用例です。

2022-02-09 15:27:18

Microsoft(R) Script コントロールを使用すると、Microsoft(R) Visual Basic (R) Scripting Edition や Microsoft(R) JScript(TM) などの任意の ActiveX(R) スクリプトエンジンを実行するアプリケーションを作成することができます。スクリプトコントロールにオートメーションオブジェクトのオブジェクトモデルを追加すると、オブジェクトのメソッドとプロパティをスクリプトエンジンで利用できるようになります。アプリケーションのオブジェクトモデルとスクリプトエンジンを組み合わせることで、両者の長所を組み合わせたスクリプトアプリケーションを作成できます。このアプリケーションは、スクリプト言語のシンプルさだけでなく、より高度で全機能を備えたプロフェッショナルなアプリケーションのオブジェクト、メソッド、プロパティを兼ね備えているのです。

スクリプトコントロールの作成例

Microsoft Scriptコントロールは、コントロールとして、またはスタンドアロンのAutomationオブジェクトとして作成することができます。この機能により、どの言語で書かれたアプリケーションでも、ScriptControlを使用して互換性のあるスクリプト言語をホストすることができます。

次の例は、どのような形式でも使用可能です。変数 sc は ScriptControl 型であると宣言されていないことに注意してください。なぜなら、コントロールはプロジェクト内で参照されておらず、また参照する必要もないからです。ScriptControlが存在し、登録されている限り、次のコードは動作します。

コピーコード コードは以下の通りです。

Private Sub Command1_Click()
Dim sc
Dim strProgram As String
strProgram = "Sub Main" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
Set sc = CreateObject("ScriptControl")
sc.language = "VBScript"
sc.addcode strProgram
sc.run "Main"
End Sub

ユーザーが自分のプロジェクト内の参照で Script コントロールを明示的に参照する場合、ユーザーは以下のコードで Script コントロールを作成することができます。

インスタンスです。

コピーコード コードは以下の通りです。

Dim sc As ScriptControl

ユーザー インターフェイス要素の表示 AllowUI プロパティは、スクリプト エンジンがユーザー インターフェイス要素を表示できるかどうかを決定します。これは、タイムアウトメッセージの表示など、スクリプトコントロール自体に適用することができます。

また、ActiveXスクリプト・インターフェースを使用するスクリプト・エンジンにも適用することができる。たとえば、次のコードでは、Hello Worldメッセージボックスを表示しようとするとエラーが発生します。

コピーコード コードは以下の通りです。

ScriptControl1.AllowUI = False
Dim strX As String
strX = "Sub Hello" & vbCrLf & _
"MsgBox ""Hello World""" & vbCrLf & _
"End Sub"
ScriptControl1.AddCode strX
ScriptControl1.Run "Hello" ' No UI allowed!

スクリプトコードの作成

Microsoft Script コントロールを使用すると、VBScript や JScript などのスクリプト言語を実行するアプリケーションを作成することができます。例えば、フォーム上にボタンがあり、ボタンが押されたときにVBScriptのコードが実行されるようにしたいとします。このボタンはRun NameMeと呼ばれ、ユーザーはスクリプトコードでNameMeというプロシージャを実行させたいとします。ユーザーが[Run NameMe]ボタンをクリックすると、VBScript スクリプト エンジンが NameMe プロシージャを実行することを意図しています。

このRun NameMeボタンは、スクリプトコントロールのRunメソッドを使用してスクリプトを実行します。以下は、Run NameMe ボタンのクリックイベントに表示されるコードです。

コピーコード コードは以下の通りです。

' The name of the Script Control is ScriptControl1.
Private Sub RunNameMe_Click()
ScriptControl1.Run "NameMe"
End Sub

このスクリプトに必要な残りのコードを作成するには、スクリプト言語を選択し、コードをプロシージャに追加して、プロシージャを実行します。

スクリプト言語の選択

最初のステップは、スクリプト・コントロールに正しいスクリプト言語を設定することです。ページ上のコントロールとしてスクリプト・コントロールを作成する場合、Languageプロパティは自動的に"VBScript"に初期化されます。スクリプト・コントロールをオートメーション・オブジェクトとして作成する場合、Language プロパティは初期化されないままです。
Languageプロパティは初期化されていないため、コード作成者が設定する必要があります。

JScriptにLanguageプロパティを設定するには、プロパティウィンドウを使用します。また、次のように、コード内でLanguageプロパティを使用することもできます。
は、その

コピーコード コードは以下の通りです。

ScriptControl1.Language = "JScript"

PERLやREXXなどの他のスクリプト言語は、Microsoftが提供していないため、Scriptコントロールで使用することができます。

プロシージャにコードを追加する

AddCodeメソッドを使用すると、ユーザーがNameMeプロシージャを実行する前に、Scriptコントロールに完全なプロシージャを追加することができます。ユーザーが不完全なプロシージャ(End SubまたはEnd Functionがないプロシージャ)を追加しようとすると、エラーが発生します。次のコードは、スクリプトにプロシージャコードを追加します。
コントロールします。

コピーコード コードは以下の通りです。

' When the ScriptRun application loads, add the following code
' Add the NameMe procedure to Control.
Private Sub Form_Load()
Dim strCode As String
strCode = "Sub NameMe()" & vbCrLf & _
" Dim strName As String" & vbCrLf & _
" strName = InputBox(""Name?"")" & vbCrLf & _
" MsgBox ""Your name is "" & strName" & vbcrLf & _
"End Sub"
ScriptControl1.AddCode strCode
End Sub

また、ユーザーはテキストボックス・コントロールからプロシージャ・コードを追加することができます。

コピーコード コードは以下の通りです。

Private Sub Form_Load()
' This code is contained on a form named frmScript
' in a Textbox named txtScript.
ScriptControl1.AddCode frmScript.txtScript.Text
End Sub

ユーザーはプロシージャや関数にパラメータを追加することができます。

コピーコード コードは以下の通りです。

Private Sub EvalFunc()
' Create the function.
Dim strFunction As String
strFunction = _
"Function ReturnThis(x, y)" & vbCrLf & _
" ReturnThis = x * y" & vbCrLf & _
"End Function"
' Add the code and then run the function.
ScriptControl1.AddCode strFunction
MsgBox ScriptControl1.Run("ReturnThis", 3, 25)
End Sub

プロセスの実行

Run メソッドは、スクリプトコントロールに追加された完全なプロシージャを実行します。次のコード・スニペットは、定義された3つのプロシージャを実行します。

コピーコード コードは以下の通りです。

ScriptControl1.Run "FindName"
ScriptControl1.Run "AddName"
ScriptControl1.Run "Quit"

スクリプト文を実行し、結果を計算する。ExecuteStatement メソッドでスクリプト文を実行することができる。式の値を計算するには、eval メソッドを使用します。次の例では
次の2行は、evalメソッドを使ってx = 100とx = 100/2をテストしています。 2行目はTrueを返し、3行目はFalseを返します。

コピーコード コードは以下の通りです。
Private Sub TryThis()
ScriptControl1.ExecuteStatement "x = 100"
MsgBox ScriptControl1.Eval("x = 100") ' Return True
MsgBox ScriptControl1.Eval("x = 100/2") ' Return False
End Sub

Error属性の使用

スクリプトコントロールのエラーには、スクリプトコントロール自体、または実行しようとしているスクリプトの2つの原因が考えられます。スクリプトコードをデバッグするには、エラーオブジェクトへの参照を返すErrorプロパティを使用することができます。Error オブジェクトを使用すると、スクリプト・コントロールはエラーの数とその数を返すことができます。
Error オブジェクトを使用すると、スクリプトコントロールは、エラーの数とその説明、およびスクリプト内でエラーが表示された行番号を返すことができます。

次のコードを実行すると、スクリプトコントロールがエラーを発見する例を見ることができます。

コピーコード コードは以下の通りです。

Private Sub MyError()
' The following code is divided by zero resulting in
' An error.
Dim strCode As String
strCode = _
"Sub DivideByZero()" & vbCrLf & _
"Dim prime" & vbCrLf & _
"prime = 3" & vbCrLf & _
"MsgBox prime/0" & vbCrLf & _
"End Sub"
On Error GoTo scError
With ScriptControl1
.AddCode strCode
.Run "DivideByZero"
End With
Exit Sub
scError:
' Use the Error object to notify the user
' error, and the error line.
Debug.Print ScriptControl1.Error.Number & _
":" & ScriptControl1.Error.Description & _
" in line " & ScriptControl1.Error.
Exit Sub
End Sub