我在VBA非常新,一直在寻找可以做我想做的VBA代码。我已经尝试了几个,并尝试调整它们,但我似乎无法让它们正确,所以我想尝试一些帮助!
我有6个项目,它们旁边的单元格中有YES或NO,表示该人员是否正在处理该项目。这取决于另一个工作表上该项目旁边的人员名称,因此生成公式而不是下拉列表或键入值。
然后项目下面有几行对应它。
如果项目旁边有NO(在C6中),我希望隐藏该项目的相应行(第13:29行)。
我希望每个项目都重复这个,
所以c7中的no隐藏31:47, C8中的一个隐藏49:65, C9中的一个隐藏67:83, C10中的一个隐藏85:101, C11中的一个隐藏103:118,
我不知道这是否可能并且已经在圈子中进行,真的希望有人可以提供帮助:)
这是我尝试过的改编之一,但我确信我做错了,很抱歉没有在此之前发布
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$6" Then
If Target.Value = NO Then
Rows(13:29).EntireRow.Hidden = True
Else
Rows(13:29).EntireRow.Hidden = False
If Target.Address = "$C$7" Then
If Target.Value = NO Then
Rows(31:47).EntireRow.Hidden = True
Else
Rows(31:47).EntireRow.Hidden = False
End If
End If
If Target.Address = "$C$8" Then
If Target.Value = NO Then
Rows(49:65).EntireRow.Hidden = True
Else
Rows(49:65).EntireRow.Hidden = False
End If
End If
If Target.Address = "$C$9" Then
If Target.Value = NO Then
Rows(67:83).EntireRow.Hidden = True
Else
Rows(67:83).EntireRow.Hidden = False
End If
End If
If Target.Address = "$C$10" Then
If Target.Value = NO Then
Rows(85:101).EntireRow.Hidden = True
Else
Rows(85:101).EntireRow.Hidden = False
End If
End If
If Target.Address = "$C$11" Then
If Target.Value = NO Then
Rows(103:119).EntireRow.Hidden = True
Else
Rows(103:119).EntireRow.Hidden = False
End If
End If
End Sub
答案 0 :(得分:2)
我能想到的最短代码:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim bHide As Boolean
bHide = (InStr(1, Target.Value, "NO", vbTextCompare) > 0)
Select Case Target.Address
Case "$C$6"
Rows("13:29").EntireRow.Hidden = bHide
Case "$C$7"
Rows("31:47").EntireRow.Hidden = bHide
Case "$C$8"
Rows("49:65").EntireRow.Hidden = bHide
Case "$C$9"
Rows("67:83").EntireRow.Hidden = bHide
Case "$C$10"
Rows("85:101").EntireRow.Hidden = bHide
Case "$C$11"
Rows("103:119").EntireRow.Hidden = bHide
End Select
End Sub
请测试。
答案 1 :(得分:1)
所以c7中的no隐藏31:47,C8中的no隐藏49:65,C9中的no隐藏67:83,C10中的no隐藏85:101,C11中的no隐藏103:118,< / p>
C11
隐藏103:118
?这不应该是C11
隐藏103:119
吗?让我解释一下。
为了简化您的工作,您需要找到代码如何进展的趋势。见这个分析。
您正在寻找行6
中的“否”并显示/隐藏行13:29
。同样,您在行7
中查找“否”并在行31:47
中显示/隐藏。所以如果你注意到那就有趋势。该行之间的差异为18
。见上图。如果有趋势那么就有可能出现循环!
由于这个简单的表格,我也可以弄清楚你所说的C11 hides 103:118
是不正确的,可能是一个错字。 118
必须119
才能保持18
因此,您的代码实际上可以压缩为(未经测试)
Dim i As Long, StartRow As Long, EndRow As Long
StartRow = 13
EndRow = 29
For i = 6 To 11
If UCase(Range("C" & i).Value) = "NO" Then
Rows(StartRow & ":" & EndRow).EntireRow.Hidden = True
Else
Rows(StartRow & ":" & EndRow).EntireRow.Hidden = False
End If
StartRow = StartRow + 18
EndRow = EndRow + 18
Next i
接下来的事情是,由于NO's
正在按公式进行更改,因此您必须使用Worksheet_Calculate
而不是Worksheet_Change
,除非公式正在从中获取值工作表和正在更改C6:C11
的单元格由用户手动更改。