2014-05-19 91 views
3

我們可以在中讀取腳本或代碼行嗎?就像我們在中有include函數一樣。導入代碼行

例如:

我們存儲在Excel的地方,並調用範圍爲XYZ

line 1 of code 
line 2 of code 
line 3 of code 

然後在運行時,我們基本上把這個像

Sub my_macro() 
    xyz 
End Sub 

我想宏重複運行幾行代碼,但不想創建另一個宏並傳遞參數。

+0

這可以使用VBIDE庫來完成,但請記住,如果我問*爲什麼*您想要這樣做? – RubberDuck

+0

謝謝你會檢查出來以備將來使用。我意識到我可以通過將其放入循環來實現我的目標。但我在這方面使用PHP或任何語言的這種功能很多。我不必擔心創建函數和傳遞參數,只需導入一組代碼即可。 – dsauce

回答

4

這可以使用Microsoft Visual Basic for Applications Extensibility 5.3(VBIDE)庫完成。有一些great examples at CPearson.com。我通常在開發時使用它來插入代碼片段。我個人會不舒服地執行存儲在Excel表格中的代碼,但是我測試了這個,它確實有效。

我的工作表:

A 
1 MsgBox "I'm a test." 
2 MsgBox "So am I." 

我建立了一個空的子程序,我們會再插入從Excel工作表中。

Private Sub ProcToModify() 

End Sub 

這實際上將代碼插入到ProcToModify子程序:

Sub ModifyProcedure() 
     Dim VBProj As VBIDE.VBProject 
     Dim VBComp As VBIDE.VBComponent 
     Dim CodeMod As VBIDE.CodeModule 
     Dim StartLine As Long 
     Dim NumLines As Long 
     Dim ProcName As String 

     Set VBProj = ActiveWorkbook.VBProject 
     Set VBComp = VBProj.VBComponents("Module1") ' specify module to modify 
     Set CodeMod = VBComp.CodeModule 

     Dim ws As Worksheet 
     Dim rng As Range 
     Dim cell As Range 

     Set ws = ThisWorkbook.ActiveSheet 'change this accordingly 
     Set rng = ws.Range("A1:A2") 'and this 

     For Each cell In rng 
      ProcName = "ProcToModify" 
      With CodeMod 
       StartLine = .ProcStartLine(ProcName, vbext_pk_Proc) 
       NumLines = .ProcCountLines(ProcName, vbext_pk_Proc) 
       .InsertLines StartLine + NumLines - 2, cell.Value 'insert each line at the end of the procedure to get them in the correct order. 
      End With 
     Next cell 
End Sub 

在運行時調用是這樣的:

Public Sub main() 
    ModifyProcedure 
    ProcToModify 
End Sub 

一張大Gotchya: 運行此代碼之前,您需要轉到Excel >>文件>>選項>>信任中心>>信任中心設置>>宏設置和ch eck「對VBA項目對象模型的信任訪問」。

我會想象那是因爲允許訪問項目對象是一個相當安全的風險。

從cpearson.com網站我聯繫到早些時候:

注意:許多基於VBA的計算機病毒通過 創建和/或修改VBA代碼傳播自己。因此,許多病毒掃描程序可能會自動並且沒有警告或確認刪除模塊,這些模塊會引用VBProject對象,導致永久性和不可挽回的 代碼丟失。有關詳細信息,請參閱您的防病毒軟件 的文檔。