Excelユーザフォームを使用
ExcelオブジェクトのRunメソッドを使うと、
対象のExcelで定義されている関数を呼び出せる。
呼び出す関数上でユーザフォームを表示させることで
スクリプトからユーザフォームを使った処理を行う事ができる。
そのサンプルスクリプト。
ExcelのVBEでユーザフォームを作成
UserForm1.frm
VERSION 5.00 Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} UserForm1 Caption = "リストから選択" ClientHeight = 1305 ClientLeft = 45 ClientTop = 330 ClientWidth = 3045 OleObjectBlob = "UserForm1.frx":0000 StartUpPosition = 1 'オーナー フォームの中央 End Attribute VB_Name = "UserForm1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit ' フォーム初期化処理 Private Sub UserForm_Initialize() Dim item As Variant ' コンボボックスに値を設定 For Each item In ItemList ComboBox1.AddItem item Next ' 最初の項目を設定 ComboBox1.ListIndex = 0 End Sub ' OKボタン押下時の処理 Private Sub CommandButton1_Click() intRetVal = ComboBox1.ListIndex strRetVal = ComboBox1.List(ComboBox1.ListIndex) Unload Me End Sub ' Cancelボタン押下時の処理 Private Sub CommandButton2_Click() intRetVal = -1 strRetVal = STRING_CANCEL Unload Me End Sub
同じエクセル上で標準モジュールを作成。
Module1.bas
Attribute VB_Name = "Module1" Option Explicit ' ScriptListが返す値の種類 Const TYPE_INDEX = 0 Const TYPE_STRING = 1 Public Const STRING_CANCEL = "Cancel" ' UserFormに渡すリストボックスの項目 Public ItemList As Variant ' UserFormから設定される値 Public intRetVal As Integer Public strRetVal As String ' スクリプトから呼び出される関数 Function SelectList(items As Variant, RetType As Integer) As Variant ' UserForm1が参照するために引数をコピー ItemList = items ' UserForm1はリストボックスの表示、RetValへの選択値コピーを行うものとする UserForm1.Show 1 ' 戻り値の種類に応じてインデックスまたは項目名を返す If (RetType = TYPE_INDEX) Then SelectList = intRetVal Else SelectList = strRetVal End If End Function
標準モジュールで作成したSelectListをスクリプトから呼び出す。
' Excelユーザフォーム表示のサンプル Option Explicit Dim CurrentDir, ObjExcel, RetVal Const FileName = "Book1.xls" Const FuncName = "SelectList" ' スクリプト実行ディレクトリを取得 CurrentDir = Replace(WScript.ScriptFullName, WScript.ScriptName, vbNullString) ' Excelオブジェクトを作成 set ObjExcel = WScript.CreateObject("Excel.Application") On Error Resume Next ' Run ("'<ファイルのパス>'!<関数名>", Arg1, Arg2,,,,) の形式で関数呼び出し RetVal = ObjExcel.Run ("'" & CurrentDir & FileName & "'!" & FuncName, Array("aa", "bb", "cc", "dd"), 1) ' Excelオブジェクト後片付け ObjExcel.Quit Set ObjExcel = Nothing ' エラーが発生していれば詳細を、発生していなければ関数の結果を表示 If (Err.Number <> 0) Then MsgBox(Err.Discription) Else MsgBox RetVal End If WScript.Quit
ある程度遅くてもよければ、同じようにExcelを経由して
スクリプトからWin32APIを使用できる。
サンプル
戻る