有条件地取消隐藏 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