2017-05-03 71 views
0

我創建了一個用戶窗體,其中包含打開的PowerPoint文件的列表並允許用戶選擇他們要使用的窗體。當他們點擊「設置PowerPoint」按鈕時,我想將該按鈕傳遞給VBA模塊,我將把PowerPoint設置爲用戶剛剛選擇的那個。任何幫助將不勝感激。傳遞用戶表單按鈕中的字符串單擊以Excel VBA

用戶窗體代碼:

Option Explicit 

Public SelectedPPT As String 

Private Sub cmdCloseForm_Click() 
    Unload Me 
End Sub 

Private Sub ComboBox1_Change() 
    ComboBox1.RowSource = "Array" 
End Sub 

Private Sub setPPT_Click() 
    'Not sure if this is the best way to select the ppt the user has chosen? 
    SelectedPPT = Me.ComboBox1.Value 
End Sub 

這是窗體的樣子: enter image description here

那我該怎麼走SelectedPPT並把它傳遞到模塊,所以我可以選擇特定的PowerPoint?

+2

'功能PassPPT(strSelectedPPT作爲字符串)......結束功能'使用像'PassPPT(me.combobox1.value)' –

回答

1

您的SelectedPPT正在打破封裝並且可以從表單外部設置,而不僅僅是表單的代碼。您可以通過現場Private和暴露Property Get程序爲它減輕這一設計問題:

Option Explicit 
Private SelectedPPT As String 

Public Property Get SelectedFile() As String 
    SelectedFile = SelectedPPT 
End Property 

設置在窗體的InitializeActivate處理程序ComboBox行源,所以它的初始化一次。然後在ComboBox中選擇更改時指定SelectedPPT - 這是您的ComboBox1_Change處理程序。

這消除了對[設置PowerPoint]按鈕及其Click處理程序的需求。

我將有一個[確定]和[取消]按鈕,我會做的形式記住無論是取消:

Private IsCancelled As Boolean 

Public Property Get Cancelled() As Boolean 
    Cancelled = IsCancelled 
End Property 

Private Sub OkButton_Click() 
    Me.Hide 
End Sub 

Private Sub CancelButton_Click() 
    IsCancelled = True 
    Me.Hide 
End Sub 

然後你還需要考慮的情況:用戶點擊紅色的X按鈕關閉表格;你可以做,通過處理形式QueryClose事件:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    If CloseMode = VbQueryClose.vbFormControlMenu Then 
     IsCancelled = True 
     Cancel = True 
     Me.Hide 
    End If 
End Sub 

邏輯的其餘部分屬於調用代碼 - 假設的形式被稱爲MyAwesomeForm;你有這樣的事情:

Dim filename As String 
With New MyAwesomeForm 
    .Show 
    If Not .Cancelled Then 
     filename = .SelectedFile 
     'do whatever you wanted to do with that filename 
    End If 
End With 

注:

  • 在任何時候調用的形式Unload Me
  • 這是調用者的責任,創造破壞形式對象
  • 來電每次使用表格的New實例
  • 調用者具有對任何值的只讀訪問權限for通過屬性公開
+0

非常感謝,這工作奇蹟! – BH57

+0

@ BH57樂意幫忙!我希望更多的VBA開發者意識到用戶表單有一個默認實例,以及針對該默認實例的有效和反OOP工作方式。確保你看看我的[Rubberduck](http://www.rubberduckvba.com/)項目,如果你認真對待VBA =) –