嗨,我需要一些关于工作表的帮助。我必须建立一个动态问卷,并且我需要一个代码,允许我根据单元格信息自动隐藏/取消隐藏某些行。示例:
如果 c6 是“内部”,则显示第 7 行但隐藏第 8 至 107 行
如果 c6 为“外部”,则隐藏从 7 到 107 的所有行
如果 c7 为“是”,则显示第 8 行但隐藏第 9 至 107 行
如果 c7 为“否”,则显示第 8 行但隐藏第 9 至 107 行
如果 c8 为“关键”,则显示第 9 行,但隐藏第 10 至 107 行
如果 c8 为“重要”,则显示第 9 行,但隐藏第 10 至 107 行
如果 c8 为“普通”,则显示第 9 行,但隐藏第 10 至 107 行
如果 c8 为“其他”,则显示第 9 行,但隐藏第 10 至 107 行
如果 c9 为“关键”,则显示第 10 行,但隐藏第 11 至 107 行
如果 c9 为“重要”,则显示第 10 行,但隐藏第 11 至 107 行
如果 c9 为“普通”,则显示第 10 行,但隐藏第 11 至 107 行
如果 c9 为“其他”,则显示第 10 行,但隐藏第 11 至 107 行
ETC。
有人能帮助我吗?
答案1
这实际上取决于“隐藏第 X 行至第 107 行”的含义。
如果您指的是Hide
行,以便第 108 行是人们可以看到的下一个编号行,那么您必须使用 VBA,因为没有工作表函数可以控制格式的那个方面。
如果您的意思是“留出一长段空白区域”或者“隐藏这些单元格的普通内容,导致第 11 行至第 107 行不执行它们应该执行的公式,并导致第 108 行及以后应该执行的公式开始显示结果,例如第 11 行及以后的行”,那么您可以做到。每种方法都采用不同的方法。
我将描述总体思路,因为您实际上没有提供任何可供参考的细节,但您会很容易地明白这个想法。
首先,这些条件。它们实际上属于以下顺序,略作重申:
- 如果 c6 为“外部”,则隐藏从 7 到 107 的所有行
- 如果 c6 为“内部”,则显示第 7 行
- 如果 c7 为“是”或“否”,则显示第 8 行
- 如果 c8 为“关键”或“重要”或“普通”或“其他”,则显示第 9 行
- 如果 c9 为“关键”或“重要”或“普通”或“其他”,则显示第 10 行,但隐藏第 11 至 107 行
在所有情况下,行 11-107 都会被“隐藏”。至于其他行,如果 c6 为“外部”,则所有其余行都将被隐藏,但随后您稍微改变策略并显示每一行(如果一个或多个条件为真),如果条件为假,则隐藏以下行。因此,如果使用 VBA,只需按上述顺序进行简单测试,当测试失败时,宏就会结束。最简单的方法是先隐藏所有行 7-107,然后进行测试,如果测试成功,则一次取消隐藏一行,如果测试失败,则退出。
如果您希望仅隐藏这些行中的材料,而不是实际隐藏HIDE
它们,则可以使用条件格式。从第一个测试开始,使用“$C$6”而不是“C6”,然后选择使用公式进行测试,公式如下:
=$C$66="Externally"
(其中的“如果”方面是隐含的。)
并将文本颜色格式化为“白色”(如果不是白色且无填充,则使用任何背景颜色和填充)。如果成功,则将其应用于行 7-107 中的所有适用单元格。请务必选中“如果为真则停止”。
继续,OR()
对于那些具有多个可接受结果但由于它们导致下一行被显示而不是被抑制的单元格使用,使规则适用的单元格从第一行开始低一行:第一个是测试 C6,并抑制立即从下一个行 7 开始的行,但这些应该从低一行开始,所以如果测试 C7,它们将开始抑制不是第 8 行及以后,而是第 9 行及以后。
嗯,这似乎是个好主意,但实际上要稍微复杂一些。您必须真正将第一条规则设为测试 C9 而不是 C6 的规则,然后反向操作。因此,您的第一条规则测试最后一个条件,第二条规则测试倒数第二个条件,并“向上”执行。否则,从第 7 行开始的所有行都将被抑制。很奇怪,不是吗,您一定是以反向的方式思考这些事情?
如果您希望抑制所有适用的行,但希望第 108 行中的材料立即显示(没有巨大的空白区域!),那么您必须在公式中执行此操作。
然后,我们的想法是制作测试条件的公式。它们正在测试上一行中的事实,因此第 7 行(可能是单元格 A7)将测试 C6 是否为“外部”,然后要么分支到其他公式(否则该公式将是该单元格中的完整公式,例如 A7),要么分支到本例中单元格 A108 中的公式。您将在第 10 行继续这个想法,但第 11-107 行将具有简单的分支,而无需测试 C 列单元格。
这是最棘手的部分。如果第 7 行失败,第 8 行应该开始第 108 行的材料,那太好了。但如果成功了,第 8 行应该开始第 108 行的材料了呢?您必须让该材料(第 108 行及以后)的公式全部使用相对公式OFFSET()
等。(有几种方法。)
还有其他方法。例如,一个“辅助表”(不是通常的列),上面有所有的材料,没有测试或隐藏,在这个表上,你可以选择从哪里开始从辅助表中提取结果。这将大大简化难度和复杂性,但出于某种原因,人们甚至讨厌临时的辅助列,所以大多数人可能会鄙视整个辅助表。
但是最后两点并不完全符合逻辑。如果你的意思是“被抑制”,为什么要说“隐藏”,但人们确实说得不准确,因为他们清楚地知道自己的意思,没有意识到自己在混淆别人的问题。但更合乎逻辑的是,谁会想要一个巨大的空白空间?所以这似乎不太可能。从 11 到 107 的 100 行左右总是隐藏的,大概它们有重要的材料吧?如果不是,它们存在的目的是什么?所以你最有可能需要 VBA 方法。如果是这样,既然你想要完成的事情已经按正确的顺序排列,多余的材料已经删除,而这些材料对于它们的目的毫无意义,并且为宏制定了基本方法,那么宏可能更容易编写。这些条件必须按正确的顺序排列,就像流程图一样,如果你不介意引用 1980 年代的工具,而不是乱七八糟地跳来跳去,大部分都是按顺序排列的,但远远不够。对于任何涉及实际编程语言编程甚至函数/公式编程的方法来说,这都是事实。这比实际写作更难,因为一旦规划好路径,写作就会流畅进行。