Hiding/unhiding excel 个基于矩阵的工作表
Hiding/unhiding excel sheets based of a matrix
我有一个可以使用的宏,但效果不是很好,可以做得更好。
我只是有一个包含所有 sheet 名称的列表(它们可以更改,因此它需要是动态的)在一行中,在下一行中我有一个显示的“yes/no”答案sheet 是否应该隐藏。
示例:
Sheet1,sheet2,sheet3,sheet4,
是,是,不是,是
到目前为止我的代码:
Sub HidingSheets()
'Checking the first sheet
'-------------------------------------------------------------------------------------------
Sheets(Worksheets("Sheet1").Range("E9").Value).Visible = True
Sheets(Worksheets("Sheet1").Range("E9").Value).Activate
If ActiveSheet.Range("A1") = "NO" Then
ActiveSheet.Visible = False
End If
'-------------------------------------------------------------------------------------------
'Checking the second sheet
'-------------------------------------------------------------------------------------------
Sheets(Worksheets("Sheet1").Range("F9").Value).Visible = True
Sheets(Worksheets("Sheet1").Range("F9").Value).Activate
If ActiveSheet.Range("A1") = "NO" Then
ActiveSheet.Visible = False
End If
'-------------------------------------------------------------------------------------------
End Sub
我基本上每个 sheet 手动执行它而不是循环,这也要求我需要在每个 sheet 中显示“yes/no”(“if”公式检查 A1 =“否”)。 A1单元格显示的“yes/no”是我之前解释的矩阵中的
注意:矩阵可以“转置”,方向无关紧要。
如果你能帮助我,先谢谢你了。
我的第二次尝试是这样的:
Sub Hiding2()
Dim i As interger
For i = 1 To 10
a = ActiveSheet.Range("E9").Value
If Offset(a(1, 0)) = YES Then
Sheets(a).Visible = True
Else
Sheets(a).Visible = False
End If
Next i
End Sub
但我不知道如何引用我需要的单元格,然后让它们为每个“i”移动。
您可以使用 Cells
而不是 Range
。有了它,您可以使用列号来遍历某些列范围。还有其他退出代码的可能性...这取决于您的工作表中的数据。
Sub Hiding()
Dim sh as Worksheet, col as Integer
For col = 5 to 100
shName = Worksheets("Sheet1").Cells(9, col).Value
On Error GoTo TheEnd ' in case there is no such sheet
Set sh = Worksheets(shName)
If UCase(sh.Range("A1").Value) = "YES" Then
sh.Visible = xlSheetVisible
Else
sh.Visible = xlSheetHidden
End If
Next col
TheEnd:
End Sub
Sub HideWorksheets()
Dim Cell As Range
Dim Data As Range: Set Data = Worksheets("Sheet1").Range("E9:N9")
On Error Resume Next
For Each Cell In Data
Worksheets(Cell.value).Visible = IIf(Cell.Offset(1, 0) = "YES", xlSheetHidden, xlSheetVisible)
Next Cell
End Sub
我有一个可以使用的宏,但效果不是很好,可以做得更好。
我只是有一个包含所有 sheet 名称的列表(它们可以更改,因此它需要是动态的)在一行中,在下一行中我有一个显示的“yes/no”答案sheet 是否应该隐藏。
示例:
Sheet1,sheet2,sheet3,sheet4,
是,是,不是,是
到目前为止我的代码:
Sub HidingSheets()
'Checking the first sheet
'-------------------------------------------------------------------------------------------
Sheets(Worksheets("Sheet1").Range("E9").Value).Visible = True
Sheets(Worksheets("Sheet1").Range("E9").Value).Activate
If ActiveSheet.Range("A1") = "NO" Then
ActiveSheet.Visible = False
End If
'-------------------------------------------------------------------------------------------
'Checking the second sheet
'-------------------------------------------------------------------------------------------
Sheets(Worksheets("Sheet1").Range("F9").Value).Visible = True
Sheets(Worksheets("Sheet1").Range("F9").Value).Activate
If ActiveSheet.Range("A1") = "NO" Then
ActiveSheet.Visible = False
End If
'-------------------------------------------------------------------------------------------
End Sub
我基本上每个 sheet 手动执行它而不是循环,这也要求我需要在每个 sheet 中显示“yes/no”(“if”公式检查 A1 =“否”)。 A1单元格显示的“yes/no”是我之前解释的矩阵中的
注意:矩阵可以“转置”,方向无关紧要。
如果你能帮助我,先谢谢你了。
我的第二次尝试是这样的:
Sub Hiding2()
Dim i As interger
For i = 1 To 10
a = ActiveSheet.Range("E9").Value
If Offset(a(1, 0)) = YES Then
Sheets(a).Visible = True
Else
Sheets(a).Visible = False
End If
Next i
End Sub
但我不知道如何引用我需要的单元格,然后让它们为每个“i”移动。
您可以使用 Cells
而不是 Range
。有了它,您可以使用列号来遍历某些列范围。还有其他退出代码的可能性...这取决于您的工作表中的数据。
Sub Hiding()
Dim sh as Worksheet, col as Integer
For col = 5 to 100
shName = Worksheets("Sheet1").Cells(9, col).Value
On Error GoTo TheEnd ' in case there is no such sheet
Set sh = Worksheets(shName)
If UCase(sh.Range("A1").Value) = "YES" Then
sh.Visible = xlSheetVisible
Else
sh.Visible = xlSheetHidden
End If
Next col
TheEnd:
End Sub
Sub HideWorksheets()
Dim Cell As Range
Dim Data As Range: Set Data = Worksheets("Sheet1").Range("E9:N9")
On Error Resume Next
For Each Cell In Data
Worksheets(Cell.value).Visible = IIf(Cell.Offset(1, 0) = "YES", xlSheetHidden, xlSheetVisible)
Next Cell
End Sub