2017-10-13 26 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,但如果这是在表格代码是真的需要或'我'会更好? –