MATLABのデータ抽出方法について

このQ&Aのポイント
  • MATLABのデータ抽出方法についておたずねします。現在、MATLAB初心者の私はデータ抽出のためのプログラムを書いていますが、抽出条件を満たした行の特定の列を取得し新しい行列を作成する方法がわかりません。アドバイスをお願いします。
  • MATLAB初心者の私はデータ抽出のためのプログラムを作成していますが、特定の条件を満たした行の特定の列のデータを抽出し、新しい行列を作りたいと考えています。どのような命令を使用すれば良いでしょうか?アドバイスをお願いします。
  • MATLABのデータ抽出方法について教えてください。特定の条件を満たした行の特定の列のデータを抽出し、新しい行列を作成する方法が知りたいです。MATLAB初心者なので、具体的な方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

MATLABのデータ抽出についておたずねしたいことがあります。

MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.5

Kules part5です。 >この点についてですが、私の説明不足で申し訳ありません。 例えば、k=60で60番目と番目が同じだった場合、75番目の値を60番目に入れるのではなく、60番目の値は抽出せずに、75番目の値だけを抽出したいということだったのです。 なるほど~ということは、 10,30,50,90番目が同じ値で全体的にも最大値であるとすると、 k=10…p=[10,30]になるので何もしない k=30…p=[10,30,50]になるので何もしない k=50…p=[30,50]なので、50番目を抽出 k=90…p=90なので、90番目を抽出 という感じで動作させればいいんですかね? これならわざわざIdxを使わなくてもlogicalで対処できそうですね。 ということで書いてみます。A No.2とNo.3を混ぜたものになりそうです。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); t=(0:0.002:2.046)'; m2=[t,m]; m2(:,2)=m2(:,2)*1000; m2(:,3)=m2(:,3)*10; N=length(t); F=false(N,1); for k=1:N; Start=max([1,k-30]); End=min([k+31,N]); p=find(m2(:,2)==max(tmp)); if k==max(p(p<End)); F(k)=true; end; end; m3=m2(F,:); そんなに解説が必要な感じではありませんね。 先ほどはany(p==k)でpのどれか1つでもkと一致していれば pの最大値をIdxに代入していましたが、 今回はpのEnd以下の最大のものとkが一致した時のみ Fをtrueにしています。 こういうことでいいのですかね? 違ってたらor何か思った通りに動かなかったらor何かエラーが出たら またその旨補足願います。 参考になれば幸いです。

kozaru-ab27
質問者

お礼

回答ありがとうございました。今回も何の問題もなく動作し、所望の結果を得ることができました。 この度は何度も回答いただき本当にありがとうございます。 このプログラムはまだ先を作らなければならないので、また何か分からない点がありましたら質問させていただくことがあるかもしれません。 そのときは、また知識をお貸しいただけると大変助かります。 ありがとうございました。

その他の回答 (4)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.4

さらにさらにKulesです。 やっぱりミスが出ましたね(笑) ちゃんと動作確認せずに書くとこういうことが起こるので注意が必要ですね^^; 原因はわかりました。 p=find(tmp==max(tmp));→p=find(m2(:,2)==max(tmp)); Idx(k)=max(p);→Idx(k)=max(p(p<=End)); にそれぞれ変えて下さい。 どういうことかと言えば、 元々30番目と45番目が同じ値でその周辺における最大値の時、 k=30で45、k=45でも45をIdxに代入して欲しかったんですが、 pをtmp内でのインデックスにしてしまったため、 本来はkの値に関わらずp=[30,45]という値が出て欲しいところなのに kの値を変えるとpの値も変わるようになってしまっていたということです。 (k=45の時、15~76番目でtmpを作っているため、30番目はtmpの中では16番目,45番目はtmpの中では31番目) ということはp=[16,31]と出るのでk=40と一致するわけがありません。 そのため、pはあくまでも元の配列のインデックスから取りたいので tmp== と比較している箇所をm2(:,2)== に変更しました。 ところがこれの場合、今度はpの探索範囲が広すぎて、本来出してはいけない値を出すことがあります。 (例えば30,45,90が同じ値の場合、k=45では15~76番目から探しているので答えは45だが、 単純にmax(p)とすると90も入ってしまう) そのため、pはEnd以下の値から探すように max(p)ではなくmax(p(p<End))としています。 お手数掛けました。もう少し別の書き方もできますが、変更箇所が 一番少なそうな方法で修正しています。 参考になれば幸いです。

