データがいっぱい入った列があり、10 行または 20 行後に新しい行を繰り返す必要があるという特定のパターンはありません。したがって、数式で各セクションの開始と終了を定義できる場合にのみ、これらのインデックスとオフセットのソリューションが機能します。
正しく理解するために、次のような列があります。
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
関数の 2 番目のパラメーターに を使用します。
TEXTJOIN()
次に、 "-" 文字で分割された単一要素配列を、"-" 文字の代わりに "" を使用した同じ文字列に変換します。これにより、文字列が部分的に関数で使用できるようFILTERXML()
になります。置換はすべて文字列の内部にあることに注意してください。つまり、文字列の両端ではなく、文字列の内部にのみ表示されます。HTML に少しでも精通している場合は、"</tag name>" 形式がタグを閉じ、"" がタグを開始することをご存知でしょう。
次に、開始タグを先頭に追加し ( がSUBSTITUTE()
発生する前に追加します)、終了タグを ... の末尾に追加します。つまり、「-」文字を使用して分割した目的の各グループの周囲に、開始タグと終了タグのペアが配置されます。
最後に、個別にタグ付けされたすべての要素 (タグ名 "" の由来を確認してください) を 1 つのグループにグループ化する必要があります (タグの由来を確認してください)。
これで、意味を成し、断片化できる HTML 文字列ができましたFILTERXML()
。最初のパラメータとしてその文字列を受け取り、2 番目のパラメータとして、末尾の「/Group/Element」ビットである「パス」と呼ばれるものを介してタグの関係を指定します。
このような文字列が特定の方法で構成されていることが非常に明らかな場合、Excel がなぜそのように設定したのか理解しにくいですよね? しかし、これは実際のライブ HTML をライブ Web サイトから分析することが目的であり、「ありふれた」文字列を分解するものではありません。また、このような HTML 文字列には他にも多くのタグが含まれている可能性があり、その場合はそれほど明白ではないでしょう。興味深いことに、複数のタグが付いた文字列を作成した場合、Excel が異なるパス値を使用して同じ文字列から異なるセットを取得できることが示唆されています。
とにかく、FILTERXML()
結果を縦のレイアウトで、1列に行を表示するのが好きです。これがお好みだと思います[はい、コメントで明示的に行数を要求しているのがわかります]ただし、そうでない場合、水平レイアウト、つまり 1 行に列を配置したい場合は、全体を関数でラップするだけですTRANSPOSE()
。
のもう 1 つの興味深い使用法FILTERXML()
は、そのようなグループのどの要素を番号 (1、2、3、... など) で正確に指定でき、最後の要素を番号 (わかっている場合) または「last」で指定できることです。これは便利です。
内部タグ ペア () を適切な場所に挿入する方法があれば、文字列でより広範囲のことを実行できます。