基于条件的VBA隐藏列

时间:2018-08-01 15:00:11

标签: excel vba excel-vba

我在使用某些VBA代码时遇到了麻烦,无法获得理想的结果。

Example

我要通过以上示例实现的目标是,通过按下切换按钮,将发生以下情况:

  1. 最近3列(示例中的DEC,NOV和OCT)中所有没有数据 OR $ 0的行将被隐藏。 (绿色单元格)。
  2. 最近3列中至少具有一个值的行将保持可见(蓝色单元格)
  3. 所有单元格填充的值都高于$ 0的行将可见(黄色单元格)。

然后,如果隐藏行之一有新的费用,我需要另一个切换按钮来取消隐藏所有内容。

背景:

我们拥有公寓楼,当公寓空置时,我们必须支付水电费。当有人租住公寓时,我们不会付款。我们要跟踪历史和趋势,以了解何时空缺,以及何时不空缺,我们希望将它们隐藏起来以减少滚动。

建议的操作:

实际上,我们希望看到以下情况:

  1. 已收到发票。
  2. 其中一张发票引用了隐藏的属性。
  3. 管理员按“全部取消隐藏”切换按钮。
  4. 经理输入值。
  5. 管理器按“隐藏未使用”切换按钮。
  6. 当前和前两个月(共3个月)中没有值的所有行都将被隐藏。

下面的我的VBA无法正确隐藏单元格。

Private Sub ToggleButton1_Click()

If ToggleButton1 Then
    MsgBox "All Rows Unhidden."
    Rows("1:1000").EntireRow.Hidden = False
End If

End Sub

Private Sub ToggleButton2_Click()

If ToggleButton2 Then
    Dim c As Range
    Application.ScreenUpdating = False
    For Each c In Me.Range("B3:B1000, C3:C1000, D3:D1000")
        If c.Value = 0 Or c.Value = "" Then
            c.EntireRow.Hidden = True
        Else
            c.EntireRow.Hidden = False
    End If
Next c
Application.ScreenUpdating = True
End If

End Sub

此ToggleButton2的公式无效,并且会丢失值,除非它们在D3:D1000范围内。

3 个答案:

答案 0 :(得分:0)

按照书面规定,Me是指ToggleButton2,对吗?我想您可能要参考工作表本身,la:

编辑:哦,我知道发生了什么事。如所写,如果任何一个单元错误,它将隐藏。此版本将对其进行更改,因此,如果任何一个单元格都没有错,它将不会隐藏。希望这能解决问题。 (还快很多)

Private Sub ToggleButton2_Click()
Dim ws As Worksheet, x(2) As Long, y(3) As Long, z As Long

Set ws = ActiveWorkbook.ActiveSheet

x(1) = 3: x(2) = 1000
y(1) = 2: y(2) = 3: y(3) = 4

Application.ScreenUpdating = False

If ToggleButton2 Then

    For z = x(1) To x(2)

        If _
        IsValid(ws.Cells(z, y(1)).Value) Or _
        IsValid(ws.Cells(z, y(2)).Value) Or _
        IsValid(ws.Cells(z, y(3)).Value) Then
            ws.Rows(z).Hidden = False
        Else
            ws.Rows(z).Hidden = True
        End If

    Next z

End If

Application.ScreenUpdating = True

End Sub

'--------

Function IsValid(val) As Boolean
If val = 0 Or val = "" Then
    IsValid = False
Else
    IsValid = True
End If
End Function

答案 1 :(得分:0)

尝试一下;它将循环浏览这些行,并检查该行中的所有三个单元格是否符合您的条件,如果符合条件,它将隐藏该行。

Dim i As Long
For i = 3 To 1000

    If (Range("C" & i) = "" Or Range("C" & i) = "0") _
        And (Range("D" & i) = "" Or Range("D" & i) = "0") _
        And (Range("E" & i) = "" Or Range("E" & i) = "0") Then
        Range("A" & i).EntireRow.Hidden = True
    End If

Next i

答案 2 :(得分:0)

仅一个按钮(切换)

在您的代码中,带有部分 B3:1000 的行For Each c In Me.Range("B3:B1000, C3:C1000, D3:D1000")表示要处理的范围从第二列( B )开始,但在图片中,范围似乎以第三列( C )开头。因此:

在使用此代码之前,请仔细阅读自定义部分,在该部分中您必须更改值以适合您的需求。

Option Explicit

Private Sub ToggleHideShow_Click()

Application.ScreenUpdating = False

'--Customize BEGIN ---------------------
    Const ciRowStart As Integer = 3 'First row of data
    Const ciRowEnd As Integer = 1000 'At least the last row of data.
    Const ciColStart As Integer = 3 'First column of data
    Const ciColEnd As Integer = 5 'Last column of data
'--Customize BEGIN ---------------------

    Dim iRowCounter As Integer
    Dim iColCounter As Integer
    Dim oRng As Range

  If ToggleHideShow.Caption = "Show" Then

    Set oRng = Range(ciRowStart & ":" & ciRowEnd)
    oRng.EntireRow.Hidden = False

    ToggleHideShow.Caption = "Hide"

    MsgBox "All Rows Unhidden." 'I would get rid of it.

   Else

    For iRowCounter = ciRowStart To ciRowEnd
      For iColCounter = ciColStart To ciColEnd
        Set oRng = Cells(iRowCounter, iColCounter)
        If oRng.Value = 0 Or oRng.Value = "" Then
          oRng.EntireRow.Hidden = True
          Exit For 'To immediately go to the next row.
        End If
      Next
    Next

    ToggleHideShow.Caption = "Show"

  End If

Application.ScreenUpdating = True

End Sub

切换按钮的概念是仅一个按钮,该按钮将在单击时更改某些内容的状态,例如在点击上将字体设置为粗体,然后在点击上将其恢复为普通,然后在下一个再次点击 粗体,然后再次点击点击 正常,依此类推。