有条件地取消隐藏 Excel/vba 中的工作表
Conditionally unhide worksheets in Excel/vba
我正在尝试取消隐藏满足特定条件的一组工作表。这使用了一个用户表单,由一个命令按钮触发,带有选择选项和另一个命令按钮。预期的行为是,一旦做出选择并按下按钮,所有符合条件的工作表都将取消隐藏。 Target
单词出现在第一行的不同位置,并且该行上它之前的所有单元格都是空的。理想情况下,该过程将扫描工作簿中每个工作表的第一行中的每个单元格,直到遇到 Target
,取消隐藏工作表,然后转到下一个工作表以重新开始该过程,直到所有工作表都带有工作簿已检查。
激活用户表单上的命令按钮后,我得到以下信息:
Private Sub ContinueCommand_Click()
Dim Valid As Boolean, wks As Worksheet, c As Integer, actCol As Long
actCol = ActiveSheet.Range("A1").End(xlToRight).Column
For Each wks In ActiveWorkbook.Worksheets
For c = 1 To actCol
If ActiveCell.Value = "Target" Then
wks.Visible = xlSheetVisible
Exit For
End If
Next c
Next wks
Valid = True
If Valid = True Then
Unload Me
End If
End Sub
我从多个来源借用,包括 here for using ActiveCell, determining if a value exists, unhidding worksheets, Finding values within a range, and searching for a string。任何帮助将不胜感激。
我要感谢 BruceWayne、Scott Craner、Stavros Jon 和 Darell H,他们都帮助我更接近这个答案。最终结果如下所示:
Private Sub ContinueCommand_Click()
Dim wks As Worksheet
For Each wks In ActiveWorkbook.Worksheets
If Not IsError(Application.Match("Target", wks.Range("A1").End(xlToRight), 0)) Then
wks.Visible = xlSheetVisible
End If
Next wks
Unload Me
End Sub
如果以后有人在使用它时遇到问题,请告诉我,我会post一个更完整的版本。
正如我在评论中所说,您选择的实施方式存在一些问题。
不需要您的 For c = 1 To actCol
循环。这很容易看出,因为 c
并没有真正在循环中的任何地方使用。
假设您的目标值在 wks.Range("A100")
(第 1 行第 100 列)中。
您的代码将执行完全相同的操作 100 次,并得出完全相同的结果。这就是导致您使用 Exit For
的原因,这是一种不好的做法。
如果我正确理解了你的初始 post,如果 Target
存在于特定工作表中,那么 Target
之前的所有单元格都是空的。
如果是这样,Target
将在 wks.Range("A1")
或 wks.Range("A1").End(xlToRight)
中。如果它不在这两个单元格中的任何一个中,那么它根本不存在于这个特定的工作表中,这意味着第一行完全是空的。除了这两个单元格,您不需要再检查任何其他单元格。
您的代码不检查 Target
是否在 wks.Range("A1")
中。
此外,您对 Application.Match
的使用让我相信您可能被以下常见误解所误导,即 wks.Range("A1").End(xlToRight)
是从 A1
开始并扩展所有单元格的范围到第一行最后一个非空单元格的方式。
事实是 wks.Range("A1").End(xlToRight)
是一个 单个单元格 而不是一系列单元格。选择 A1
然后按 CTRL+right arrow
,将准确显示它是哪个单元格。
我可能遗漏了一些东西,但根据你在最初 post 中的描述,我会做如下事情:
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
If sht.Range("A1").Value = "Target" Or sht.Range("A1").End(xlToRight).Value = "Target" Then
sht.Visible = xlSheetVisible
Else
MsgBox "target was not found in " & sht.Name
End If
Next sht
我正在尝试取消隐藏满足特定条件的一组工作表。这使用了一个用户表单,由一个命令按钮触发,带有选择选项和另一个命令按钮。预期的行为是,一旦做出选择并按下按钮,所有符合条件的工作表都将取消隐藏。 Target
单词出现在第一行的不同位置,并且该行上它之前的所有单元格都是空的。理想情况下,该过程将扫描工作簿中每个工作表的第一行中的每个单元格,直到遇到 Target
,取消隐藏工作表,然后转到下一个工作表以重新开始该过程,直到所有工作表都带有工作簿已检查。
激活用户表单上的命令按钮后,我得到以下信息:
Private Sub ContinueCommand_Click()
Dim Valid As Boolean, wks As Worksheet, c As Integer, actCol As Long
actCol = ActiveSheet.Range("A1").End(xlToRight).Column
For Each wks In ActiveWorkbook.Worksheets
For c = 1 To actCol
If ActiveCell.Value = "Target" Then
wks.Visible = xlSheetVisible
Exit For
End If
Next c
Next wks
Valid = True
If Valid = True Then
Unload Me
End If
End Sub
我从多个来源借用,包括 here for using ActiveCell, determining if a value exists, unhidding worksheets, Finding values within a range, and searching for a string。任何帮助将不胜感激。
我要感谢 BruceWayne、Scott Craner、Stavros Jon 和 Darell H,他们都帮助我更接近这个答案。最终结果如下所示:
Private Sub ContinueCommand_Click()
Dim wks As Worksheet
For Each wks In ActiveWorkbook.Worksheets
If Not IsError(Application.Match("Target", wks.Range("A1").End(xlToRight), 0)) Then
wks.Visible = xlSheetVisible
End If
Next wks
Unload Me
End Sub
如果以后有人在使用它时遇到问题,请告诉我,我会post一个更完整的版本。
正如我在评论中所说,您选择的实施方式存在一些问题。
不需要您的 For c = 1 To actCol
循环。这很容易看出,因为 c
并没有真正在循环中的任何地方使用。
假设您的目标值在 wks.Range("A100")
(第 1 行第 100 列)中。
您的代码将执行完全相同的操作 100 次,并得出完全相同的结果。这就是导致您使用 Exit For
的原因,这是一种不好的做法。
如果我正确理解了你的初始 post,如果 Target
存在于特定工作表中,那么 Target
之前的所有单元格都是空的。
如果是这样,Target
将在 wks.Range("A1")
或 wks.Range("A1").End(xlToRight)
中。如果它不在这两个单元格中的任何一个中,那么它根本不存在于这个特定的工作表中,这意味着第一行完全是空的。除了这两个单元格,您不需要再检查任何其他单元格。
您的代码不检查 Target
是否在 wks.Range("A1")
中。
此外,您对 Application.Match
的使用让我相信您可能被以下常见误解所误导,即 wks.Range("A1").End(xlToRight)
是从 A1
开始并扩展所有单元格的范围到第一行最后一个非空单元格的方式。
事实是 wks.Range("A1").End(xlToRight)
是一个 单个单元格 而不是一系列单元格。选择 A1
然后按 CTRL+right arrow
,将准确显示它是哪个单元格。
我可能遗漏了一些东西,但根据你在最初 post 中的描述,我会做如下事情:
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
If sht.Range("A1").Value = "Target" Or sht.Range("A1").End(xlToRight).Value = "Target" Then
sht.Visible = xlSheetVisible
Else
MsgBox "target was not found in " & sht.Name
End If
Next sht