[[20160124225727]] 『グループ数nの値を入力したら、そのグループ数で』(おさるさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『グループ数nの値を入力したら、そのグループ数で折り返してデータを大きい順に並べたいです。』(おさるさん)

まずグループ数nを入力します。
n=5 のと、下のようにしたいのです。

    A B C D E F G H I J K
 1  n= 5
 2 2  a    8  h  6  k  3  m  0  g
 3  6  b     8  o  5  j  2  a  0  p
 4  4  c     7  e  4  c  2  d
 5  2  d     7  l  4  i  1  f
 6  7  e     6  b  4  q  1  n
 7  1  f
 8  0  g
 9  8  h
10  4  i
11  5  j
12  6  k
13  7  l
14  3  m
15  1  n
16  8  o
17  0  p
18  4  q

つまり、B5に5が入力されたら、D2〜D6までで折り返して、
17個のデータを5グループに分かれるように表示させたいのです。
もしB1に4が入力されたら、D2〜D5の4つで折り返して、4グループです。

データ数の最大は1000で、
nの値は、2〜100です。

よろしくお願いします。

< 使用 Excel:unknown、使用 OS:unknown >


 >>B5に5が入力されたら

 B5 ?? B1 ですか?

 マクロでいいですかね。

 Sub Sample()
    Dim sv As Variant
    Dim j As Long
    Dim i As Long
    Dim n As Long
    Dim r As Range

    Application.ScreenUpdating = False
    n = Range("B1").Value

    With Range("A1").CurrentRegion
        .Offset(, 2).ClearContents
        Set r = .Offset(1).Resize(.Rows.Count - 1)
    End With

    sv = r.Formula
    r.Sort Key1:=Columns("A"), Order1:=xlDescending
    j = 4
    For i = 2 To r.Rows.Count Step n
        Cells(2, j).Resize(n, 2).Value = Cells(i, "A").Resize(n, 2).Value
        j = j + 2
    Next

    r.Value = sv

 End Sub

(β) 2016/01/25(月) 08:45


早速ありがとうございます。
やはり、マクロですよね。
マクロを使わずに関数で処理することはできますか?

(おさるさん) 2016/01/25(月) 10:12


 専門家さんなら可能だと思います。
 βのレベルなら、A:B列を並び替えたうえでの数式ならなんとかというところですかね。

 専門家さんからの回答をお待ちください。

(β) 2016/01/25(月) 10:34


 すまない。
 検証不足だった。

 ミスがあったためいったん削除する。

(ねむねむ) 2016/01/25(月) 10:51


 A列の数値内に文字列の数字が紛れ込んでいたため結果がおかしくなっていた。
 なので最初の書き込みを再掲。

 一応、関数で組み立ててみた。

 しかし

 >データ数の最大は1000で、 
 >nの値は、2〜100です。

 ということだと式をD2:ALO101の範囲に入れることになり、値を変更するたびに再計算が実行され時間がかかることになる。

 それでも良ければ。
 (作っておいてなんだがマクロのほうを進める。後々の変更なども含めて)

 一応前提条件としてはA列の数値は整数であること。
 また、1000件全部同じ数値ではないこと。

 また、C列を作業列に使う。
 (使わずに式を組み立てることもできるがそれだとさらに時間がかかる)

 C2セルに
 =A2+COUNTIF(A$2:A2,A2)/1000
 と入力して下へフィルコピー。

 D2セルに
 =IFERROR(IF(ROW(A1)<=$B$1,LARGE($A$2:$A$1001,INT((COLUMN(A1)-1)/2)*$B$1+ROW(A1)),""),"")

 E2セルに
 =IF(D2="","",INDEX($B$2:$B$1001,MATCH(D2+((COUNTIF(D$2:D2,D2)+IF(COLUMN(A1)>1,COUNTIF(C$2:$D$1001,D2),0))/1000),$C$2:$C$1001,0)))
 と入力してD2:E2を101行目までフィルコピー。

 その後D2:E101の範囲を選択してALO列までフィルコピー。

(ねむねむ) 2016/01/25(月) 11:03


ありがとうございました!
ちゃんとグループに分けてくれました。

本当はマクロの方がいいとのこと…
しかしまだマクロを使ったことがなく、ちょっと怖いのです、変かもしれませんが。

(おさるさん) 2016/01/25(月) 14:36


新たな問題が出てきたので、新しく別に投稿すべきか迷いましたが、
ねむねむさんの書いてくださった関数を使用しているので、ここに続きを書きます。

現状は、冒頭に示したように表示されているのですが、これと別バージョンをつくる必要も出てきました。
それは、偶数行を逆順に示すということです。
つまり、

    A B C D E F G H I J K
 1  n= 5
 2 2  a    8  h  4  q  3  m  0  p
 3  6  b     8  o  4  i  2  a  0  gp
 4  4  c     7  e  4  c  2  d
 5  2  d     7  l  5  j  1  f
 6  7  e     6  b  6  k  1  n
 7  1  f
 8  0  g
 9  8  h
10  4  i
11  5  j
12  6  k
13  7  l
14  3  m
15  1  n
16  8  o
17  0  p
18  4  q

といった感じで、F&G列とK&L列が小さい順になるようにしたいのです。
よろしくお願いします。

(おさるさん) 2016/01/29(金) 08:07


 関数で行う場合。

 現在のものがSheet1にある場合、新パターンのほうをSheet2に作る。

 ただし、Sheet2はSheet1を参照して表示するのでA列、B列はSheet1のほうに入力することになる。
 (単独で表示させる関数は思いつかなかった)
 つまり前回のものと今回のものは必ずセットで作られることになる。

 Sheet2のA1セルに
 =IF(Sheet1!A1="","",Sheet1!A1)
 と入力し、B列、1000行目までフィルコピー。
 これでSheet1のA列、B列がそのままSheet2に表示される。
 (C列の作業列は表示させても表示しなくてもどちらでもよい)

 次にSheet2のD2セルに
 =IF(MOD(INT((COLUMN(A1)-1)/2)+1,2)=1,Sheet1!D2,IFERROR(INDEX(Sheet1!D$2:D$101,SUMPRODUCT((Sheet1!D$2:D$101<>"")*1)-ROW(A1)+1),""))
 と入力して右および下へフィルコピーして見てくれ。

 Sheet2の方ではF:G列、J:K列は逆順で表示される。
(ねむねむ) 2016/01/29(金) 10:12

 追記

 Sheet2のA列、B列はあったほうがわかりやすいだろうということで表示させているだけなので、もし必要なければ
 >Sheet2のA1セルに
 >=IF(Sheet1!A1="","",Sheet1!A1)
 >と入力し、B列、1000行目までフィルコピー。
 >これでSheet1のA列、B列がそのままSheet2に表示される。
 は行わなくても問題はない。
(ねむねむ) 2016/01/29(金) 10:35

早速ありがとうございました。

試してみたところ概ねよかったのですが、???という部分がありました。
それは、よくみると、最初に質問したSheet1の部分に原因があるのかな?と思われました。
15 a 10 h 8 q 6 w 3 ag
14 b 10 i 8 r 6 x 3 ah
13 c 9 k 8 s 5 aa 3 ai
12 d 9 l 8 t 5 ab 3 aj
12 e 9 m 8 u 5 ac 3 ak
11 f 9 n 7 v 4 ad 2 al
10 g 9 o 6 w 4 ae 2 am
10 h 9 p 6 x 4 af 1 an

数字の部分だけ抜き書きしましたが、左側の列の末尾と右側の列の最初に同じ数字がくる場合に、
表示が変になってしまいます。

10のところは、本当は、ghij という順になるはずが、ghhiになり、
6のところは、wxyz となるところが、wxwxと、
左側に出てきた部分が重複する様に表示されてしまいますが、原因不明です。

また、後から質問した方では、上の表示で言えば、
10 h と 8 q の列だけが、8行で折り返すところが9行表示され、
#N/Aや、10 h などと表示されてしまいます。
これも原因不明です。

何度も申しわけありません。
よろしくお願いします。

 

(おさるさん) 2016/01/29(金) 15:45


 うーん、こちらで行ってみたところでは再現できず。

 一応確認だが再計算の途中ということはないだろうか?
(ねむねむ) 2016/01/29(金) 17:31

ひょっとすると、質問の際に単純化した表を示したからいけないのでしょうか…
試しの段階なので、小さい表にはしてありますが、一応、実際の表で言うと、

A列     ラベル1
B列     ラベル2
C列     ラベル3
D列     ラベル4
E〜N列   整数値のデータ

P〜Y列 E〜N列に対応した作業列

いずれも3行目からデータを表示させています。

AA列 グループ名
AB列 N列の上からn個のデータ
AC列 AB列のデータに対応したラベル3
AD列 AB列のデータに対応したラベル4
AE列 N列の上からn+1〜2n個までのデータ
AF列 AE列のデータに対応したラベル3
AG列 AE列のデータに対応したラベル4
そしてAH列以降はAB列以降と同じパターンです。

ちなみに、
AB3=IFERROR(IF(ROW(A1)<=$B$1,LARGE($N$3:$N$52,INT((COLUMN(A1)-1)/2)*$B$1+ROW(A1)),""),"")
AC3=IF(AB3="","",INDEX($C$3:$C$52,MATCH(AB3+((COUNTIF(AB$3:AB3,AB3)+IF(COLUMN($A1)>1,COUNTIF($Y$3:$z$52,AB3),0))/1000),$Y$3:$Y$52,0)))
AD3=IF(AB3="","",INDEX($D$3:$D$52,MATCH(AB3+((COUNTIF(AB$3:AB3,AB3)+IF(COLUMN($A1)>1,COUNTIF($B$3:$Y$52,z3),0))/1000),$Y$3:$Y$52,0)))

です。

何がいけないのでしょうか…

(おさるさん) 2016/01/30(土) 14:12


最初の質問の不具合は、私が式を変形し間違えたことがわかりました。

しかし、後の質問の逆順にする際に、
5つで折り返すところが、
6つめにデータとそれに対応するラベル3、ラベル4の表示部分に#N/Aが表示されてしまいます。

ちなみに、
AB3=IF(MOD(INT((COLUMN(A1)-1)/2)+1,2)=1,Sheet1!AB3,IFERROR(INDEX(Sheet1!AB$3:AB$52,SUMPRODUCT((Sheet1!AB$3:AB$52<>"")*1)-ROW(A1)+1),""))

です。

(おさるさん) 2016/01/31(日) 15:52


 とりあえず。

 エラーが表示されるということは「Sheet1!AB3」という参照部分で起きていると考えられる。
 (後半部分はIFERROR関数があるため)

 ということはSheet1のほうで#N/Aエラーが出ているのではないか?

 もっとも私の回答でエラーが出たかのように再質問しておいて、あとから「実は表の形がちがってて式も変形してました」
 と言われてもこちらで対処のしようがないが。
(ねむねむ) 2016/02/01(月) 09:11

表の詳細を確定させずに質問してすいません。
ねむねむさんの回答が原因ということではなく、
式の意味をきちんと理解できない私が悪いのです。

ただ、Sheet1では、#N/Aエラーは出ていません。
しかし、sheet2ではエラーがでますし、5つまで表示なのに6番目が表示されたりしてしまうのです。

ありがとうございました。
(おさるさん) 2016/02/01(月) 10:28


 >しかし、sheet2ではエラーがでますし、5つまで表示なのに6番目が表示されたりしてしまうのです。 
 そうであれば本当に書かれている式になっているのか?となるが。

 まず後半部分、順番を逆転させる部分はIFERROR関数で処理しているためその中の数式の結果がエラーになる場合は空白になり
 そもそもエラーが表示されない。

 残り前半部分(そのまま表示部分)は
 =Sheet1!AB3
 というSheet1のセルを参照して表示する部分のみ。
 ここでエラーが出るということは参照先のセルがエラーの場合しか思いつかないが。

 あと、
 >5つまで表示なのに6番目が表示されたりしてしまうのです。
 に関しては3行目から52行目(書かrている式から判断)に余計なデータがないだろうか?
 たとえば52行目が数式ではなくなにか備考みたいに文字などが入っているとか。
(ねむねむ) 2016/02/01(月) 10:49

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.