有条件地取消隐藏Excel / vba中的工作表

时间:2019-04-29 18:01:23

标签: excel vba userform

如果满足一定条件,我将尝试取消隐藏它们。这使用由命令按钮触发的用户窗体,其中包含选择选项和另一个命令按钮。预期的行为是,一旦做出选择并按下按钮,所有符合条件的工作表都将被隐藏。 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

我从多个来源借来了资料,包括使用ActiveCell的heredetermining if a value existsunhidding worksheetsFinding values within a rangesearching for a string。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,您选择的实现方式存在一些问题。

不需要您的For c = 1 To actCol循环。这很容易看到,因为c并没有在循环中的任何地方使用。

假设您的目标值位于wks.Range("A100")(第一行和第100列)中。

您的代码将执行完全相同的操作100次,并得出完全相同的结果。这就是导致您使用Exit For的原因,这是一种不好的做法。

如果我正确理解了您的第一篇文章,并且在特定工作表中存在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,将确切显示它是哪个单元格。

我可能会丢失一些东西,但是根据您在第一篇文章中的描述,我会做以下事情:

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

答案 1 :(得分:0)

我要感谢BruceWayne,Scott Craner,Stavros Jon和Darell H,他们全都帮助我接近了这个答案。最终结果如下所示:

n

如果将来有人遇到问题,请通知我,我将发布更完整的版本。