2016-09-17 4 views
3

MSScriptControlで読んだことがあるすべてのドキュメントは、追加されたオブジェクトのイベントに応答できると言っています。Microsoft Script Controlでイベントを実装する方法

スクリプトコントロールを使用すると、オブジェクトのイベントが発生したときに自動的に というスクリプトを作成することができます。 https://msdn.microsoft.com/en-us/library/ms974586.aspx

のScriptControlは、AddObjectメソッドを使用して追加 オブジェクトによって生成されたイベントをシンクすることができるであろう。 http://flylib.com/books/en/1.492.1.154/1/

しかし、私は成功していません。これは、追加されたオブジェクトがイベントを発生させるとScriptControl内のコードが起動することを意味します。私は働くことができません。

任意のオブジェクトをScriptControlに追加し、そのコントロールによって発生したイベントを処理するサンプルコードを検索してください。オブジェクトがカスタムクラス、フォーム、コントロール、またはWorksheetなどの組み込みExcelオブジェクトであるかどうかは気にしないでください。

Windows Server 2008 64bit上でOffice 2010 32bitを実行しています。このようWSHなどの代替方法とは

オープン、しかしTushar Mehta氏は、ここでそのhttp://dailydoseofexcel.com/archives/2009/08/19/using-vbscript-to-monitor-office-eventsor-not/

の成功を持っていなかった私は正常のScriptControlにExcelのApplicationオブジェクトを追加し、ExcelのApplicationオブジェクト上でコードを実行してきました:

これは何の問題も働きません:

Function TestProc() 
      Dim oScriptCtl As New MSScriptControl.ScriptControl 

      With oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        ' add Excel application object 
        .AddObject "app", Application, True 

        ' add procedure 
        Dim sCode As String 
        sCode = "Sub TestProc : MsgBox ""hi"" : End Sub" 
        .AddCode sCode 

        ' run procedure. Msgbox displays. 
        .Run "TestProc" 
      End With 

      ' cleanup 
      Set oScriptCtl = Nothing 
End Function 

の失敗:

このテストでは、m_oScriptCtlはモジュールスコープの変数です。

Function TestForm() 
      Set m_oScriptCtl = New MSScriptControl.ScriptControl 

      With m_oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        MyForm.Show False 

        .AddObject "app", Application, True 
        .AddObject "frm", MyForm, True 
        .State = Connected 

        Dim sCode As String 
        sCode = "Sub frm_Click(): MsgBox Chr(14): End Sub" 
        .AddCode sCode 
      End With 
End Function 

この次のいずれかが.AddCodeに次のエラー報告:

期待を ')'

次のテストで
Function TestSheet() 
      Set m_oScriptCtl = New MSScriptControl.ScriptControl 

      With m_oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        .AddObject "app", Application, True 
        .AddObject "sheet", Sheet2, True 
        .State = Connected 

        Dim sCode As String 
        sCode = "Private Sub sheet_Change(ByVal Target As Range): MsgBox Target: End Sub" 
        .AddCode sCode 
      End With 
End Function 

、私は、フォームをクリックしても何も起こりませんMyClassは次のように定義されます。

Public Event MyEvent() 

Public Sub TestEvent() 
      RaiseEvent MyEvent 
End Sub 

しかし、以下のレポートは.Runの "オブジェクトはプロパティまたはメソッドをサポートしていません"。この場合、失敗するイベントではありません。クラス内でメソッドを実行することはできません。

Function TestClassEvent() 
      Set oScriptCtl = New MSScriptControl.ScriptControl 

      Dim oClass As New MyClass 

      With oScriptCtl 
        ' init 
        .Language = "VBScript" 
        .AllowUI = True 

        ' add objects 
        .AddObject "app", Application, True 
        .AddObject "oClass", oClass, True 
        .State = Connected 

        ' add code 
        Dim sCode As String 
        sCode = "Sub oClass_MyEvent() : MsgBox vbNullString : End Sub" 
        .AddCode sCode 

        .Run "oClass.TestEvent" 
      End With 

      ' cleanup 
      Set oScriptCtl = Nothing 
End Function 

手がかりは:

誰かが掲示:あなたは完全にあなたのイベントをシンクに失敗した場合

、 「ScriptControl1.Modules( "グローバル")CodeObjectを呼び出してみてください。Name_Of_Your_Event(のParameterList)」 http://computer-programming-forum.com/59-vbscript/4b059f9f6eacfaf0.htm

- それの回避策は、私には不明である:イベントプロシージャは、明示的に、彼らはちょうど火ことになっている 『と呼ばれる』ことになっていません。次の行の両方与える上記TestClassEventの例では、「メソッドまたはデータメンバが見つかりません。」:私は次のことをテストしていませんでした

m_oScriptCtl.Modules("Global").CodeObject.MyEvent 
m_oScriptCtl.Modules("Global").CodeObject.TestEvent 

、私はかなりよく分からないので、どのように:

以下は、dは関連性がある場合、スクリプト制御は、それがhttps://diigo.com/08we68

