当工作表 2 上的单元格 c9 发生变化时,我正在尝试自动隐藏/取消隐藏工作表 1 上的行。
我已全部设置了隐藏/取消隐藏行切换。
当目标单元格位于工作表 2 上时,我的工作表更改有效,但当我尝试将目标单元格设置为 sheet1 时不起作用(如下面的代码所示(。
模块 1 代码:
Sub Hide_Rows_Toggle()
Dim r As Range
For Each r In Columns(2).Cells
If r.Value = "X" Then
r.EntireRow.Hidden = True
End If
Next r
End Sub
表2代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Worksheets("Sheet1").Range("$C$9") Then
Call Hide_Rows_Toggle
End If
End Sub
在ThisWorkbook
中:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Sheet1" And Target.Address = "$C$9" Then
Call Hide_Rows_Toggle
End If
End Sub
现在我回家了,并测试了以下内容;
您尚未限定Hide_Rows_Toggle()
子中的工作簿或工作表对象。因此,它隐式引用了ActiveWorksheet
每个工作表。列文档:
使用不带对象限定符的 Columns 属性等效于使用ActiveSheet.Columns。如果活动文档不是工作表,则Columns属性将失败。
Worksheet_Change
事件是特定于工作表的,这意味着,该事件在每个工作表上独立触发 - 如果您在Sheet1
上进行更改,则该事件将不会在Sheet2
等上触发。
您应该执行以下操作:
- 将
Worksheet_Change
事件移动到发生更改的模块Sheet1
。
在 Hide_Rows_Toggle
子例程中限定目标工作表(至少(,如下所示:
像这样在潜艇中限定您的范围:
Sub Hide_Rows_Toggle()
Dim r As Range
For Each r In ThisWorkbook.Sheets("Sheet2").Columns(2).Cells
If r.Value = "X" Then
r.EntireRow.Hidden = True
End If
Next r
End Sub
这可确保行仅在 Sheet2 上隐藏,否则它将始终以ActiveSheet为目标,该工作表必须是您在其中进行更改的工作表。
最后,目前还不清楚您在Worksheet_Change事件中试图评估的内容。
目前,您正在寻找Target.Address
是否等于Sheet1
上单元格$C$9
中的Value
。这是因为 Range 对象的默认成员是 Value。因此,仅当您在$C$9
中设置单元格引用以指示哪个单元格触发 sub 时,它才会返回 true。
如果您打算在更改$C$9
中的值时运行Hide_Rows_Toggle
,则需要将.Address
属性添加到您的范围 -If Target.Address = Worksheets("Sheet1").Range("$C$9").Address
- 或 - 只需将其更改为字符串以匹配地址,如If Target.Address = "$C$9" Then
.