隐藏除选定行以外的所有数据

隐藏除选定行以外的所有数据

我无法发送任何图片,

数据包含 98 个列标题,第一列是唯一标识符,以及 1000 行项目。我全天都会收到有关特定项目的评论。更新这些项目很困难,因为它们很难找到。我希望能够在指定的输入单元格中输入以逗号分隔的目标项目列表(大约 50 个项目),并且除了指定项目的行之外,所有数据行都隐藏。

VBA 解决方案是可以接受的。我目前正在尝试使用过滤器来实现这一点,但项目数量太多,难以处理,我正在寻找更好的解决方案。

        col1      col2  .....col98
        UniqueID  header.....header

row1    ItemA1    Data2  ....Data98

row2    ItemA2    Data2  ....Data98

row3    ItemA3    Data2......Data98

row4    ItemA4    Data2......Data98

输入单元格:A2,A3 隐藏除 A2,A3 行之外的所有行

        col1      col2  .....col98
        UniqueID  header.....header

row2    ItemA2    Data2  ....Data98

row3    ItemA3    Data2......Data98

答案1

fixer1234 的答案是一个很好的开始。我假设您已经使用该答案中的技术来获取您感兴趣的标识符并将它们分成列中的单独行DA。让我们假设您的标识符是美国的各州:

                        工作表中所有州位于 A 列,选定的州位于 DA 列

在其他未使用的列的第 1 行中输入一些任意标题;例如,CZ输入

=(COUNTIF(DA$2:DA$51,A2)>0)

并向CZ2下拖动以覆盖所有有数据的行(即,直到第 1001 行)。请注意,我使用假设您有最多 50 个要搜索的目标(如您所说)。这将在列 中的值(至少一次)出现在列 中的每一行上DA$51计算为。现在过滤列并仅显示它所在的行:TRUEADACZTRUE

                        经过筛选,仅显示 DA 列中列出的州

答案2

编辑:正如 Scott 在他的评论中指出的那样,下面的答案不提供导航和编辑源数据的功能,它只显示它。他的答案为这个问题提供了一个解决方案。我将把答案保留为一般信息,以防有人需要一种方法来仅显示所选数据,因为 Scott 的答案引用了它。

有一种相对简单的方法可以实现您想要的功能,即在另一个位置创建您想要的输出,而不是尝试隐藏行(我相信这需要 VBA)。您描述的问题有两个部分:在逗号分隔的列表中输入您的选择并使用它,然后显示所选行。您可以通过在列中单独列出您的选择来简化它,因此我将首先介绍输出。

您可以使用 VLOOKUP 函数完成所需的输出。您可以创建一个通用公式并根据需要复制它。在此步骤中,我假设您的选择在列中单独列出。如果您以这种方式输入它们,您只需要这一步。如果您想使用逗号分隔的列表,第二步将对其进行解码以在列中创建单独的选择。

因此,我们假设您的参考名称位于 A 列,相关数据位于 97 个相邻列,所有数据位于第 2 行至第 1001 行。我将描述如何在同一张表的另一个位置进行输出。如果您想在单独的表上执行此操作,只需将表引用作为指向您的数据的任何单元格引用的一部分即可。

假设您的输出从第 DA 列第 2 行开始,并包含接下来的 97 列。选择输入在 DA2 到 DA50 中,或者输入您需要的任意数量。DB2 中的条目将是:

    =IFERROR(VLOOKUP($DA2,$A$2:$CW$1001,COL(DB2)-COL($DA2)+1,FALSE),"")

快速解释:开头的 IFERROR 和结尾的双引号会在查找产生错误时强制输出空白。如果 DA 中没有条目,就会发生这种情况。因此,如果一开始没有条目,输出将为空白。如果有 10 个条目,则之后的所有行都将为空白。

VLOOKUP 查找在 DA2 中输入的选择,处理所有数据(我将其显示为 A2:CW1001),将 DA2 与 A 列中的条目进行比较(“false”指定完全匹配),并返回匹配行的关联数据列中的内容。由于输出列与数据的相对位置相同,因此 COL 函数会计算数据中的等效列。将此公式复制到所有输出列和所需的行中。

当选择项输入到 DA 列时,每个选择项的数据都会显示出来。如果您想以逗号分隔的列表形式输入选择项,请记住单元格的字符数有限制。如果您要讨论 50 个选择项,并且唯一引用很长,则可能会超出字符数限制。话虽如此,这里有一种解码方法。我将描述一种并不优雅的方法,但它保持了简单且易于调试。

假设您在 DA1 中输入列表。我们将使用 DA 左侧的三列来解码列表,因此将是 CX、CY 和 CZ。在 CX 中,我们找到逗号。CX2 中的公式为:

    =FIND(",",DA1)      

在第一个逗号之后,我们需要告诉 FIND 函数从哪里开始寻找下一个逗号,因此 CX3 是:

    =FIND(",",$DA$1,CX2+1) 

您可以根据需要将此公式向下复制到任意多行。在每一行中,它将开始查找最后一个逗号后的字符位置。接下来,我们将跳到 CZ 列并计算每个选择的长度。在 CZ2 中,公式为:

    =IF(ISERROR(CX2),LEN($DA$1),CX2-1)

如果未找到逗号(返回错误),则列表中有零个或一个条目,在这种情况下,长度就是列表中的长度。否则,它比逗号的位置少一个字符。对于 CZ3,公式为:

    =IF(ISERROR(CX2),NA(),IF(ISERROR(CX3),LEN($DA$1)-CX2,CX3-CX2-1))

如果在上一次搜索中没有找到逗号,则表示此行没有要解码的选择,并返回错误代码。如果当前行没有找到逗号,则表示还有一个条目,其长度是最后一个逗号之后的所有内容。如果找到了另一个逗号,则长度是最后两个逗号之间的字符。可以根据需要将此公式复制下来,以适应任意数量的行。

在 CY 列中,我们计算列表中每个条目的起始位置。CY2 不需要值,因为它始终是开头。CY3 中的公式为:

    =CZ2+2

也就是第一个项的长度加上逗号后的字符。CY4 中的公式为:

    =CY3+CZ3+1

这是前一个项目的起始位置加上前一个项目的长度加上逗号。将其复制下来,复制所需的行数。现在您已经确定了在列表中每行的条目的位置。下一步是填充选择。DA2 的公式为:

    =IF(ISBLANK(DA1),"",LEFT(DA1,CZ2))

如果列表为空,则返回空白。否则,它会取最左边的字符,长度等于之前计算的长度。DA3 的公式为:

    =IF(OR(ISBLANK($DA$1),ISNA(CZ3)),"",MID($DA$1,CY3,CZ3))

如果列表为空或长度计算返回 #NA,则结果为空白。否则,它使用计算出的起始位置和长度从列表中返回这些字符。您可以根据需要将此公式复制下来,以生成任意多行。现在,输出与第一部分相同,只有选择条目是从逗号分隔的列表中填充的。

相关内容