0

vbaのイベント処理を学んでいます。これが私の最初の試みです。

'in sheet Object
Dim WithEvents engine As MCengine

Private Sub engine_OnEachTrial(ByVal i As Integer)
progressBar = Application.Floor(i * 30 / engine.numOfPaths, 0.001)

With ActiveSheet.Range("E10").Characters(start:=0, Length:=progressBar).Font
    .Name = "Calibri"
    .FontStyle = "Bold"
    .Size = 11
    .ColorIndex = 16
End With
End Sub

Private Sub Worksheet_Activate()

Dim btn As Button
Dim rng As Range
Set engine = New MCengine
With ActiveSheet
Set rng = .Range("E9")
Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
    With btn
    .Caption = "Run MC simulation"
    .OnAction = "runMC"
    End With
End With

End Sub

Sub runMC()

engine.process = 1
engine.numOfPaths = 30
engine.start

End Sub

上記のコードの問題は、runMCがモジュールにある必要があるように見えるため、onActionによって登録されたサブプロシージャを呼び出せないことです。Dim WithEvents engine As MCengineシートオブジェクトで宣言する必要があるため、これらのコードをモジュールに移動できません。だから私は真ん中で立ち往生しています。他のボタンコールバックメソッドを使用する必要がありますか?

モジュール内のイベントでクラスを使用できないということですか?誰でも私を啓発することができますか?

4

1 に答える 1

1

このコードをブック全体で機能させたいと思いますが、これが「Activesheet」を使用する理由ですか?
その場合は、Thisworkbookモジュールにコードを貼り付ける必要があります。

Option Explicit

Private Sub Workbook_SheetActivate(ByVal oSheet As Object)
    Dim btn As Button
    Dim rng As Range


    'Set engine = New MCengine
    With oSheet
        Set rng = .Range("E9")
        Set btn = .Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
        With btn
            .Caption = "Run MC simulation"
            .OnAction = "Thisworkbook.Test_btn"
        End With
    End With
End Sub

Sub Test_btn()

MsgBox "Ok"

End Sub

そうでない場合は、通常のシートモジュールとシートイベントに貼り付けることができます:
private sub Worksheet_Activateですが、次の場所で正しいシートオブジェクトを定義するように注意してください。

.OnAction = "Sheet1.Test_btn"
于 2012-07-31T08:28:14.213 に答える