2015-02-23 81 views
0

我有隐藏和取消隐藏我的表中的行基于更改我的下拉列表中的值的代码。每次更改下拉菜单时,都会收到运行时错误'1004'。我有一个私人小组之前,并将其更改为一个小组,但似乎并不是解决方案。运行时错误'1004'与我的VBA隐藏和取消隐藏行

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim rng As Range 

Set rng = Target.Parent.Range("L6") 

If Target.Count > 1 Then Exit Sub 

    If Intersect(Target, rng) Is Nothing Then Exit Sub 

    Application.Run "dynamic_hide" 

End Sub 

Sub dynamic_hide() 

If Target.Range = "$S$9:$S$51" Then 

    If Target.Range = 0 Then Rows("F9:T51").EntireRow.Hidden = True 

    If Target.Value <> 0 Then Rows("F9:T51").EntireRow.Hidden = False 

End If 

End Sub 
+1

'Target'变量只在'Worksheet_Change' Sub中声明,所以第二个Sub无法访问它 - 您需要将它作为参数传递,或者在一个Sub中运行所有代码。 '如果Target.Range = 0' - 我认为它应该是Range.Value。 – BrakNicku 2015-02-23 16:45:04

+0

它几乎看起来像你可以忽略Target,并且每次更改工作表时只测试单元格L6的值。如果您保留L6值的静态副本,您可以独立测试是否确实有变化。 – Joffan 2015-02-23 17:54:42

+0

Joffan之所以包括目标,是因为L6是一个下拉列表,我想在每次更改单元格时执行该事件。 – user3666237 2015-02-23 18:03:35

回答

0

你必须要对一些问题在这里:

首先,Range对象的默认属性是Value,所以Target.Range = "$S$9:$S$51"永远是假的。改为使用Target.Address

其次,请勿使用Application.Run来调用Subs而不是使用。

第三,你不能让子dynamic_hide知道Target是什么,因为TargetWorksheet_Change事件子程序只有一个参数。您可以通过声明你的子像Sub dynamic_hide(ByVal Target As Range)解决这个问题,然后你可以使用它:Call dynamic_hide(Target)

最后,由于Target是你不需要使用Target.Range因为Target一个范围是这样,你可以简单地忽略每.RangeTarget.RangeTarget.Parent.Range很好。