kozaru-ab27
質問者

補足

回答ありがとうございます。今回もエラーなく動作しました。 毎回本当にありがとうございます。 大変申し上げにくいのですが、もう一点お願いできますでしょうか。 >tが遅い方を取るということは、例えばk=60で60番目と75番目が同じだった場合は75番目の値Current,Voltageの値を60番目に入れるということでしょうか? この点についてですが、私の説明不足で申し訳ありません。 例えば、k=60で60番目と番目が同じだった場合、75番目の値を60番目に入れるのではなく、60番目の値は抽出せずに、75番目の値だけを抽出したいということだったのです。 この場合、今書かれているプログラムから、m3の行列からtが同じ行を削除するような命令文を書けばよいのでしょうか。

  • Kules
  • ベストアンサー率47% (292/619)
回答No.3

三度Kulesです。 >所望の動作を確認できました。 ちゃんと動いたとのことで何よりです。 >この点についてですが、実はExcelではfalseになるようにしていますが、その後私が手を加えてtが遅い方のデータを手動で記入していました。 tが遅い方を取るということは、例えばk=60で60番目と75番目が同じだった場合は75番目の値Current,Voltageの値を60番目に入れるということでしょうか? そうなるとかなりめんどくさいですね…単純にfalse/trueでは分岐できなさそうです。 (配列の並び上もっといい方法はあると思いますが、とりあえずプログラムでしたいことをそのままMatlabでのプログラムに起こしたいと思います) ということで書いてみます。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); t=(0:0.002:2.046)'; m2=[t,m]; m2(:,2)=m2(:,2)*1000; m2(:,3)=m2(:,3)*10; N=length(t); Idx=NaN(N,1); for k=1:N; Start=max([1,k-30]); End=min([k+31,N]); tmp=m2(Start:End,2); p=find(tmp==max(tmp)); if any(p==k); Idx(k)=max(p); end; end; Idx(isnan(Idx))=[]; m3=m2(Idx,:); 以下は解説です。 ・Idx=NaN(N,1); 確かdoubleになりますが、全ての値をNaN(Not a Number,Excelにもありますよね?)にします。 ・tmp=m2(Start:End,2); p=find(tmp==max(tmp)); tmpでStartからEndに相当するCurrentの配列を取りだし、 pにはtmpの値がtmpの最大値と一致するインデックスを取りだしています。 ・any(p==k); Idx(k)=max(p); kはインデックスに相当しますが、先ほど取りだしたpの中に1つでもkと一致するものがあった場合、 Idx(k)をNaNからpの最大値(つまりtが遅いもの)に書き変えています。pが1つしかなかった場合は その値がそのまま入ります。 ・Idx(isnan(Idx))=[]; 値が入らずNaNのままになっているものを取り除きます。 こんな感じでどうでしょう? 前回もそうなんですが、実際Matlab上で動作させずに書いているので動く保証はありません(笑) 書き方もおそらくKules独特のものですし… 何かエラーが出て動かない部分があればその旨補足願います。 参考になれば幸いです。

kozaru-ab27
質問者

補足

