如果满足一定条件,我将尝试取消隐藏它们。这使用由命令按钮触发的用户窗体,其中包含选择选项和另一个命令按钮。预期的行为是,一旦做出选择并按下按钮,所有符合条件的工作表都将被隐藏。 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的here,determining if a value exists,unhidding worksheets,Finding values within a range和searching for a string。任何帮助将不胜感激。
答案 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
如果将来有人遇到问题,请通知我,我将发布更完整的版本。