[[20260101170831]] 『4つの品目で数量が入っているものを別シートに空煤x(まき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『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 >


■1
無理にとは言いませんが、【入力用シート】【印刷用シート】それぞれを行列の情報付きでサンプルデータを示せませんか?
特に↓の部分がよく理解できません。
 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

もこな2様
お忙しい中、ご返信頂きありがとうございます。
説明不足で、申し訳無いです。
数字は、1〜3に限ります。

 【入力用シート】のレイアウト
 __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


>3 が 印刷用シート d e f へ品名のみ表示
>印刷用シート
>a c d e f
>連番 名前 品名 品名 品名
F列は何の項目ですか。
(?) 2026/01/01(木) 20:31:56

ご返信ありがとうございます。
印刷用シートのF列は不要でした。
大変失礼致しました。
(まき) 2026/01/01(木) 20:47:50

ちょっとズレて見えるので整理するとこんな感じですかね。(行番も付けました)
 【入力用シート】のレイアウト
     __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


かなりテキトーに作りましたが、VBAであれば↓のようなアプローチでも解決できると思いますので、マクロOKということであれば研究してみてください。

    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


もこな2様
ご返信頂きありがとうございます。
VBAでもいいのですが…
数式で済むようなら数式でと考えておりました。
他の方の回答も待ってみて、無理そうなら、VBAで
やろうと思います。

(まき) 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


数式の回答例が示されているところですが、VBAのコードにちょっとミスがあったので修正かねてユーザー定義関数にしてみました。

↓を標準モジュールに張り付けてから、印刷用シートのセルに「=俺式関数壱(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


xyz様
もこな2様

数量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

xyz様
ありがとうございます。
組み合わせすると、数式の中身を全く理解していませんが、

=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


訂正
誤:posの開始値を1にするため
正:posの開始値を2にするため
(うまうま) 2026/01/03(土) 14:49:27

 うまうまさん、フォローありがとうございました。

       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

皆様ありがとうございます。
まずは、数式の中身を理解する所から始めたいと思います。
ありがとうございました。
(まき) 2026/01/04(日) 09:17:44

 こんな方法も。
=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.