回答ありがとうございます。お手数をおかけしまして大変申し訳ありません。 いただいたプログラムを実行したところ、エラーなく動作しましたが、 一つ目のピーク値しか検出されず、それ以降のピークがm3に入っていません。 前回のプログラムでは全てのピーク値が検出されたのですが…。 原因はどこだと考えられますか(汗

  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

再びKulesです。 なるほど…Excelでの書き方を見ると、 H68の値はそれより前30点より大きく、かつ後ろ31点より大きい時H68そのもので、そうでない時は空白 ということでしょうか? ということは、雰囲気としてはcurrentが振動していて、前後62点の中での極大値になるところを探しにいっているという感じですかね? なるほど…ではそれを踏まえて書いてみます。 これを決めるのに関係なさそうなものは省略します。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); t=(0:0.002:2.046)'; m2=[t,m]; m2(:,2)=m2(:,2)*1000; m2(:,3)=m2(:,3)*10; N=length(t); F=false(N,1); for k=1:N; Start=max([1,k-30]); End=min([k+31,N]); if m2(k,2)==max(m2(Start:End,2)); F(k)=true; end; end; m3=m2(F,:); m3が抽出した行列です。 以下は解説です。 ・t=(0:0.002:2.046)'; 書かれたプログラムでは1行1024列の行列を作ってからreshapeで1024行1列の行列にしていますが、 これは転置すれば済む話なので'1つにしています。 ・F=false(N,1); logical型の変数を使っています。1024行1列false(偽)が並んだ状態です。 ・Start=max([1,k-30]); 配列を探す初めのインデックスを決めています。ループ変数のkが小さいと30個前を探すことができませんので(k-30が0以下になってしまうので)、その時は1になるようにしています(1と0以下の数なら大きいのは1、kが31以上ならk-30の方が大きくなる) ・End=min([k+31,N]); 先ほどの逆です。minを使っているのはインデックスが要素数(=N)を超えないようにするための細工です。 ・if m2(k,2)==max(m2(Start:End,2)); F(k)=true; end; currentのk番目の要素がStart~Endの中での最大値と等しい時、Fのk番目の要素をtrueにする処理です。 ・m3=m2(F,:); m2の中で、Fがtrueになっている行だけ全て抜き出すような形です。 これで大体は所望の動作をします。ただ、これだと本当にしたいのと少し違う動作になるかも知れません。 というのは、例えばk=60の時30~91を探すことになると思いますが、仮に60番目と35番目が同じ値で、しかもそれが30~91の中での最大値だった場合、質問者様の書かれたExcelの関数ではfalseですが、私が書いたものではtrueになります。 これを避けたいというのであれば、少しメンドクサイ書き方になりますが、forループの中身を Start1=max([1,k-30]); End1=max([1,k-1]); Start2=min([k+1,N]); End2=min([k+31,N]); if m2(k,2)>max(m2([Start1:End1,Start2:End2],2)); F(k)=true; end; とすれば同じ動作になります。 Matlab独特の(というかKuled独特の?)書き方になっているのでかなりわかりにくいかも知れません。 わからない部分orエラーが出て動かない部分があればその旨補足願います。 参考になれば幸いです。

kozaru-ab27
質問者

補足

何度も回答ありがとうございます。 Kulesさんのプログラムを実行したところ、所望の動作を確認できました。 この度は本当に助かりました。プログラムの内容もわかりやすい説明をいただき、把握することができました。 また、最後に補足をいただいた、 >例えばk=60の時30~91を探すことになると思いますが、仮に60番目と35番目が同じ値で、しかもそれが30~91の中での最大値だった場合、質問者様の書かれたExcelの関数ではfalseですが、私が書いたものではtrueになります この点についてですが、実はExcelではfalseになるようにしていますが、その後私が手を加えてtが遅い方のデータを手動で記入していました。ですのでMATLABのプログラムでもそのようにしたいのですが、プログラムが思いつかず困っています。 何度も申し訳ありませんが、なにかいい方法はないでしょうか…。

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

