2015-11-03 73 views
0

我有一個電子表格模板,需要運行不同的宏,根據在按下按鈕之前勾選了哪些複選框。我在一個if語句中寫了一個if語句,這個語句在一些複選框中沒有問題,但是爲了解決所有場景中需要構建的ifs的數量會呈指數級增長。現在有6個盒子可以檢查,這應該運行所有的可能性。使用循環根據選中的複選框在Excel中運行某些宏

讓我們保持簡單並調用複選框CB1-CB6,它們應該運行相應的宏M1-M6(取決於檢查哪個CB),以任意組合方式運行(也就是說,您可以選擇運行CB1和CB5來運行M1和M5,或者你可以選擇全部6來運行全部6個宏)。

現在它看起來像:

Sub Checkboxes() 
If ActiveSheet.CB("CB1").Value = 1_ 
and ActiveSheet.CB("CB2").Value = 1 Then 
Call M1 
Call M2 
ElseIf ActiveSheet.CheckBoxes"CB1").Value = 1_ 
And ActiveSheet.CheckBoxes("CB2").Value = 0 Then 
Call M1 
ElseIf ActiveSheet.CheckBoxes("CB2").Value = 1_ 
And ActiveSheet.CheckBoxes("CB1").Value = 0 Then 
Call M2 
Else: MsgBox "Please select at least one option to proceed." 
End If 
End Sub 

但你可以看到書面如果每一個場景說法變得很長,肯定不會寫它的最佳方式。

+0

「ElseIf ActiveShee t.CheckBoxes(「CB1」)。Value = 1_ 和ActiveSheet.CheckBoxes(「CB1」)。Value = 0 Then'不會發生 – sous2817

+0

你是什麼意思?這是目前如何工作的一個例子。 – wmab

+0

複選框(「CB1」)不能同時爲1和0。你有一個錯字。它應該是複選框(「CB2」).Value = 1和複選框(「CB1」)。值= 0.無論哪種方式,我認爲有一個更簡單的方法(正如我在我的答案中概述) – sous2817

回答

1

看來你可能會過於複雜的事情(或者我不完全確定你在做什麼)。如果有6個複選框,並且勾選了checkbox1,則運行macro1。 checkbox2打勾,運行宏2等,然後你可以做類似的事情:

If ActiveSheet.CB("CB1").Value = 1 then Call M1 
If ActiveSheet.CB("CB2").Value = 1 then Call M2 
If ActiveSheet.CB("CB3").Value = 1 then Call M3 
If ActiveSheet.CB("CB4").Value = 1 then Call M4 
If ActiveSheet.CB("CB5").Value = 1 then Call M5 
If ActiveSheet.CB("CB6").Value = 1 then Call M6 

對不對?不應該有一個理由來描述一個冗長的「if elseif」條款來涵蓋不同的情景。

要檢查是否有代碼運行,這是一種方法。有更多優雅的方式,但這應該讓你開始,並且很容易讓你看到發生了什麼,並且如果需要的話可以稍微延長一點。當你獲得更多的VBA經驗時,你無疑會重構這個更優雅。

Sub Test() 
Dim AtLeastOneRan As Boolean 

    If ActiveSheet.CB("CB1").Value = 1 Then 
     AtLeastOneRan = True 
     Call M1 
    End If 

    If ActiveSheet.CB("CB2").Value = 1 Then 
     AtLeastOneRan = True 
     Call M2 
    End If 

    If ActiveSheet.CB("CB3").Value = 1 Then 
     AtLeastOneRan = True 
     Call M3 
    End If 

    If ActiveSheet.CB("CB4").Value = 1 Then 
     AtLeastOneRan = True 
     Call M4 
    End If 

    If ActiveSheet.CB("CB5").Value = 1 Then 
     AtLeastOneRan = True 
     Call M5 
    End If 

    If ActiveSheet.CB("CB6").Value = 1 Then 
     AtLeastOneRan = True 
     Call M6 
    End If 
    If Not AtLeastOneRan Then MsgBox "Please select at least one option to proceed." 
End Sub 
+0

如果所有這些都失敗,您是否需要使用.value = 0的全部6個選項來執行elseif以獲得消息框? – wmab

+0

@wmab看我的編輯。有很多方法可以做到這一點,但我認爲這可能是最簡單最容易遵循的方式。 – sous2817

+0

謝謝@ sous2817工作!我必須將ActiveSheet更新爲表單(「表單1」),因爲宏指向不同的表單,因此無法找到它在當前活動表單上查找的複選框,但運行良好,線路比我的第一次嘗試少很多! – wmab

1

如果該複選框名稱和子名稱都與1:1,有一個更好的方法,然後創造這麼多的IF條件。

考慮這些複選框命名爲 「CB」 開始:模塊1
CheckBoxes

隨着代碼在

Option Explicit 

Private Const PREFIX As String = "Module1.M" ' <-- Change this to match your Module Name and Prefix of the Sub Names 

Sub LoopCheckboxes() 
    Dim sRun As String, oChkBox As Object 
    For Each oChkBox In ActiveSheet.CheckBoxes 
     With oChkBox 
      Debug.Print "Checkbox name: " & .Name 
      If .Value = 1 Then 
       sRun = PREFIX & Mid(.Name, 3) 
       Debug.Print "sRun: " & sRun 
       Application.Run sRun 
      End If 
     End With 
    Next 
End Sub 

Sub M1() 
    Debug.Print "M1()" 
End Sub 

Sub M2() 
    Debug.Print "M2()" 
End Sub 

Sub M3() 
    Debug.Print "M3()" 
End Sub 

當您執行LoopCheckBoxes,您可以:
Output

+0

嘿謝謝@PatricK!他們沒有完全用這種方式標記,但我可以輕鬆更新它們。我需要根據這些選擇構建一些宏來做不同的事情,所以下次我會嘗試你的方法,非常感謝! – wmab

+1

歡迎@wmab。順便說一句,請不要使用該複選框名稱約定,因爲「** CB1 **」是有效的單元格地址。也許「** CB_1 **」是更好的方法。 – PatricK