『1行目の連続データを再利用して縦書きでデータを作成したい』(山田)
【初期データ】
A B C D
1|a|b|c
2|d|e|f|g|
3|h|i|j|k|l|m|n
元のデータが上記のexcelファイルを
手動で加工して別のシートへ以下の表を作成しています。
【加工例】
A B
1|a
1|b
1|c
2|d
2|e
2|f
2|g
3|h
3|i
3|j
3|k
3|l
3|m
3|n
列数は100列以上のケースも多く手作業でコピー貼り付けを繰り返すのは割と手間が掛かっています。
現在思いつくのがマクロでの処理となり
do loop やif関数用いてマクロで【初期データ】を読み込んで
1行目の最終列を取得、
A1の値とA2の値をコピーして貼り付け、列を一個移動して
A1の値とA3の値をコピーして貼り付け、
最終列まで処理が終われば改行。
2行目の最終列を取得して。。。
と繰り返せば処理は可能なのですが、
もっと手軽に処理する手段は無いでしょうか。という相談になります。
どうぞよろしくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
元シートがSheet1として、Sheet2のA1セルに下記を入れて下さい。自動でspillされると思います。
=LET(
a,IF(Sheet1!B1:H3<>"",Sheet1!A1:A3 & "|" & Sheet1!B1:H3,""),
b,TOCOL(a),
c,FILTER(b,b<>""),
d,REDUCE("",c,LAMBDA(accum,x,VSTACK(accum,Textsplit(x,"|")))),
DROP(d,1)
)
# 式の最初に半角スペースを入れないようにしてください。
(xyz) 2025/11/08(土) 21:57:35
=LET(
a,IF(Sheet1!B1:H3<>"",Sheet1!A1:A3 & "|" & Sheet1!B1:H3,""),
b,TOCOL(a),
FILTER(b,b<>"")
)
にとどめておいて、
B1セルに
=TEXTSPLIT(A1,"|")
と入れ、下にコピーというのが分かり易いとは思います。
どうしてもREDUCEを使わないといけないわけでは無いと思います。
# 見落としがあり、もっと簡単にできるかもしれません。
(xyz) 2025/11/08(土) 22:30:42
ご回答ありがとうございます。
今から実際に試してから改めて結果をコメントさせていただきます。
取り急ぎ、御礼申し上げます。
(山田) 2025/11/08(土) 23:00:50
LET( 関数で 理想の形でAB列に転記に成功
上記を確認致しました。とても効率的に作業を進められそうです。
お二方非常に助かりました、誠に有難うございます!
(山田) 2025/11/08(土) 23:22:48
別解です。
=LET(
rngA,A1:A3,
body,B1:H3,
a,IF(body<>"",rngA & "|" & body,#N/A),
b,TOCOL(a,2),
MAKEARRAY(ROWS(b),2,
LAMBDA(r,c,LET(ary,TEXTSPLIT(INDEX(b,r,1),"|"),CHOOSECOLS(ary,c)))
)
)
(xyz) 2025/11/09(日) 08:18:46
Sub test()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim i As Long, j As Long, n As Long
Set ws1 = Worksheets("Sheet1")
Set ws2 = Worksheets("Sheet2")
n = 1
For i = 1 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
For j = 1 To ws1.Cells(i, Columns.Count).End(xlToLeft).Column
ws2.Cells(n, "A") = i
ws2.Cells(n, "B") = ws1.Cells(i, j)
n = n + 1
Next
Next
End Sub
※今さらな質問ですが、初期データはセルごと分割されているんでしょうか。
|[A]|[B]|[C]|[D]|[E]|[F]|[G]
[1]|a |b |c | | | |
[2]|d |e |f |g | | |
[3]|h |i |j |k |l |m |n
こういうデータを想定していたんですが、合っていますか?
(あ) 2025/11/09(日) 11:02:12
A列の例ですが分割されていて
A1に1 A2にa A3にb A4にc
と4個のセルに掛かれています
(山田) 2025/11/09(日) 12:29:22
=LET(a,TOCOL(IF(B1:H3<>"",A1:A3&"\"&B1:H3,""),1),b,FILTER(a,a<>""),DROP(REDUCE("",TOCOL(b,1),LAMBDA(x,y,VSTACK(x,TEXTSPLIT(y,"\")))),1))
(あ) 2025/11/09(日) 13:55:37
わたしの最初の説明で行番号と値の説明が不明瞭で
お手間をお掛け致しました。
昼間に返答を投稿したつもりで更新完了しておりませんでした。大変失礼いたしました。
再度提示していただいた数式で完全解決に至りました。
誠に感謝いたします。
(山田) 2025/11/09(日) 23:25:13
> 行と列の使い方が逆転しています。 と書きましたが通じていますか?念のため書きます。
質問のタイトルですが、 「1行目の連続データを再利用して縦書きでデータを作成したい」 ↓ 「A列の連続データを再利用して縦書きでデータを作成したい」 と 書くのが正しいのでは?
> A列の例ですが分割されていて > A1に1 A2にa A3にb A4にc > と4個のセルに掛かれています ↓ 1行目の例ですが分割されていて A1に1 B1にa C1にb D1にc と4個のセルに書かれています
と書くのが正しいのではないですか? これでExcelを使う方と話が通じるのではないでしょうか。 (xyz) 2025/11/09(日) 23:51:22
>再度提示していただいた数式で完全解決に至りました。 内容は私が提示したものと全く同じものだと思います。単に一行にまとめていただいただけだと思います。 # > 数式はスマートなのは思いつきませんでした。 # と言外にスマートじゃない、と言われる筋合いはないですねww
私見では、複雑な式は一行に書くと可読性が低いと思います。自分であとから読んでも分かりにくいですね。 ある程度改行を適切に入れるのが良いと思います。 (VBAでマルチステートメントは原則使わないというのと似た感じです。) ただし、行き過ぎると冗長な感じになるのは承知しています。特に")"だけの行が続いたりすると。 (xyz) 2025/11/10(月) 11:24:43
こんな感じでも
=LAMBDA(rng,
LET(nums,TAKE(rng,,1),
body,DROP(rng,,1),
cl,TOCOL(IF(ISBLANK(body),NA(),nums),3),
cr,TOCOL(body,3),
HSTACK(cl,cr))
)(Sheet1!A1:H3)
(´・ω・`) 2025/11/10(月) 13:33:09
スマートな数式ですね。いつもながら勉強になります。 # 他の方の名回答に接すると、開眼するのですが、残念ながら直ぐに閉眼?するのが常ですw
(xyz) 2025/11/10(月) 20:45:26
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.