ええと…プログラム自体にエラーの元となることが書かれていますし、 最終目的が plotyy(t,current,t,voltage) ylim([0,700]) だとすると この3重のforループは結局何もしていないことになるのですが。 (最終的に使っているt,current,voltageは何も変化していない) 具体的にどのようなものを出そうとしているのか、 もう少し補足願います。 特に ・プログラム中に出てくるgは何か? について。m2からいくらかの成分を抽出して、その値の大小によってgにcを代入したりしなかったりしていますが、このgがどこにも使われていないため意味のない構文になっています。 gにどういう役割を持たせたいのでしょうか? 以上よろしくお願い致します。

kozaru-ab27
質問者

補足

回答ありがとうございます。質問が分かりづらくてすいません。 作成中のプログラムをそのまま載せてしまいましたので分かりづらくなってしまいました。 plotyy以下は今は無視していただいて構いません。 また、if文の条件を満たした場合の実行文g=c;も、どのように命令文を書けばいいの分からず、仮に書いておいたものです…。説明をしませんで申し訳ありません。 今、最終的にやりたいことは、m2の2列目(current)の中でのピーク値の抽出です。 Excelでは以下のような数式を用いて判別していました。 =IF(H68>MAX(H38:H67),(IF(H68>MAX(H69:H99),H68,"")),"") 上式のH列がm2の2列目(current)と考えてください。 この条件に当てはまった複数の行を抽出し、新たな行列を作成したいと考えています。 (2列目(current)だけでなく、1列目(t)、3列目(voltage )全て抽出したいのです) この新たな行列の作成の仕方が分からず、g=cと、仮に書いていたのです。 と、このような説明で大丈夫でしょうか…。 ちなみに、MATLAB2010ではfindpeaksという関数もあるようですが、私の使っているものは2009bなので、使えないみたいでした。

