2017-10-13 78 views
1

Iam嘗試使用VBA在Excel中創建一個簡單的if語句。如果語句在Excel VBA中不起作用

我正在創建一個新複選框

將下列代碼添加到框中。

Sub CheckBox1_Click() 
    HideRows "2:5" 
End Sub 

Sub HideRows(rowRange) 
If CheckBox1 = False Then 
    Rows(rowRange).EntireRow.Hidden = True 
    Else: Rows(rowRange).EntireRow.Hidden = False 
    End If 
End Sub 

結果:如果複選框處於選中狀態或未選中狀態,則行都將隱藏。

(複選框被選中)

所有行可見

取消選中該複選框

結果:所有行被隱藏

(複選框選中)

的所有行可見

取消選中t他複選框

結果:所有行被隱藏

回答

1

你可以把此一子,假設它的一個ActiveX複選框

Private Sub CheckBox1_Click() 
If CheckBox1 = True Then 
    [2:5].EntireRow.Hidden = False 
    Else: [2:5].EntireRow.Hidden = True 
End If 
End Sub 
2

假設它的一個ActiveX複選框,放在板模塊的代碼.. 。

Private Sub CheckBox1_Click() 
If CheckBox1 = True Then 
    Rows("2:5").Hidden = True 
Else 
    Rows("2:5").Hidden = False 
End If 
End Sub 

編輯:

或只是使用此...

Private Sub CheckBox1_Click() 
    Rows("2:5").Hidden = CheckBox1 
End Sub 
+2

爲什麼不只是'ActiveSheet.Rows。( 「2:5」)隱藏= CheckBox1.Value'? –

+0

@ Mat'sMug是的,的確如此。但只是爲了展示它如何工作,而不是找到最短的方法來實現最終結果。因爲代碼將位於工作表模塊本身中,所以實際上甚至不需要使用工作表參考資格。 :) – sktneer

+0

這是正確的(+1) - 如果該代碼位於工作表的代碼隱藏中,則適用的顯式限定符將爲「Me」;儘管如此,活動表會/應該是*表格*,但是'Me'在語義上比'ActiveSheet'更合適......並且'Me'總是一個冗餘限定符。 –

4

你想在一個改變事件。

你不需要如果那麼。 CheckBox1發生TRUE/FALSE,只是使用它。

並且當涉及Rows()EntireRow也不需要。你已經在引用整行。

此外,最好總是將父對象聲明爲任何Range對象,它是Rows()。如果代碼在工作表代碼中,則使用Me,因爲它將引用自身。如果代碼模塊中然後使用ActiveSheet或更優選的特定片,Worksheets("Sheet1")

Private Sub CheckBox1_Change() 
    HideRows "2:5" 
End Sub 



Sub HideRows(rowRange) 
    'if this code is not in the worksheet code then change `Me` to `ActiveSheet` 
    Me.Rows(rowRange).Hidden = Not CheckBox1 

End Sub 
+0

Upvoted用於指出'If ... Then'塊和布爾賦值的冗餘度......我用'ActiveSheet'限定'Rows'並顯式引用'CheckBox1.Value'雖然;-) –

+0

他說,^^^^ – Tom

+0

@ Mat'sMug,但如果這是在表格代碼是真的需要或'我'會更好? –