2017-08-02 126 views
0

我正在處理的VBA代碼當前一次更新一個Worksheet上的六個不同的數據表 - 它刪除密碼保護,計算第一個數據表,硬編碼值並移動到下一個,然後再鎖定一切,並說謝謝。Excel VBA多個複選框激活部分代碼

其目的是讓一個宏能夠「分離」處理單個數據表的代碼的六個部分,使得它只更新已由用戶選擇的那些數據表,同時保留單個代碼(不是每個選項的單獨子),並且通過單個CommandButton激活整個過程。

爲了達到這個目的,除了編寫實際的代碼之外,我創建了一個UserForm,並插入了六個CheckBox和一個CommandButton,但是如何進一步處理它。如何根據選中的框激活/禁用部分代碼?

+0

RE your mod flag:首先,收到答案並不一定表明您的問題對我們的格式而言是明確的或可接受的。回答者可能剛剛猜對。這個問題對我來說是有問題的,即使是現在的格式,至少有兩個原因:(1)它不包括使我們「現在擁有」的(mcve),(2)它幾乎肯定是「太寬泛「,因爲一個好的答案將不得不向你解釋VBA編程的基礎知識,這實際上比我們預期的Stack Overflow的答案要多。 –

+0

至於爲什麼你的編輯後的問題被置於「擱置」沒有導致重新開放......它實際上[把問題放在重新打開的隊列中](https://stackoverflow.com/review/reopen/16920148),社區成員審查您的編輯並確定他們不足以激發重新開放問題。作爲主持人,我不願意推翻值得信賴的社區成員,尤其是考慮到我的保留意見,這個問題太廣泛了。通常情況下,你可以縮小一點,但得到答案後很難。這就是爲什麼我們儘早關閉。 –

+0

不夠公平,我承認這是一個非常基本的問題,並且在內容上表達了一些措辭...... –

回答

0

所以在VBA中有事件監聽器。這可以在工具欄下面編輯器的上半部分看到。下拉到左邊是對象。下降到正確的事件。

快速方法是查看用戶窗體並雙擊該對象。這將根據該操作爲該對象創建一個Private Sub。所以下面的代碼是一個帶有三個選項按鈕的用戶窗體。與你相同的邏輯只需插入你需要的代碼。

Private Sub OptionButton1_Click() 
MsgBox "1" 
End Sub 

Private Sub OptionButton2_Click() 
MsgBox "2" 
End Sub 

Private Sub OptionButton3_Click() 
MsgBox "3" 
End Sub 

此外,如果選項按鈕是通過檢查其.Value屬性選擇,您可以檢查。檢查後運行一些代碼。

Private Sub CommandButton1_Click() 
If UserForm1.OptionButton1.Value = True Then 
    'Execute Code 
ElseIf UserForm1.OptionButton2.Value = True Then 
    'Execute Code 
Else 
    'Execute Code 
End If 
End Sub 

代碼在模塊1

Private Sub select_column_a() 
    Range("A:A").Select 
End Sub 

呼叫內的另一個子

Private Sub CommandButton1_Click() 
    Module1.select_column_a 
End Sub 
+0

感謝你的支持 - 在試用過程中。但有一點 - 代碼是在第一單元中,在開始時,整個工作簿被逐一解鎖,一些準備工作被解鎖,然後我想用UserForm帶上覆選框和CommandButton。你是說我應該將整個代碼輸入到Button的Private Sub中?我希望通過單擊工作表上的按鈕來調用用戶窗體,選擇選項(複選框),然後讓CommandButton激活代碼的其餘部分,並將這些框的值考慮在內。 –

+0

那麼你可以在Module1中保留一個Private Sub並在Userform中調用它。代碼將運行或可以被調用,不管它是私人的還是鎖定的表格。 – fcsr

+0

你甚至可以命名Subs相同的名稱,只要它們在不同的模塊中,然後用模塊名稱調用它們。 Module1.subber和Module2.subber – fcsr

0

@fscr再次感謝你 - 就像一個魅力,與一些補充,這就是爲什麼我張貼這裏是爲了像我這樣的其他初學者的利益。

在一個命令我插入表子很簡單:

Private Sub CommandButton1_Click() 
UserForm1.Show 
End Sub 

這說明所有的複選框我UserForm1和一個命令按鈕說:「去」

GO按鈕(也CommandButton1的 - 有沒有衝突)有這裏面:

Private Sub CommandButton1_Click() 
code 
End Sub 

其中的代碼是我的代碼名稱存儲在模塊1(是的,我沒有...) - 它順利執行它沒有任何九月憤怒的召喚功能。這裏的問題,可能存在向後兼容性問題?我在Excel 2016中工作,並瞭解到,例如ISFORMULA在這裏是新的,並拋出舊機器上的問題。

那麼整個代碼踢在

Sub code() 
UserForm1.Hide 

其次是各種行動,直到它到達我的複選框,上述的建議(以ammendments):

Application.Cursor = xlWait 
Application.DisplayStatusBar = True 
Application.StatusBar = "Calculating Sensitivities..." 
Application.EnableCancelKey = xlDisabled 

If UserForm1.CheckBox1.Value = True Then 

Range("A6:G15").Select 
Selection.Table ColumnInput:=Range("AD3") 
Application.Calculate 
Range("B7:G15").Select 
Selection.Copy 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Application.CutCopyMode = False 

ElseIf UserForm1.CheckBox2.Value = True Then 

Range("AD17:AM26").Select 
Selection.Table ColumnInput:=Range("AD2") 
Application.Calculate 
Range("AE18:AM26").Select 
Selection.Copy 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Application.CutCopyMode = False 

等。

的代碼執行剩餘的選項選中,然後是結束如果和其他代碼(清理,鎖定表等),直到

Application.ScreenUpdating = True 
Application.EnableCancelKey = xlEnabled 
End Sub 

都沒有任何錯誤。再次感謝你!

+0

Private Sub CommandButton1_Click()中沒有衝突的原因是Module和Userform1在不同的範圍內。您不需要添加Userform1.CommandButton,因爲命令按鈕位於userform1的範圍內。只是爲了增加信息。 – fcsr

+0

很高興幫助! – fcsr