2010-02-17 58 views
8

我試圖調用Excel宏那是另一個工作簿。它是一個特定於表格的宏,但Microsoft文檔和Web上的研究只給出了一種通過工作簿訪問宏的方法。這語法是:如何在另一個Excel工作簿中調用特定於表單的宏?

Application.Run ("testworkbook.xls!macroname") 

我需要做的是在那裏也有紙基準,是這樣的:

Application.Run ("testworkbook.xls!Sheet1.macroname") 

我已經試過這與許多其他變化,包括具有單或雙在那裏引用,但我總是得到這個消息,宏找不到。

編輯:隨着所有的線索和大量的測試,我找到了答案。您可以訪問特定於工作表的子工具,但必須使用「工作表1」等規範名稱,但不能使用實際工作表名稱。顯然其他工作簿不會訪問該信息。

因此以上格式,只要你不嘗試使用SHEETNAME(和您可能需要單引號的工作簿的名稱(通過連接CHR(39)任一端)的作品。

+0

@Lance羅伯茨:沒有下面的答案回答你的問題? –

+0

@Otaku,是的,儘管我最終只使用了規範表名。但我喜歡你給出的所有信息,所以我會接受你的答案(我已經提出了它)。 –

+0

夠公平的。我不確定非英語用戶界面的規範表單名稱是否相同 - 如果這是您必須處理的內容 - 但這對於這些目的來說很快且很簡單。讚賞接受/贊成。 –

回答

11

我知道你已經想通了這一點,可能多發撕裂和咖啡後,但我想:

  • 給你這是爲什麼
  • 提供了一種方式瞭解詳情,請可以使用 您的工作表的名稱,讓你 想要的東西。

首先,您想要的工作表名稱與代碼模塊名稱不同。因此,在VBE中,您會看到代碼模塊的名稱是「Sheet1」,但是如果可能有不同的屬性(這與Name不同),例如「MySheet1」(或者它也可能相同)。

爲了通過名稱來得到它,你就必須做一些循環,更改安全設置等。如果這就是你以後(這個效果很好,因爲安全設置問題的較小的環境中),在這裏你去爲例:

  1. 更改您的安全設置,以 信任編程訪問VBA 項目。在Excel 2007中,轉到Orb | Excel選項|信任中心|信任中心設置|宏 設置然後啓用「信任 訪問VBA項目模型」
  2. 創建一個工作簿與一個 工作表。將其重命名爲「MySheet1」。 打開VBE(ALT + F11)和 「工作表Sheet1(MySheet1)」 創建子 程序,把它TimesTen和 代碼只是把Debug.Print 10 * 10。就像這樣:

    Sub TimesTen() 
        Debug.Print 10 * 10 
    End Sub 
    
  3. 將文件保存爲一個啓用宏的文檔 並調用它 「MacroXSLX.xlsm」。保持打開狀態。

  4. 打開一個新的Excel文檔,瀏覽 到它的VBE,並在新的宏 任何地方,創建一個名爲 Test子。在該代碼的主體, 把這個: 。

    Sub test() 
    Dim SheetName As String 
    SheetName = "MySheet1" 
    Dim wb As Workbook 
    Set wb = Workbooks("MacroXSLX.xlsm") 
    For Each VBComp In wb.VBProject.VBComponents 
        If VBComp.Properties.Item("Name").Value = SheetName Then 
         Application.Run (wb.Name & "!" & VBComp.Name & ".TimesTen") 
        End If 
    Next 
    End Sub 
    
  5. 按F5運行test,你 應該看到在立即 窗口。

你可以看到在#4我通過所有部件循環(模塊,類等),尋找有具有的MySheet1值的Name屬性之一。一旦我有,我可以再拿到該組件,在這種情況下是工作表Sheet1 的名稱並用它來構建我的字符串,將在MacroXSLX.xlsm運行表的宏。代碼可以進一步清理,當你找到你想要的東西時退出For語句等。

如上所述,唯一真正的缺點是安全設置部分,並確保您有程序訪問到VBAProject - 罰款一到十臺計算機,但如果必須確保總是設置正確以上,可能會很麻煩。

+0

+1更好的信息,謝謝。 –

1

可以調整您的宏接受SHEETNAME作爲參數?然後,當你你原來的工作簿的表中調用它,你可以叫它爲MyMacro(me.name)?然後,當你從其他工作簿中調用它,你可以只把它作爲application.run (「testworkbook.xls!MyMacro」,「sheetname」),其中「sheetname」是您的參數

我不確定是否有其他方法可以做到這一點

+0

有多個工作表具有相同的按鈕,並且它們具有相同的點擊事件(因此每個工作表一個)。我的計劃,如果我不能做到這一點,直接調用這些宏調用子例程(並插入作爲參數在表中)。我只是希望我不必爲了完成工作而更深入。 –

+0

仔細看後,我意識到下游參數是工作表本身,並且您無法使用Run方法傳遞對象。 –

+0

請參閱我的編輯以獲得最終答案。 –

1

VBA項目是否有密碼保護?此外,子是一個私人子?如果是這樣,那麼我不相信這個宏會被發現。

+0

密碼保護是UserInterfaceOnly,所以它不應該阻止代碼。該子是Public。 –

+0

UserInterfaceOnly僅影響代碼是否在受保護的工作表或工作簿上運行。保護VBA項目密碼是不同的。但是如果它是一個公共子,這不應該影響任何東西。如果VBA項目受到保護,則不能從其他模塊調用私人潛艇。 – guitarthrower

+0

查看我的編輯的最終答案。 –

相關問題