我在使用某些VBA代码时遇到了麻烦,无法获得理想的结果。
我要通过以上示例实现的目标是,通过按下切换按钮,将发生以下情况:
然后,如果隐藏行之一有新的费用,我需要另一个切换按钮来取消隐藏所有内容。
背景:
我们拥有公寓楼,当公寓空置时,我们必须支付水电费。当有人租住公寓时,我们不会付款。我们要跟踪历史和趋势,以了解何时空缺,以及何时不空缺,我们希望将它们隐藏起来以减少滚动。
建议的操作:
实际上,我们希望看到以下情况:
下面的我的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范围内。
答案 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
切换按钮的概念是仅一个按钮,该按钮将在单击时更改某些内容的状态,例如在点击上将字体设置为粗体,然后在点击上将其恢复为普通,然后在下一个再次点击 粗体,然后再次点击点击 正常,依此类推。