2014-04-18 80 views
1

我有一個用戶表格,是由許多潛艇,這被指定爲一個宏到工作表上的按鈕。當用戶完成這個用戶表單時,他們可以按下一個按鈕,這會導致其可見性變爲錯誤,再次輸入時,所有內容都會顯示如何留下,從而導致保存功能。「包含」在Excel VBA中?

我現在需要這個應用到多個按鈕的工作表上,並且每個用戶表單需要有完全相同的代碼和相同的按鈕,但是是一個獨立的形式,每個單獨按鈕需要它自己保存喜歡的功能。我打算這樣做的方式是複製現有的用戶表單並多次粘貼不同的名稱,但如果需要修改,則需要很長時間才能執行,因此,是否有方法(如「包含」它可以使用一個基本模塊,從中可以訪問所有的代碼,這樣如果我需要更改任何內容,我只需要在該模塊上執行任何操作,而其他所有內容都通過包含進行更新?

編輯:

我現在有一個叫公共職能成本(),當我用我得到一個錯誤:

Private Sub material_Change() 
Call costing 
End Sub 
+0

看看這個答案:http://stackoverflow.com/questions/19881863/how-to-use-comparison-methods-between-class-object-modules-in-vba-in-a-similar-m/19908375#19908375 – tmoore82

+1

另外這個:http://stackoverflow.com/questions/19373081/how-to-use-the-implements-in-excel-vba/19379641#19379641 – tmoore82

+0

什麼是錯誤? –

回答

0

你可以有多個相同表單的實例。您可以使用此保留多套形式的值

試試這個:

創建您的形式,像往常一樣。讓我們把它叫做MyForm

你表創建幾個按鈕。我的例子使用ActiveX按鈕,但也可以使用Form Control按鈕。讓我們稱之爲CommandButton1CommandButton2

在表單模塊,包括Terminate分,其中包括該代碼

Private Sub UserForm_Terminate() 
    ' any other code you may need... 
    Unload Me 
End Sub 

表單布頓保存/隱藏的形式必須是

​​

片材按鈕代碼如下

  • 的代碼是爲每個按鈕相同(並調用一個公共子),和每個按鈕都有自己Static形式變量)。
  • 需要錯誤處理程序來處理與表單正確關閉的情況。在這種情況下,例如不再存在,但局部靜態變量也不是沒有
  • 例子顯示顯示爲無模式形式,你可以,如果你想改變這個爲Modal。

    Private Sub CommandButton1_Click() 
        Static frm As MyForm 
        ShowMyForm frm 
    End Sub 
    
    Private Sub CommandButton2_Click() 
        Static frm As MyForm 
        ShowMyForm frm 
    End Sub 
    
    
    Private Sub ShowMyForm(frm As MyForm) 
        If frm Is Nothing Then Set frm = New MyForm 
    
        On Error GoTo EH 
        frm.Show vbModeless 
    Exit Sub 
    EH: 
        If Err.Number = -2147418105 Then 
         On Error GoTo 0 
         Set frm = Nothing 
         Set frm = New MyForm 
         frm.Show 
        End If 
        On Error GoTo 0 
    End Sub 
    

最終結果:形式相同的多個副本,每個都有自己的價值觀

enter image description here


UPDATE

在性反應發表評論如何我會訪問va嗎?每個用戶內部的riable在外部形成

在示例中,Form實例只能在From模塊本身的Command Button Click Handler例程中訪問。如果您可以在表單模塊中編寫代碼,則不需要進行更改。

要使表單實例在別處可用,請考慮將其聲明移至標準模塊的模塊範圍。你可以聲明它們,例如單個變量,一個數組(靜態或動態),一個集合,一個字典。哪種結構最好取決於你想如何管理和訪問你的表單實例。

對於eaxample,一個靜態數組:代碼在標準模塊

Option Explicit 
Global MyForms(1 To 2) As MyForm 

更新CommandButton代碼

Private Sub CommandButton1_Click() 
    ShowMyForm Module1.MyForms(1) 
End Sub 

Private Sub CommandButton2_Click() 
    ShowMyForm Module1.MyForms(2) 
End Sub 

Private Sub ShowMyForm(frm As MyForm)沒有變化,相同的代碼工作的前

與之前相同,但您現在可以訪問標準模塊中的全局變量

Sub Demo() 
    Dim i As Long 

    For i = LBound(MyForms) To UBound(MyForms) 
     If Not MyForms(i) Is Nothing Then 
      MsgBox "For " & i & " Value = " & MyForms(i).TextBox1.Value 
     End If 
    Next 
End Sub 
+0

你是天才!非常感謝你爲這個美妙的優雅解決方案。您的幫助非常感謝! – user3508196

+0

你已經爲我做了很多,但如果你能幫助我最後一件事,我將不勝感激。 我如何從外部訪問每個用戶表單中的變量(例如,來自模塊的文本框的「1」和「2」中的值),就像我通常指定要查看哪個用戶表單一樣。謝謝。 – user3508196

+0

@ user3508196查看更新的答案 –

1

你並不需要一個「包含」(無VBA中存在);所有你需要做的就是創建一個模塊並且公共的方法。

例如,如果您創建一個模塊,並具有這樣的功能:

Public Function Add(first As Integer, second As Integer) As Integer 
    Add = first + second 
End Function 

然後你就可以像這樣從另一個模塊/表格/類模塊訪問:

Sub test() 
    MsgBox Add(3, 6) 
End Sub 
+0

我已經試過了,請參閱上面的編輯。我也嘗試過「成本計算」和「成本計算()」兩次,我得到的錯誤。 – user3508196