関連するQ&A

  • MATLABではどうすればいいのでしょうか?

    MATLABで、 M = 10 C = 1 K = 10 T =0.01 A = [0 1;-K/M -C/M] B = [0;1/M] I = [1 0;0 1] という条件で、 E1 = I + Σ(1/N!)*(A*T)^(N-1)  (ΣはN=2から) F1 = I+(A*T)*E1 G1 = E1*T*B の計算を、 例えば、5項目までと6項目までの計算をして、 その差をとり、差が条件以下(例えば10^-5以下)なら終了、 それ以上なら、続けて、次に6項目と7項目までを計算して、 その差をとるといったような、プログラムを作るにはどうすればよろしいのでしょうか?

  • MATLABの質問です。

    MATLABについての質問です。 大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるところまでできています。その後、全経路からダイクストラの方法で最短折れ線経路を求めたいのですがどのようにプログラムを持っていけばいいか分からず手詰まりしました。 ぜひご指導いただけますでしょうか。 よろしくお願いいたします。 プログラムは動きます。 close all; clc; init=1; final=1000; %図形座標取得 figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end % size(B{i},1) figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on axis([0,1,0,1]); end %図形の辺 k=0; for i=1:loop-1 for p=1:size(B{i},1) for q=p+1:size(B{i},1) k=k+1; obst(k,:) = [B{i}(p,:),B{i}(q,:)]; end end end Pall = pb(1, :); Pall = [Pall; cat(1, B{:})]; Pall = [Pall; pb(2, :)]; %全経路 k=0 for i=1:size(Pall,1) for j=i+1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; point{k}=[i,j]; end end % 交差判定 H=0 for j=1:size(path,1) cflas=1 for i=1:size(obst,1) y1=((obst(i,1)-obst(i,3))*(path(j,2)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,1))) y2=((obst(i,1)-obst(i,3))*(path(j,4)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,3))) y3=((path(j,1)-path(j,3))*(obst(i,2)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,1))) y4=((path(j,1)-path(j,3))*(obst(i,4)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,3))) Y1=y1*y2 Y2=y3*y4 if Y1<0&&Y2<0 H=H+1 cflas=0 S{j}=[0,0,0,0] S1{j}=[0,0,0,0] end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; Xa=[path(j,1),path(j,2)]; Yb=[path(j,3),path(j,4)]; S{j}=[X,Y] S1{j}=[Xa,Yb] plot(X,Y,'-');hold on end end barricade = length(B{1,1}); M=zeros %コストを計算 for k = 1:size(path,1) X1=S{k}(1,1); X2=S{k}(1,3); Y1=S{k}(1,2); Y2=S{k}(1,4); cost{k}=sqrt((X2-X1)^2+(Y2-Y1)^2) M(point{k}(1), point{k}(2) )=cost{k} % if cost{i}==0 % cost{i}=10 % end end M' g=cost{1} for j=1:size(obst,1)+1 if(cost{j}>cost{j+1}) g= cost{j+1} end end

  • MATLAB 行列の抽出

    私はMATLAB初心者なのですが,行列の抽出ができなくて困っております. やりたいこととしては,for文を用いて行列x_r(41×3行列)がode45によって次々と求められるので,そのつどそのつど(i=1のときから1=10のときまで)でx_r(1)の値を新しい行列pに保存していきたいのですが上手くいきません.わかる方がいらっしゃいましたらご教授お願いします. for i=1:10 [t,x_r]=ode45('...',[0.01],x_r); ..... p(:,i)=x_r(:,1); …(1) ..... end 上の(1)のように行列pにi=1~10までのときのそれぞれのx(i)(41×1行列)の値を保存しようとしましたがうまくいきません. p=(x(1)_i=1,x(1)_i=2,x(1)_i=3,・・・・,x(1)_i=10) (41×10行列)(やりたいことのイメージ) エラーメッセージは「添字による代入の次元が一致しません。」と出ています.

  • matlabで複数条件のif文を行列計算で行うには?

    matlabで複数条件のif文を行列計算で行うには? matlabではfor文などは行列計算で回したほうが高速化できると聞きました。 for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか? 自分のプログラムは以下のようなものです for i=1:100 for j=1:100 theta_kari=atan(abs(B(j,i))/abs(A(j,i))); if A(j,i)>=0&&B(j,i)>=0 theta(j,i)=theta_kari; elseif A(j,i)<0&&B(j,i)>=0 theta(j,i)=theta_kari+(pi/2); elseif A(j,i)<0&&B(j,i)<0 theta(j,i)=theta_kari+pi; elseif A(j,i)>=0&&B(j,i)<0 theta(j,i)=theta_kari+(pi/2*3); end end end よろしくお願いします

  • MATLABプログラミングをCのプログラミングに変換

    MATLABでよくやる以下のプログラミング方法を効率よくCでプログラムするにはどうすべきですか? a=[]; for i = 1:100 a_k = [1 2 3 4];<<-a_kは1行4列の行列です a = [a a_k];<<-特にこの部分 end よろしくお願いします。

  • MATLABのアップグレード問題

    MATLAB初心者です。 MATLAB6.1(おそらく)で開発されたコードがMATLAB7.01で動きません。 アドバイスを頂ければと思います。 1: out = {}; 2: for i=1:length(files), 3: out = [out, helper([d '/' files{i}], pat(2:end))]; 4: end 上記のコードの3行目で「Conversion to cell from char is not possible.」エラーが発生します。 MATLAB6.1から6.5のアップグレード問題で、空のセル配列の連結が原因のようです。 そこで下記のように修正しました。 1: out = {}; 2: for i=1:length(files), 3: if i==1 out = helper([d '/' files{i}], pat(2:end)); 4: else out = [out, helper([d '/' files{i}], pat(2:end))]; 5: end 6: end 1回目のループの場合は連結せず、2回目以降は連結するように修正しています。 このように修正しても意図通り動いていません。 修正方法は間違っていますか。

  • matlabのfor文について

    matlabについて基本的な質問があります. たとえば a1 = 11 a2 = 32 a3 = 53 a4 = 63 for i = 1:length(a1) ○○○ end for i = 1:length(a2)  ○○○ end for i = 1:length(a3)  ○○○ end for i = 1:length(a4)  ○○○ end の時に,for文を一つにまとめるにはどうすればいいですか?

  • プログラムについて(matlab)

    matlabで以下のプログラムを実行しているのですが、 グラフが表示されません。 何故でしょうか、、。 ----------------------------------------- t=10 for r=400:1:2000 %波長 if 400<= r <700 y= 18*t.^(0.75); elseif 700<= r <1050 y= 18.*t.^(0.75).*10.^(0.002.*(r-700)); elseif 1050<= r <1150 y= 90*t.^(0.75)*1*1; elseif 1150<= r <1200 y= 90.*t.^(0.75).*1.*10.^(0.018.*(r-1150)); elseif 1200<= r <1400 y= 90*t.^(0.75)*1*8; elseif 1400<= r <1500 y= 5600*t.^(0.25); end plot(r,y) end ------------------------------------------------------ お詳しい方よろしくお願いします.

  • MATLABで行列を配列に格納する方法

    MATLAB初心者で大変申し訳ありませんが、行列の格納の仕方がわからないので、投稿させていただきました。 for k = 1:1:10 k=k; t(:,:)=load(sprintf('test%5.5i.txt',k)); end 具体的に言いますと、上記のプログラムで、test00001~test00010.txtというファイルを任意の行列t(:,:)で読み込んでいるのですが、このt(:,:)をkと対応させて、例えばk=1の場合のtをt[1]、k=2の場合のtをt[2]などの配列に格納し、それを自由に呼び出し、計算を行いたいと考えております。 基礎がわかっていないためにどうしていいかわかりません。 宜しく御願いします。

  • 複数条件の番号付けについて

    「メーカー」「商品」「販売可否」のある行に対し、以下の条件付きで番号を1から振りたいと考えています。 条件1: メーカー及び商品が重複した行があれば、既に振られた番号にする 条件2: 販売可否が空白の場合は無視する 条件3: 同じメーカーが連続するように番号を振る 条件4: 元の表は並び替えなどの加工は出来ない 一応、添付画像のような形で実現は出来ています。 以下のような式を使っています。 (1)G4:G21 =IF(COUNTIF(C$3:C3,C4)=0,MAX(G$3:G3)+1,VLOOKUP(C4,C$3:G3,5,FALSE)) (2)I4:I21 =IF(COUNTIF(D$3:D3,D4)=0,MAX(I$3:I3)+1,VLOOKUP(D4,D$3:I3,6,FALSE)) (3)K4:K21 =IF(E4<>"",G4*1000+I4,"") (4)M4:M21 =INT(IF($K4<>"",SUMPRODUCT(($K$4:$K$21<>"")*($K$4:$K$21<=$K4)/COUNTIF($K$4:$K$21,$K$4:$K$21)),0)) (4)で算出される値を得るために、(1)(2)(3)の行を使っています。 ちなみにこの(4)の値を使って、B24:D37の表を作っています。 ※画像では省略していますが、メーカー・商品ごとの台数・金額合計の表になります。 この表で使っている式は以下の通りとなります。 (5)B26:B37 =IF(MAX(B$25:B25)+1>MAX($M4:$M21),"",B25+1) (6)C25:C37 =IFERROR(INDEX($C$4:$E$21,MATCH($B25,$M$4:$M$21,0),1),"") (7)D25:D37 =IFERROR(INDEX($C$4:$E$21,MATCH($B25,$M$4:$M$21,0),2),"") 質問としては、(4)を求める為に4列使っているものを減らせられないか、理想は1列ですがせめて2列に纏められないかと思っております。 何卒、宜しくお願い致します。

専門家に質問してみよう