• ベストアンサー

エクセル 関数 曜日別データの並び替え

エクセルの関数で曜日別データの並び替えを教えてください 月 100 火 90 水 -10 木 -20 金 30 月 120 水 150 金 -120 のデータを 月   火   水   木   金 100  90   -10   -20   30 120  150            -120 のように並び替えたいです

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

NO1です。 >未データの時に空白をつくれませんでしょうか?  ⇒「月」開始の反復データに限りますが、次の方法は如何でしょうか。   ・データ列はA・B列   ・C1に=A1&COUNTIF($A$1:A1,"月")として下方向にコピー   ・D2に「1」開始の連続データを設定   ・E1:I1に「月~金」を設定   ・E2に=IF(COUNTIF($C:$C,E$1&$D2),INDEX($B:$B,MATCH(E$1&$D2,$C:$C,0)),"")として縦横にコピー

hage2010
質問者

お礼

ありがとうございます

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

月 火 水 木 金 月 水 金 火 木 金 とあったとき、後(下)の火は第3週だと割り出すのが難しいのでは。 ーー 関数では表のくみかえが複雑になる。 また上記の本質問特有の難しさもあるので VBAでやってみた。 Sub test01() r = 1 m = 99 '第2行目で必ず逆転するコードをセット。mは前行の曜日コードを保持する変数 Set sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") d = sh1.Range("A54436").End(xlUp).Row 'Sheet1のデータ最終行取得 For i = 2 To d '全行で繰り返し wd = sh1.Cells(i, "A") 'A列のそのセルのセルの値 p = InStr("月火水木金", wd) 'その曜日は何番目か。曜日コードのようなもの If p < m Then '曜日コードが逆転したら次週扱い r = r + 1 'Sheet2へ書きだす行を1行下へ下げる End If c = Sh2.Range("A1:E1").Find(wd).Column 'その曜日はどの列か見つける Sh2.Cells(r, c) = sh1.Cells(i, "B") 'Sheet1のB列からSheet2の第r行,c列セルへデータをセット m = p '直前の曜日コードにして、次行に備える Next End Sub ーーー 例データ Sheet1 A2:B12 月 100 火 90 水 -10 木 -20 金 30 月 120 水 150 金 -120 火 10 木 20 金 30 実行結果 Sheet2 A1:E4 月 火 水 木 金 100 90 -10 -20 30 120 ー 150 ー -120 ー 10 ー 20 30 実際はーのセルは空白です。

hage2010
質問者

お礼

ありがとうございます VBA マクロ勉強してみます

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 横からおじゃまします。 No.1様の補足に >未データの時に空白をつくれませんでしょうか? とありますが、Excelは第何週という概念がありません。 曜日がシリアル値であればWEAKNUM関数で処理は可能だと思いますが、 ご質問の内容では直接曜日を入力されているかと思われます。 その場合の無理矢理の方法の一例です。 尚、毎週必ず「月」はある!という前提ですので、仮に「月」がなければ先ほど書いたようにシリアル値で処理しなければならないかと思います。 ↓の画像のようにSheet1に作業用の列を2列設けています。 作業列1のC2セルに =IF(A2="","",COUNTIF($A$2:A2,$A$2)) 作業列2のD2セルに =A2&C2 という数式を入れ、C2・D2セルを範囲指定しD2セルのフィルハンドルで下へずぃ~~~!っとコピーしておきます。 そしてSheet2のA2セルに =IF(ISERROR(INDEX(Sheet1!$B:$B,MATCH(A$1&ROW(A1),Sheet1!$D:$D,0))),"",INDEX(Sheet1!$B:$B,MATCH(A$1&ROW(A1),Sheet1!$D:$D,0))) という数式を入れ、列方向と行方向にオートフィルでコピーすると画像のような感じになります。 他に良い方法があればごめんなさいね。m(__)m

hage2010
質問者

お礼

解説もありがとうございます

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

一例です。 仮にデータがA1:B100、D1:H1に曜日を設定、D2に以下の配列数式(入力完了時にshift+ctrl+enterキーを同時押下)を設定して縦横にコピー =IF(COUNTIF($A$1:$A$100,D$1)>=ROW(A1),INDEX($B:$B,SMALL(IF($A$1:$A$100=D$1,ROW($A$1:$A$100),9999),ROW(A1))),"")

hage2010
質問者

お礼

回答ありがとうございます 追加で教えてください 月 100 火 90 水 -10 木 -20 金 30 月 120 水 150 金 -120 月 125 火 160 水 180 木 190 金 -240 のデータを 月   火   水   木   金 100  90   -10   -20   30 120  150           -120 125  160  180   190  -240 のように未データの時に空白をつくれませんでしょうか?

関連するQ&A