Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11全般 : Microsoft 365)
パターンが変わっても数式を変えずに、二つの表からの組み合わせ結果を出したい
投稿日時: 24/01/11 18:42:10
投稿者: らぎ

初めまして。関数強い方!お力を貸していただきたいです!
下記のセルA6のみに関数を入れて、パターン1・2でC1~F1の情報が変わっても
A6~C11(パターン2ならA1~C17)に組み合わせ結果を自動反映したいです!
条件として、
@パターン1・2で情報が変わる箇所をLET関数で変数名を指定してほしい
Aラムダ関数やスピル機能を使って、
A6のみに式を入れれば組み合わせ結果と連番を自動反映したい
です!
【パターン1、C1~F1が服の情報の場合】
  A列    B列   C列  D列   E列     F列 
1 長袖    S    服  6    A1:A2    B1:B3   
2 半袖     Ⅿ                 
3 ミニスカ   Ⅼ  
4 ロンスカ                    
5                            
6 1     長袖   S
7 2     長袖   Ⅿ
8 3      長袖   L
9 4     半袖   S
10 5     半袖   M
11 6     半袖   L
【パターン2、C1~F1が全ての情報の場合】
  A列    B列    C列   D列   E列    F列 
1 長袖    S    全て  12   A1:A4   B1:B3   
2 半袖    Ⅿ                 
3 ミニスカ  Ⅼ
4 ロンスカ
5
6 1     長袖   S
7 2     長袖   Ⅿ
8 3      長袖   L
9 4     半袖   S
10 5     半袖   M
11 6     半袖   L
12 7    ミニスカ  S
13 8    ミニスカ  Ⅿ                         
14 9    ミニスカ  L
15 10    ロンスカ  S
16 11    ロンスカ  M
17 12    ロンスカ  L

回答
投稿日時: 24/01/11 19:57:08
投稿者: んなっと

      A   B C D   E   F
 1   長袖   S    A1:A2 B1:B3
 2   半袖   M          
 3 ミニスカ   L          
 4 ロンスカ             
 5                  
 6     1 長袖 S         
 7     2 長袖 M         
 8     3 長袖 L         
 9     4 半袖 S         
10     5 半袖 M         
11     6 半袖 L         
 
A6
=LET(x,INDIRECT(E1),y,INDIRECT(F1),a,ROWS(x),b,ROWS(y),c,SEQUENCE(a*b),
HSTACK(c,INDEX(x,(c-1)/b+1),INDEX(y,MOD(c-1,b)+1)))

投稿日時: 24/01/12 10:21:46
投稿者: らぎ

んなっと様ご回答ありがとうございます!
入力してみたんですが、定義した後にlet関数を定義することはできません、
と表示されるのですが、カッコやかんまのいちの問題でしょうか?

回答
投稿日時: 24/01/12 11:05:18
投稿者: んなっと

新規ブックに以下のように入力して
 
      A   B C D   E   F
 1   長袖   S    A1:A2 B1:B3
 2   半袖   M          
 3 ミニスカ   L          
 4 ロンスカ             
 5                  
 
それから
A6
=LET(x,INDIRECT(E1),y,INDIRECT(F1),a,ROWS(x),b,ROWS(y),c,SEQUENCE(a*b),
HSTACK(c,INDEX(x,(c-1)/b+1),INDEX(y,MOD(c-1,b)+1)))
 
としてみてください。

投稿日時: 24/01/12 14:23:41
投稿者: らぎ

んなっと様へ
新規ブックに入力しましたが、バリューのエラー表示になってしまいます…!
また、可能でしたら、別の式で、ラムダ関数を使うことはできますでしょうか?

回答
投稿日時: 24/01/12 14:32:59
投稿者: んなっと

では次に
A6
=LET(x,INDIRECT(E1),y,INDIRECT(F1),a,ROWS(x),b,ROWS(y),c,SEQUENCE(a*b),
CHOOSE({1,2,3},c,INDEX(x,(c-1)/b+1),INDEX(y,MOD(c-1,b)+1)))

回答
投稿日時: 24/01/12 14:42:49
投稿者: んなっと

 名前定義を使ってLAMBDA関数を定義するときは
 
 数式
→名前の定義
→名前:
func
 参照範囲:
=LAMBDA(p,q,LET(x,INDIRECT(p),y,INDIRECT(q),a,ROWS(x),b,ROWS(y),c,SEQUENCE(a*b), CHOOSE({1,2,3},c,INDEX(x,(c-1)/b+1),INDEX(y,MOD(c-1,b)+1))))
→OK
→どこかのセルに
=func(E1,F1)

投稿日時: 24/01/12 18:57:59
投稿者: らぎ

んなっと様
エイチスタックをチューズに変えましたが最初と変わらずでした‥
ラムダ関数定義を試す前にパソコンがフリーズしてしまったので、月曜日に再度挑戦してみます!
また試した結果をコメントさせて頂きます!!
また、何度も丁寧な回答頂きありがとうございます!!

投稿日時: 24/01/15 12:41:51
投稿者: らぎ

んなっと様
名前の定義の方法で解決できました!!
ありがとうございます!
因みに、ラムダヘルパー関数でも同じことができそうだと思って、
reduce関数を式の最初に入れてみたんですが、エラーになってしまうんですが、
ヘルパー関数を使う方法では対応できないのでしょうか?
私の式の作り方がよくないのでしょうか?

回答
投稿日時: 24/01/15 15:22:55
投稿者: んなっと

LAMBDAヘルパー関数であれば以下の関数が当てはまり、
  
BYCOL
BYROW
REDUCE
SCAN
MAP
MAKEARRAY
  
そのうちのREDUCEを使えないかという質問ですね。
  
A6
=LET(x,INDIRECT(E1),y,INDIRECT(F1),DROP(REDUCE(0,x,LAMBDA(s,t,
VSTACK(s,HSTACK(SEQUENCE(ROWS(y))+ROWS(s)-1,IF(y=y,t),y)))),1))
  
最初の回答の式が使えないのでしたら、この式も無理。
さっさとスレッドを閉じましょう。

投稿日時: 24/01/15 16:32:16
投稿者: らぎ

んなっと様
わかりました!
色々教えて下さりありがとうございました!