2016-08-23 32 views
-1

我在複選框的Word表單上獲得了以下代碼。當我檢查一個盒子時,我想清除其他盒子。所以當R00已經被檢查,我檢查R01,我開始通過sub R01_CheckBox_Click(),它將跳轉到sub R00_CheckBox_Click(),然後將步驟幾行,然後恢復到sub R01_CheckBox_Click()。我將其更改爲_afterupdate()並且正常工作。任何人都可以解釋爲什麼調試器的行爲就像使用_click時一樣嗎?單步執行代碼行爲非常奇怪

Private sub R00_CheckBox_Click() 
    R00_CheckBox = true 
    R01_CheckBox = false 
    R02_CheckBox = false 
    R03_CheckBox = false 
    R04_CheckBox = false 
End sub 

Private sub R01_CheckBox_Click() 
    R00_CheckBox = false 
    R01_CheckBox = true 
    R02_CheckBox = false 
    R03_CheckBox = false 
    R04_CheckBox = false 
End sub 

Private sub R02_CheckBox_Click() 
    R00_CheckBox = false 
    R01_CheckBox = false 
    R02_CheckBox = true 
    R03_CheckBox = false 
    R04_CheckBox = false 
End sub 

回答

1

編輯提升解釋

這是因爲一個複選框Click事件被觸發時,你改變其狀態(即其Value屬性),不管你做它的UI或代碼。

假設開始與所有的複選框選中,並單擊R00_CheckBox之一:

它觸發這是沒有實際改變任何複選框的狀態處理其Click事件處理程序,是R00_CheckBox只是檢查(即設置爲True ,這就是爲什麼你在Click事件處理程序是),而所有其他複選框已經被設置爲False

然後單擊R01_CheckBox

  • 它觸發其Click事件,其第一條語句是R00_CheckBox = False

    R00_CheckBox當前狀態True,所以這將觸發R00_CheckBox_Click事件。

    那麼你現在暫停R00_CheckBox_Click事件處理和啓動新R00_CheckBox_Click一個

    其第一條語句是R00_CheckBox = False,但R00_CheckBox當前狀態True,讓你改變其狀態False因此暫停當前事件處理程序處理並切換到R00_CheckBox_Click一個

    ,其第一條語句是R00_CheckBox = True,有你再次去從False改變其狀態True因此暫停當前R00_CheckBox_Click事件處理和開始新的一個品牌之一

    現在的當前R00_CheckBox_Click事件與R00_CheckBox = True再次啓動,這不會改變R00_CheckBox狀態,所以這次它不會再次觸發自己,並繼續執行下一個語句,即R01_CheckBox = False,但它確實會更改狀態R01_CheckBox,因此暫停當前R00_CheckBox_Click事件,並開始一個新的R01_CheckBox_Click一個

    現在的當前R01_CheckBox_Click事件與R00_CheckBox = False再次啓動,這會改變R00_CheckBox狀態並觸發從而R00_CheckBox_Click事件暫停本身ANS開始另一個嶄新R00_CheckBox_Click事件.. 。

    ...然後,然後......

你會更好地切換到OptionButton控件,其行爲正是你想要的:當你檢查其中的一個時,所有其他人都會自動取消選中。沒有所有遞歸事件處理程序調用

你可以通過查詢其默認Value財產一樣得到他們的狀態如下:

If Me.OptionButton1 Then ... '<--| check if OptionButton1 control is checked 
+0

我看到你在說什麼,但我很古董,爲什麼它會步從一個子的中間到另一個子。任何想法爲什麼? – user3723727

+0

@ user3723727我希望事情現在對你來說很清楚。如果是,請將答案標記爲已接受。謝謝 – user3598756