2012-07-31 63 views
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 

上述代碼的問題是由onAction註冊的子過程無法調用,因爲它看起來像runMC必須在Module中。我無法將這些代碼移動到模塊中,因爲Dim WithEvents engine As MCengine需要在工作表對象中聲明。所以我被困在中間。我應該使用其他按鈕回調方法嗎?

這是否意味着我不能在模塊中使用事件類?任何人都可以啓發我?

回答

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 

如果沒有,你可以將其粘貼在常規板模塊以及負債表日後事項:
私有子Worksheet_Activate,但照顧您在定義正確的表對象:

.OnAction = "Sheet1.Test_btn" 
+0

遺憾的是,不工作。我仍然無法運行marco。宏可能不在此工作簿中或所有宏可能被禁用。 – archlight 2012-08-01 06:49:24

+0

您可以做的最好的檢查是在創建的按鈕上執行右鍵單擊>分配宏,檢查宏的名稱(包括表格定義 - >這是您應該放在「OnAction」事件上的名稱)和圖爲什麼它沒有連接。正如我的回答所暗示的那樣,您可以將該子存儲在相同的工作表模塊中,而不會出現問題。我嘗試了它,對我來說它工作。 – Trace 2012-08-01 07:28:29

+0

檢查我的更新,更詳細的答覆。 – Trace 2012-08-01 07:39:33