わからない でホストされていたアプリケーションと同じ プロジェクト内のクラスからのイベントを処理することはできませんon'tかなりそれを理解する: http://www.programmersheaven.com/discussion/79452/me-activecontrol-and-events

+0

おそらく、オブジェクトを追加するだけで、そのオブジェクトのコードを使わずにオブジェクトを追加するだけです。 oClassをオブジェクトとして追加したように、そのコードは追加されませんでした。これは私たちがSet objModule = .Modules.Add( "NewModule")を持っているからだと思って、その後objModule.AddCodeを使ってコードを追加します。だから、クラスを追加し、それにコードを "Private WithEvents frm As New UserForm"、 "Private Sub frm_Click()"&_ vbNewLine&vbTab& "MsgBox" "追加されたモジュールからの世界" "&_ vbNewLine&" End Sub " –

+0

こんにちは@MukulVarshney、提案のためのthx。しかし、ScriptControlにオブジェクトを追加した後で、オブジェクトにコードを追加する方法がわかりません。あなたはモジュールを追加すると言いますが、追加されたモジュールを追加されたオブジェクトにどのように関連づけますか?コードを表示できますか? -thx –

答えて

1

それを機能させるための鍵はです:あなたは、スクリプトControl--の両方に追加後にリスナークラスでイベント・発火・オブジェクトを設定する必要がありますこれまでにないつまり、このラインは、SC内で実行する必要があります。

Set oListener.EventFiringObject = oEventFiringObject

はここで発火の作業例だと、スクリプトコントロール内のオブジェクト間のイベントに応答します。この例では

:カスタムクラス、およびワークシート:

  • 私は2イベント発射オブジェクトの種類を示しています。
  • カスタムクラスは、scriptcontrol( "sc")に追加する前にインスタンス化されます。
  • カスタムscオブジェクトのメソッドを呼び出します。
  • セットアップするには

デモ

  • スタート新しいプロジェクト(すなわち、Excelで新しいブックを追加します)。
  • VB IDEで、Microsoft Script Controlへの参照を追加します。
  • 作成し、以下のVBコンポーネント:

コード

クラスclsSheetListener

Public WithEvents oSht As Worksheet 

Private Sub oSht_Change(ByVal Target As Range) 
    ' show changed cell 
    MsgBox "Sheet Listener" & vbCrLf & "Changed: " & Target.Address _ 
      & vbCrLf & Target.Cells(1).Value2 
End Sub 

クラスclsEventClass

Public Event MyEvent(sCaller As String) 

Public Sub Raise_MyEvent(sCaller As String) 
    RaiseEvent MyEvent(sCaller) 
End Sub 

クラスclsClassListener

Public WithEvents m_oEventClass As clsEventClass 

Private Sub m_oEventClass_MyEvent(sCaller As String) 
    ' show my execution-scope 
    MsgBox "Class Listener, " & sCaller & " caller" 
End Sub 

モジュールModule1

Function Main() 
    ' init scriptcontrol 
    Set m_oScriptCtl = Nothing 
    Set m_oScriptCtl = New MSScriptControl.ScriptControl 
    With m_oScriptCtl 
    .Language = "VBScript" 
    .AllowUI = True 

    ' add Excel application object, needed for all Excel methods in script-control 
    .AddObject "sc_Application", Application, True 


    ' add Sheet2 to the sc 
    ' code executed in sc refers to objects by name, as defined in .AddObject 
    .AddObject "sc_oSheet", Sheet2, True 

    ' init sheet event-listener, and add to sc 
    Dim oSheetListener As New clsSheetistener 
    .AddObject "sc_oSheetListener", oSheetListener, True 

    ' register the sheet-object with its listener in the scriptcontrol 
    ' so the listener can hear the sheet's events 
    .ExecuteStatement "Set sc_oSheetListener.oSht = sc_oSheet" 


    ' init custom event-firing class object, and add to sc 
    Dim oEventClass As New clsEventClass 
    .AddObject "sc_oEventClass", oEventClass, True 

    ' init class-event listener, and add to sc 
    Dim oClassListener As New clsClassListener 
    .AddObject "sc_oClassListener", oClassListener, True 

    ' register event-firing object with its listener inside the Script Control 
    ' so the listener can hear the object's events 
    .ExecuteStatement "Set sc_oClassListener.m_oEventClass = sc_oEventClass" 


    ' cause event to be raised. 
    ' Call from local context, then sc-context. 
    ' it's the same object instance in both cases 
    oEventClass.Raise_MyEvent "Local" 
    .ExecuteStatement "sc_oEventClass.Raise_MyEvent ""SC""" 

    End With 
End Function 

テストMain()

ステップ。 Raise_MyEventMyEventclsEventClassに書き込むと、clsClassListenerがメッセージボックスでイベントに応答します。

Excelのフロントエンドに切り替え、Sheet2のセルに値を入力します。メッセージボックスでChangeイベントに応答すると、clsSheetListenerが表示されます。

+0

次の目標は、Script Controlの内部でリスナーおよび/またはイベントソースをインスタンス化することです。 –

関連する問題