『4つの品目で数量が入っているものを別シートに空白を除いて品名を表示したい』(まき)
入力用シート
a b c d e f g h i j k
連番 ID 名前 品名 数量 品名 数量 品名 数量 品名 数量
e g i k の数量は(品名の種類は、4つです。)
3 が 印刷用シート d e f へ品名のみ表示
2 が 印刷用シート d f へ品名のみ表示
1 が 印刷用シート d へ品名のみ表示
空白と0は表示しないようにして、別シートに表示されるようにしたいです。
これをやると、数量が1の場合、他の列にズレが生じてしまいます。
印刷用シート
a c d e f
連番 名前 品名 品名 品名
と表示されるようにしたいです。
一品目だけなら?出来ましたが、複数の条件を入れてやるやり方を教えて頂きたいです。
一例
a2
=IFERROR(INDEX(入力用!a:a,small(INDEX((入力用!e:e<1)*1000+row(入力用!e:e),)ROW(入力用!a1)
最終的に印刷用シートに全て反映されたら、その品目をcountifsで数量の合計を出したいですが、全く反応しません。
拙い説明ですみません。
どなたかご教示頂ければ、幸いです。
< 使用 Excel:Excel2021、使用 OS:Windows10 >
3 が 印刷用シート d e f へ品名のみ表示 2 が 印刷用シート d f へ品名のみ表示 1 が 印刷用シート d へ品名のみ表示
またレイアウトを示すときは、各行の先頭に半角スペースを入れると、少し小さめの文字で改行なしになります。
■2
想像込みになりますが、例えば以下のような話であれば、入力用シートのD〜H列の品名のみを各行ごとに詰めてD列以降に表示させたいと説明すればよいとおもいます。
【入力用シート】のレイアウト __A__ _B_ __C__ __D__ __E__ __F__ __G__ __H__ __I__ __J__ __K__ 連番 ID 名前 品名3 数量3 品名2 数量2 品名1 数量1 品名0 数量0 1 A01 ああ AAA 10 BBB 15 CCC 8 DDD 33 2 B02 いい EEE 1 FFF 4 3 C03 うう GGG 22 HHH 33 III 5 4 D04 ええ JJJ 10
【印刷用シート】のレイアウト __A__ _B_ __C__ __D__ __E__ __F__ 連番 ID 名前 品名3 品名2 品名1 1 A01 ああ AAA BBB CCC 2 B02 いい EEE 3 C03 うう GGG HHH 4 D04 ええ (もこな2) 2026/01/01(木) 19:09:45
【入力用シート】のレイアウト __A__ _B_ __C__ __D__ __E__ __F__ __G__ __H__ __I__ __J__ __K__ 連番 ID 名前 品名3 数量3 品名2 数量2 品名1 数量1 品名0 数量0 1 A01 ああ AAA 3 BBB 1 CCC 2 DDD 3 2 B02 いい EEE 1 FFF 3 3 C03 うう GGG 2 HHH 3 III 1 4 D04 ええ
【印刷用シート】のレイアウト __A__ _B_ _C__ __D__ __E__ __F__ 連番 名前 品名3 品名2 品名1 1 ああ AAA AAA AAA 1 ああ BBB 1 ああ CCC CCC 1 ああ DDD DDD DDD 2 いい EEE 2 いい FFF FFF FFF 3 うう GGG GGG 3 うう HHH HHH HHH 4 うう III
こんなイメージですが…伝わりますでしょうか?
(まき) 2026/01/01(木) 19:30:14
【入力用シート】のレイアウト
__A__ _B_ __C__ __D__ __E__ __F__ __G__ __H__ __I__ __J__ __K__
1 連番 ID 名前 品名3 数量3 品名2 数量2 品名1 数量1 品名0 数量0
2 1 A01 ああ AAA 3 BBB 1 CCC 2 DDD 3
3 2 B02 いい EEE 1 FFF 3
4 3 C03 うう GGG 2 HHH 3 III 1
5 4 D04 ええ
【印刷用シート】のレイアウト
__A__ __B__ __C__ __D__ __E__
1 連番 名前 品名3 品名2 品名1
2 1 ああ AAA AAA AAA
3 1 ああ BBB
4 1 ああ CCC CCC
5 1 ああ DDD DDD DDD
6 2 いい EEE
7 2 いい FFF FFF FFF
8 3 うう GGG GGG
9 3 うう HHH HHH HHH
10 4 うう III
すなわち、連番・名前と品名の組み合わせごとに数量の数だけ品名でC〜Eを埋めればいいんだけど、2の時はD列を空けるというルールになると。。。
ちょっと数式だと思いつかないので、数式じゃないと困るという場合は他の回答者さんをお待ちください。
VBA(マクロ)であれば、処理は可能かと思います。
(もこな2) 2026/01/02(金) 00:32:35
Sub さんぷる()
Dim 配列() As Variant
Dim 最終行 As Long, r As Long, c As Long, i As Long
With Worksheets("入力用シート")
最終行 = .Cells(.Rows.Count, "A").End(xlUp).Row
ReDim 配列(1 To (最終行 - 1) * 3, 1 To 5)
For r = 2 To 最終行 Step 1
For c = 4 To 11 Step 2
If .Cells(r, c + 1).Value > 0 Then
i = i + 1
配列(i, 1) = .Cells(r, "A").Value
配列(i, 2) = .Cells(r, "C").Value
Select Case .Cells(r, c + 1).Value
Case 1
配列(i, 3) = .Cells(r, c).Value
Case 2
配列(i, 3) = .Cells(r, c).Value
配列(i, 5) = .Cells(r, c).Value
Case 3
配列(i, 3) = .Cells(r, c).Value
配列(i, 4) = .Cells(r, c).Value
配列(i, 5) = .Cells(r, c).Value
Case Else
MsgBox .Cells(r, c + 1).Address(0, 0) & "セル" & vbLf & "想定外の数量が入力されています"
Exit Sub
End Select
End If
Next c
Next r
End With
Worksheets("印刷用シート").Range("A2").Resize(UBound(配列, 1), UBound(配列, 2)).Value = 配列
End Sub
(もこな2) 2026/01/02(金) 00:40:39
(まき) 2026/01/02(金) 07:30:44
数式の例を挙げておきます。
# どうして左寄せにしないのか不思議です。 # 左寄せにした例です。(どうしても原案どおりと言うなら、数式を一部入れ替えると直ぐに修正できます。)
<<Sheet1>>
A B C D E F G H I J K
1 連番 ID 名前 品名1 数量1 品名2 数量2 品名3 数量3 品名4 数量4
2 1 A01 ああ AAA 3 BBB 1 CCC 2 DDD 3
3 2 B02 いい EEE 1 FFF 3
4 3 C03 うう GGG 2 HHH 3 III 1
5 4 D04 ええ
<<Sheet2>>
A B C D E
1 連番 名前 品名1 品名2 品名3
2 1 ああ AAA AAA AAA
3 1 ああ BBB
4 1 ああ CCC CCC
5 1 ああ DDD DDD DDD
6 2 いい EEE
7 2 いい FFF FFF FFF
8 3 うう GGG GGG
9 3 うう HHH HHH HHH
10 3 うう III
--------------------------
Sheet2のA2セルに下記を入れます。
(数式バーに貼り付けて下さい。
なお、数式の最初にスペースを入れないこと。)
=LET(
src, Sheet1!A2:K5,
seq, SEQUENCE(ROWS(src)*4),
idx, INT((seq-1)/4)+1,
pos, MOD(seq-1,4)+1,
no, INDEX(src, idx, 1),
name, INDEX(src, idx, 3),
item, INDEX(src, idx, 2*pos+2),
qty, INDEX(src, idx, 2*pos+3),
FILTER(
CHOOSE({1,2,3,4,5},
no,
name,
item,
IF(qty>=2,item,""),
IF(qty>=3,item,"")
),
item<>""
)
)
(xyz) 2026/01/02(金) 12:21:01
↓を標準モジュールに張り付けてから、印刷用シートのセルに「=俺式関数壱(A2:K5)」とすれば動く想定です。
Function 俺式関数壱(データ範囲 As Range)
Dim 配列() As Variant
Dim r As Long, c As Long, i As Long, x As Long, y As Long
Dim 必要列数 As Long
必要列数 = WorksheetFunction.Max(Intersect(データ範囲, データ範囲.Offset(, 3)))
If 必要列数 < 3 Then
必要列数 = 4 '配列は0ベースなので-1している
Else
必要列数 = 必要列数 + 1
End If
For r = 1 To データ範囲.Rows.Count Step 1
For c = 4 To データ範囲.Columns.Count Step 2
If データ範囲.Cells(r, c + 1).Value > 0 Then
ReDim Preserve 配列(必要列数, i)
配列(0, i) = データ範囲.Cells(r, "A").Value
配列(1, i) = データ範囲.Cells(r, "C").Value
Select Case データ範囲.Cells(r, c + 1).Value
Case 2
配列(2, i) = データ範囲.Cells(r, c).Value
配列(3, i) = ""
配列(4, i) = データ範囲.Cells(r, c).Value
x = 5
Case Else
For x = 2 To データ範囲.Cells(r, c + 1).Value + 1
配列(x, i) = データ範囲.Cells(r, c).Value
Next x
End Select
For y = x To 必要列数
配列(y, i) = ""
Next y
i = i + 1
End If
Next c
Next r
俺式関数壱 = WorksheetFunction.Transpose(配列)
End Function
やってみてですが、入力シート側が右寄せになっているのはともかく、数量が2の時だけ例外処理しなきゃいけないのが、ちょっとめんどうですね。
(もこな2) 2026/01/02(金) 13:50:46
数量2の時だけ例外なのは、Cが月曜 Dが水曜 Eが金曜という想定の為、左寄せが出来ない理由です。
面倒で申し訳無いです。
(まき) 2026/01/02(金) 14:09:03
別に面倒ではありません。既にコメントしましたが、 >どうしても原案どおりと言うなら、数式を一部入れ替えると直ぐに修正できます。
CHOOSEを使って複数の列を横に連結している所がありますが(Excel365のHSTACKの代替)、
そこで、D列、E列に入れる内容を入れ替えた数式に変更するだけの話です。
IF(qty>=3,item,""),
IF(qty>=2,item,"")
まずは数式の中身を理解することが必要ですね。頑張ってください。 (xyz) 2026/01/03(土) 06:33:55
=LET(src, Sheet1!A2:K5,seq, SEQUENCE(ROWS(src)*4),idx, INT((seq-1)/4)+1,pos, MOD(seq-1,4)+1,no, INDEX(src, idx, 1),name, INDEX(src, idx, 3),item, INDEX(src, idx, 2*pos+2),qty, INDEX(src, idx, 2*pos+3),FILTER(CHOOSE({1,2,3,4,5},no,name,item, IF(qty>=3,item,""),IF(qty>=2,item,"")),item<>""))
コピペしてみましたが、上手く行きません。
実は、DとE列には別に項目が入っていて、実際は、Fから始まります。
自分ではできそうにありませんので、ご教示いただけますと幸いです。
<<Sheet1>>
A B C D E F G H I J K L M
1 連番 ID 名前 品名1 数量1 品名2 数量2 品名3 数量3 品名4 数量4
2 1 A01 ああ AAA 3 BBB 1 CCC 2 DDD 3
3 2 B02 いい EEE 1 FFF 3
4 3 C03 うう GGG 2 HHH 3 III 1
5 4 D04 ええ
(まき) 2026/01/03(土) 12:31:10
・srcを実際の範囲に変更
・posの開始値を1にするため、MOD(seq,4)+1 に変更
・左詰め云々については、既に解答が示されています
xyzさんの数式、勉強になりました。
(うまうま) 2026/01/03(土) 14:46:13
うまうまさん、フォローありがとうございました。
item, INDEX(src, idx, 2*pos+2),
qty, INDEX(src, idx, 2*pos+3),
を単純に右に2列移動することでよいと思います。
つまり、
item, INDEX(src, idx, 2*pos+4),
qty, INDEX(src, idx, 2*pos+5),
です。
pos自体を変更すると、データの脱漏が発生してしまいます。
例えば、"ああ"の"DDD"データが抜け落ちます。
質問者さんには、数式の理解に是非努めることを推奨します。 何か修正の必要があっても、対応が出来なくなると思います。
なお、LET関数を使った式では特に、長い式になりますので、 改行を適宜入れて可読性を高めることが得策となります。 改行をなくして一行にしてしまうのは、改悪としか思えません。 その形式で内容理解できる人は極めて稀です。 内容を関知しない方針とともに、不適切ではないでしょうか。再考してください。
なお、私はここまでとさせていただきます。 (xyz) 2026/01/03(土) 17:26:14
こんな方法も。 =LET(a,A2:A5,b,C2:C5,c,F2:M5, F,LAMBDA(i,j,TAKE(WRAPROWS(TOCOL(IF(c=c,i)),2),,j)), g,F(c,1),h,F(c,-1), k,MAKEARRAY(ROWS(h),3, LAMBDA(i,j,LET(x,INDEX(g,i),y,INDEX(h,i), CHOOSE(j,x,IF(y=3,x,""),IF(y>1,x,""))))), FILTER(HSTACK(F(a,1),F(b,1),k),h>0))
任意の配列を横2列に強制的に並べ替える関数Fを定義して、繰り返し使っています。 (んなっと) 2026/01/06(火) 21:44:39
コメントありがとうございます。 >使用 Excel:Excel2021 ということですので、LAMBDA、MAKEARRAY、HSTACKはじめ使えないものがあるように思いますが、いかがでしょうか。 (xyz) 2026/01/06(火) 23:37:00
xyzさん、ありがとうございました。おっしゃる通り、使えません。 申し訳ありませんでした。 (んなっと) 2026/01/07(水) 04:11:48
質問者さんの環境などどうでもよかったですね、失礼しました。
今回も貴重な学習材料を投下いただき、ありがとうございます。 閲覧者さんのなかにも んなっとさんの回答コメントを楽しみにされているかたが多いものと想像します。 # 今後ともこちらの掲示板にも回答コメントをいただきますよう。 (xyz) 2026/01/07(水) 05:19:12
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.