2016-01-29 79 views
0

在VBA for Excel中,如何將模塊中現有的函數或子項(如myFun())分配給新添加的ActiveX單擊按鈕?將模塊功能分配給ActiveX命令按鈕DIRECTLY

我知道我可以在ActiveX命令(單擊)按鈕所在的工作表代碼頁上執行以下操作。

Private Sub myFun_Click() 
myFun() 
End Sub 

「直接」我的意思是與具有如上述所示的另一子放置myFun()命名按鈕「myFun」和直接指向的按鈕功能myFun()。

+2

不那麼nitpicky nitpick:一個'Sub'是*程序*,而不是*函數*。一個'Function'具有返回值,'Sub'不具有返回值。標準代碼模塊(.bas)中的'Function'可以暴露在工作表公式中作爲* UDF *使用,標準代碼模塊(.bas)中的Sub可以用作*宏*。 –

+0

@ Mat'sMug:+1最後兩句特別貼切。在我的回答下面看到我的評論。謝謝! – Hans

回答

1

有2種類型的控件可以放置在工作表:

  • ActiveX控件

    您在通過雙擊處理他們Click事件代碼隱藏,控制併爲其生成處理程序。

  • 窗體控件

    指定宏到這些控件,就像你將宏指定到任何其他形狀。宏可以是現有的宏(非專用標準模塊中的任何無參數Public Sub過程)。

如果你想給一個按鈕分配給MyFun,假設簽名如下所示:

Public Sub MyFun() 

那麼你可以嘗試使用表單控件而不是一個ActiveX控件。

注意:MyFun()必須是一個Sub才能被暴露爲宏。 'Sub'是程序,而不是函數。 'Function'具有返回值,'Sub'不具有返回值。 '標準代碼模塊(.bas)中的函數可以暴露在工作表公式中作爲UDF使用,標準代碼模塊(.bas)中的'Sub'可以用作

+0

你在說我不能將現有的sub myFun()分配給一個ActiveX控件按鈕,對吧?我試圖將該子分配給一個Form控件按鈕,但似乎我無法做到這一點。我只能將「宏」指定給該按鈕,但我無法在彈出的表中找到子名稱以供選擇。我該怎麼辦? – Hans

+0

如果在宏列表中找不到子名稱,該過程不是'Public',有參數,或者沒有寫入標準代碼模塊(.bas),或者該模塊具有'Option Private Module '集合。 –

+0

謝謝。感謝您在我的問題下方的評論,我將「function」更改爲「sub」後,我在宏列表中看到名爲myFun的名稱。 – Hans

1

VBA勢必控制事件是「本地」被確定指標的工作表,因此,如果你把按鈕「A」工作表「W1」所產生的點擊事件處理函數將被命名爲:

Private Sub A_Click() 

但是,如果在工作表「w2」上放置按鈕「A」,則單擊事件處理程序簽名將相同,但實際上會觸發放置在「w2」上的按鈕的單擊事件。

如果您想在用戶點擊來自不同的工作表按鈕「A」來實現相同的行爲,那麼你需要通過在VBA 模塊,這是在所有的共享增添一分/功能來做到這一點工作簿對象的工作表。

Private Sub A_Click() { 
    CommonFunction() 
} 
+0

感謝您的回答。但是,您的答案不能回答我的問題。答案中的第二個代碼就是我在我明確表示不想要的問題中給出的例子。我想直接調用myFun()而不使用嵌套它的​​另一層函數。 – Hans