【发布时间】:2015-06-01 15:37:32
【问题描述】:
我有一个电子表格 (Sheet3),它从其他 25 个工作表中收集和排序数据。所以我在 Sheet3 中没有大量空行我做了一个 VBA 循环,首先检查一个工作表是否可见,然后根据它们是否隐藏在其他 25 个工作表中来隐藏和取消隐藏行,比如所以:
Sheet3.Rows("1791:9290").EntireRow.Hidden = True
For i = 1205 To 1354
If Sheet1.Visible = True Then
If Sheet1.Rows(i).EntireRow.Hidden = False Then
Sheet3.Rows(i + 586).EntireRow.Hidden = False
End If
End If
If Sheet2.Visible = True Then
If Sheet2.Rows(i).EntireRow.Hidden = False Then
Sheet3.Rows(i + 886).EntireRow.Hidden = False
End If
End If
If Sheet4.Visible = True Then
If Sheet4.Rows(i).EntireRow.Hidden = False Then
Sheet3.Rows(i + 1186).EntireRow.Hidden = False
End If
End If
etc...
由于我需要提取的数据类型,很遗憾,我无法将表 3 与其他 25 个表逐行匹配。对于其他 25 张纸中可见的每一行,我需要 Sheet3 来取消隐藏 2 行。
例如,如果 SheetX 第 1 行可见,Sheet3 必须使第 1 行和第 2 行可见。如果 SheetX 第 2 行可见,则 Sheet 3 必须使第 3 行和第 4 行可见,依此类推。
除了我必须更改所有其他 25 张工作表以使其行数加倍之外,还有什么方法可以做到这一点?这只是一个庞大项目的一部分,如果可以避免的话,我不希望再添加几千行。
【问题讨论】:
-
如果您在
...EntireRow.Hidden = False语句中使用包含 2 行的范围,您可以一次取消隐藏 2 行。至于选择不隐藏的行,你可以使用一个相当简单的算术公式,比如Sheet2.Range("A" & 2 * i + 586 & ":" & "A" & 2 * i + 587).EntireRow.Hidden = False。 -
您的建议的问题(这是这里的主要问题)是即使取消隐藏两行也只能在循环的第一步中起作用。如果我告诉它每次都取消隐藏两行,那么你会得到:循环 1-取消隐藏第 1 行和第 2 行;循环 2 - 取消隐藏第 2 行和第 3 行;循环 3- 取消隐藏第 3 行和第 4 行。我需要这样:循环 1- 取消隐藏第 1 行和第 2 行;循环 2 - 取消隐藏第 3 行和第 4 行;循环 3- 取消隐藏第 5 行和第 6 行
-
Idk 如果这甚至可以改进代码。但顺便说一句,您可以重写内部
if语句以使用布尔逻辑:Sheet3.Rows(i + 586).EntireRow.Hidden = (Sheet3.Rows(i + 586).EntireRow.Hidden And Sheet1.Rows(i).EntireRow.Hidden)