我有一列数据,但没有特定的模式,即在 10 或 20 行之后我应该重复一行。因此,这些 Index 和 Offset 解决方案只有在公式可以定义每个部分的开始和结束的情况下才有效。
为了正确理解,我有一个如下的专栏:
A
B
C
D
- (这会中断一个部分)
A
C
E
F
G
- (这会中断另一行)
B
C
F
G
- (再次中断)
因此,如果每个“-”字符都可以在表格中开始一个新行,那么对我来说就没问题了。是否可以在 Excel 或 Access 中使用公式或 VBA 来实现这一点?
谢谢你!
答案1
使用:
=FILTERXML("<Group><Element>"&SUBSTITUTE(TEXTJOIN("",FALSE,A1:A15),"-","</Element><Element>")&"</Element></Group>","/Group/Element")
它用于TEXTJOIN()
连接列中的所有值(公式中的 A1:A15。它假定没有“-”作为结束单元格,并且如果始终出现结束“-”字符,则可以通过简单地选择该最后一个条目上方的单元格作为范围的结尾来实现。)它不会跳过任何单元格,即使是空的,但如果应该跳过空单元格,则用于TRUE
函数中的第二个参数。
然后,您要将由TEXTJOIN()
“-”字符分成几部分的单元素数组转换为相同的字符串,但用“”代替“-”字符。这是为了让字符串部分准备好供FILTERXML()
您看到的函数使用。请注意,替换都是字符串内部的,换句话说,只出现在字符串内部,而不是两端。如果您对 HTML 很熟悉,您就会知道“</tag name>”形式关闭标签,而“”打开标签。
然后,在开头添加开始标记(将其添加到发生之前SUBSTITUTE()
),并将结束标记附加到...结尾。因此,您在每个所需组周围都有开始和结束标记对,这些组由“-”字符分隔。
最后,所有这些单独标记的元素(看看我从哪里得到标签名称“”?)需要分组到单个组中(看看标签来自哪里?)。
现在您有了一个FILTERXML()
可以理解并分解成多个部分的 HTML 字符串。它将该字符串用作第一个参数,对于第二个参数,您可以通过所谓的“路径”告诉它标签之间的关系……即末尾的“/Group/Element”位。
很难理解为什么 Excel 会设置这种需求,因为这样的字符串显然是以特定方式组织的,对吧?但它的目的是从实时网站中剖析实际的实时 HTML,而不是拆开“平凡”的字符串,而且这样的 HTML 字符串中可能还有很多其他标记,那么就不会那么明显了!不过有趣的是,它表明,如果您创建了一个带有多个标记的字符串,则可以让 Excel 使用不同的 Path 值从同一字符串中获取不同的集合。
无论如何,FILTERXML()
喜欢以垂直布局给出结果,每行占一列。我相信你会更喜欢这个[是的,我看到评论中你明确要求行],但如果不是,如果您想要水平布局,一行中的列,只需将整个内容包装在一个TRANSPOSE()
函数中。
另一个有趣的用途FILTERXML()
是,您可以准确指定您想要的该组中的哪个元素,通过数字(1、2、3、...等)和最后一个元素(如果已知)或通过“最后一个”来指定,这很方便。
如果您有可行的方法在正确的位置插入内部标签对(),它可以用字符串做更广泛的事情。