- ベストアンサー
エクセル 関数 曜日別データの並び替え
エクセルの関数で曜日別データの並び替えを教えてください 月 100 火 90 水 -10 木 -20 金 30 月 120 水 150 金 -120 のデータを 月 火 水 木 金 100 90 -10 -20 30 120 150 -120 のように並び替えたいです
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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)),"")として縦横にコピー
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
月 火 水 木 金 月 水 金 火 木 金 とあったとき、後(下)の火は第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 実際はーのセルは空白です。
お礼
ありがとうございます VBA マクロ勉強してみます
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 横からおじゃまします。 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
お礼
解説もありがとうございます
- mu2011
- ベストアンサー率38% (1910/4994)
一例です。 仮にデータが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))),"")
お礼
回答ありがとうございます 追加で教えてください 月 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 のように未データの時に空白をつくれませんでしょうか?
お礼
ありがとうございます