- 締切済み
表
C,E,G列の数字を右のように縦一列に並べたいです。ご教授お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
何度も別質問にも同じような質問をしているが、このことが必要な場面が、小生には想像ができない。 普通は、金や人員や個数などを問題にする、事務系の処理では、現れそうにないが、どんな時にこういうことが必要なのか。研究のため?それを書いておいてくれれば、他の方法を考え、提案してくれる場合もあろう。 ーー こいういう課題は、関数では不得意な分野と思う。なぜなら、直前に見つかった行について、変数にその行番号を記憶できないからだ。 VBAならそういうのは、当たり前のやり方だが。 関数で処理すると、不可能ではないにしても、回答の関数式は、質問者には、理解できないのではないか。 また配列数式による回答が出ても、経験ないだろうから、分かるかな。 VBAでやると、考え方は単純なのだか、質問者には、受け付けないだろうね。 しかし、上記を言うだけでは、と思って、今後の人のためにも(他の人のGoogle照会でも、この質問が出る可能性は多い)、参考に上げておく。 例データ 第5行以下に適当にセルに「●」を入れる。 下記をコピーして、 開発ー挿入ー標準モジュールで出た画面に 貼りつける。 VBAコード Sub test03() Range("m2:q1000").Clear '--結果を出す列のセルの初期設定 c = 13 '結果をL列以右列に出す l = 2 '第2行目から結果を書きだし '-- For j = 1 To 6 Step 1 'データは、A-H列までとする s = 5 'データ処理列での探索範囲の先頭セルは第5行目からとする 'その列で●の数を数える n = Application.WorksheetFunction.CountIf(Range(Cells(1, j), Cells(1000, j)), "●") MsgBox j & "= " & n mr = 5 '今回見つかった、1回前の見つかった行番号 For k = 1 To n 'その列で●の見つかった個数だけ繰り返し r = Application.WorksheetFunction.Match("●", Range(Cells(mr, j), Cells(1000, j)), 0) mr = mr + r MsgBox mr Cells(l, c) = r - 1 l = l + 1 s = mr + 1 Next k c = c + 1 '隣列処理へ l = 2 '第2行目から結果を書きだし Next j '次の列の処理へ End Sub そしてファンクションキーの「F5」(実行キー)を押す。 シートのM,N・・列に数字が出る。 上記では、あえてエクセル関数のよく使うCOUNTIFとMATCH関数を使ってみたもの。 ーー 結果 A B C D E F 1 2 0 4 3 1 0 0 3 3 3 1 5 5 5 5 3 7 4 4 3 3 2 3 - - - - 1 3 A,B・・Fの文字は手抜きで、入力した。 == ここで言いたいことは、上記のVBAコードの中で、「mr」(この名前は特に意味なし)という変数を使って、次の行の処理の時に、●の見つかった、間隔の行間隔数を計算するために、作って、一時保存して、使っていることである。 関数なら、作業列を使うに相当すると思うが、初心者は、過去の経験から、作業列を使わない方法をと所望する。すると回答は、すぐには理解できない複雑な式になるが、コピペしたら、それなりに、答えが出るので、「ありがとう」、で済ませている。
- mt2015
- ベストアンサー率49% (258/524)
作業列を使って…… セルM5に↓の式を入れ、下方向に必要なだけコピー(これが作業列) =IF(C5<>"",MAX(M$4:M4)+1,"") セルI3に↓の式を入れ、下方向に必要なだけコピー =IFERROR(INDEX(C:C,MATCH(ROW(A1),M:M,0)),"") J列、K列用は上記を参考に -- 作業列を使わずにやるなら セルI3に↓の式を入れ、Ctrl+Shit+Enterで配列数式として確定し、下方向にコピー。 =IFERROR(OFFSET(C$1,SMALL(IF($C$5:$C$33<>"",ROW($C$5:$C$33)),ROW(A1))-1,0),"") J、K列の式は上記の式のCをそれぞれE、Gに変更して使用します。 初心者であれば作業列使用の方をお勧めします。
お礼
失礼しました。回答ありがとうございます。