2012-03-13 25 views
4

我在Windows 7的Outlook 2010中編寫VBA並希望將宏(或子例程)的名稱作爲字符串變量傳遞給另一個子例程並讓這個例程運行宏。在Word中,您可以使用 Application.Run MacroName:= strMacroName 其中strMacroName是具有宏名稱的字符串變量。該方法在Outlook 2010中不起作用。我該如何完成同樣的事情? 我試圖在Outlook 2010 VBA中運行名稱作爲參數傳遞的宏

  1. Call Application.strMacroName
  2. Call strMacroName
  3. strMacroName在自己的行
  4. Outlook.Application.strMacroName

沒有這些事情的來龍去脈。

我剛剛升級到Outlook 2010,因此不能再使用鍵盤快捷鍵來運行處理電子郵件的自定義代碼。因此,爲了恢復某些版本的功能,我創建了代碼來顯示一個對話框,其中包含我最常用的宏。隨着時間的推移,代碼變得相當乾淨,並傳遞了我想運行的宏的名稱,但我曾經可以在一個命令(Application.Run MacroName:=strMacroName)中運行該例程。

現在我必須包含一個長開關語句來完成同樣的事情。幾乎沒有那麼簡單。

謝謝!

+1

CallByName()?儘管如此,這並不比你的選擇案例更好。事實上,我不確定它是否適用於Outlook。而你的潛艇必須包含在類模塊中。 – 2012-03-13 03:16:06

+0

@Tim CallByName存在於Outlook VBA中,無論它是否有效我還沒有檢查。 – JimmyPena 2012-03-13 19:36:42

+0

我試過CallByName(),但到目前爲止沒有運氣。看來我不得不跳過不少編碼環節才能實現這個目標。 – Jeff1265344 2012-03-14 18:42:17

回答

6

CallByName似乎是唯一的出路。

有了這個代碼在ThisOutlookSession

Public Sub TestFoo() 
    Dim testClass As New TestClass1 
    CallByName testClass, "TestMethod1", VbMethod 
End Sub 

而這種代碼TestClass1

Public Sub TestMethod1() 
    MsgBox "huzzah!" 
End Sub 

調用ThisOutlookSession.TestFoo給你預期的消息框。

+0

感謝您的幫助。我收到錯誤。 「編譯錯誤:模塊不是有效類型」,突出顯示ThisOutlookSession中的TestFoo例程。我試着用一個模塊中的所有代碼,並得到這個錯誤:「編譯錯誤:New關鍵字的無效使用」。我不擅長創建用戶定義的類,我錯過了什麼嗎? – Jeff1265344 2015-03-08 20:02:26

+0

@ Jeff1265344你可能寫了'Dim testClass = New TestClass1',VBA不支持這種類型的賦值,'New'關鍵字必須是「as type子句」的一部分......我實際上在我之前運行了這個代碼發佈它;) – 2015-03-08 20:04:32

+0

@ Mats-Mug,當您發佈此建議時,看起來我正在編輯我的帖子。我從未編輯的代碼中複製並粘貼,並且仍然發現此問題。或許我需要參考文獻中的某些內容? – Jeff1265344 2015-03-08 20:13:05

0

據我所知,在Outlook中以編程方式運行命名宏的唯一方法(不使用自定義類,正如其他答案所做的那樣)是創建臨時CommandBarButton,執行並立即刪除它。這適用於Outlook 2013中,即使功能區:

Public Sub runProc(procToRun As String) 
With Application.ActiveExplorer.CommandBars.Add("Custom", temporary:=True) 
    With .Controls.Add(msoControlButton, 1, , , True) 
    .OnAction = procToRun 
    .Execute 
    .Delete 
    End With 
.Delete 
End With 
End Sub 

我知道這是一個老問題,但是我無法找到這個確切的答案我自己在2017年後期,所以希望它可以幫助別人。請注意,這不會運行在ThisOutlookSession中的宏...您的宏需要在代碼模塊中。