アプリ版:「スタンプのみでお礼する」機能のリリースについて

縦に並んでる出勤データを日毎に横に並べ替えたいのですが簡単な方法はありますか。

「縦の出勤データを日毎に横に並べ替え」の質問画像

A 回答 (7件)

これもクエリを使えばできますけどね。


インデックス列を追加してからカスタム列で「下の値」を代入して
いけばいいです。

範囲をテーブル書式で取り込み(列名「列1」)
取り込んだ列をテキスト列に変換
インデックスを「0」からで追加
「シフト」列を追加

= Table.AddColumn(追加されたインデックス, "シフト", each if Text.Contains([列1], "曜日") then 変更された型[列1]{[インデックス]+1} else null)

他の列も同様。最終行だけ「6行下がない」時と「6行下に曜日が含まれ
る」時だけ表示させない設定に変更

Table.AddColumn(追加されたカスタム4, "早遅", each if List.Max(追加されたインデックス[インデックス])-6>=[インデックス] then if Text.Contains([列1], "曜日") then if not Text.Contains(変更された型[列1]{[インデックス]+6}, "曜日") then 変更された型[列1]{[インデックス]+6} else null else null else null)

最後に「null」の行を取り除いて 読み込めばおしまい。
「縦の出勤データを日毎に横に並べ替え」の回答画像7
    • good
    • 0

Q1


備考欄に記載事項がない場合でも空欄にするようにできないのでしょうか?
規則性がないとエクセルで処理するメリットが薄れます。

Q2
元データ自体を横に並べて出力できないでしょうか?
    • good
    • 0

19行くらいなら手でヤッたほうが早い。

    • good
    • 0

マクロになりますが以下のような物はいかがでしょうか?


(罫線などもコピーされるし日付データでもそのまま使えます)

Sub Sample()

Dim 元 As Long
Dim 先 As Long
 元 = 1
 Columns("C:I").Delete Shift:=xlUp
 Do While 元 < Cells(Rows.Count, 1).End(xlUp).Row
  先 = 先 + 1
  Range(Cells(元, 1), Cells(元 + 6, 1)).Copy
  Cells(先, 3).PasteSpecial Transpose:=True
  Cells(先, 9).Columns.AutoFit
  If Right(Cells(先, 9).Text, 3) = "曜日)" Then
   元 = 元 + 6
   Cells(先, 9).ClearContents
  Else
   元 = 元 + 7
  End If
 Loop
 Application.CutCopyMode = False
 Columns("C:I").Columns.AutoFit

End Sub

'※ もしうまく動かなければ「  If Right(Cells(先, 9).Text, 3) = "曜日)" Then」を
'「  If Right(Cells(先, 9).Text, 4) = "曜日) " Then」や
'「  If Right(Cells(先, 9).Text, 3) = "曜日)" Then」に変えてみて下さい。
    • good
    • 0

確認していただけますか?


・ A1、A7、A14セルの表示形式はどうなっていますか?
 ①「G/標準」
 ②「@」
 ③「d"("aaaa")"」
 ④ その他(実際の表示形式をご提示ください)
・ A1セルを選択した時に数式バーにはどのように表示されていますか?
 ⑤ セルに表示されている物と同じ
 ⑥「2019/12/1」のような日付が表示される
 ⑦「=○○」のような計算式が表示される
 ⑧ その他(実際に表示されている物をご提示ください)
    • good
    • 0

No.1です。



関数での方法をご希望だというコトなので・・・
無理やりやってみました。

↓の画像では、まずC1セルに
=IFERROR(INDEX(A$1:A$1000,SMALL(IF(ISNUMBER(FIND("曜日",A$1:A$1000)),ROW(A$1:A$1000)),ROW(A1))),"")

配列数式なので、Ctrl+Shift+Enterで確定!(←必須★)しておきます。

次にA列の「備考」の次の行はあっても1行だけという限定ですが、
D1セル(←配列数式ではありません)に
=IFERROR(IF(OR(COUNTIF(OFFSET(INDIRECT("A"&MATCH($C1,$A:$A,0)),COLUMN(A1),,1),"*"&"曜日"&"*"),OFFSET(INDIRECT("A"&MATCH($C1,$A:$A,0)),COLUMN(A1),,1)=""),"",OFFSET(INDIRECT("A"&MATCH($C1,$A:$A,0)),COLUMN(A1),,1)),"")

という数式を入れフィルハンドルでI列までコピー!
E1・F1セルの表示形式を好みの「時刻(時間)」にし
C1~I1セルを範囲指定 → I1セルのフィルハンドルで下へコピーすると
画像のような感じになります。m(_ _)m
「縦の出勤データを日毎に横に並べ替え」の回答画像2
    • good
    • 0

こんばんは!



A13の「早退」がなければすべての曜日に規則性があるようなので
関数で出来そうですが・・・

手っ取り早くVBAでの一例です。

尚、画像の配置通り
A列は1行目からデータがあり、B列は何も使っていなくてC列以降に表示するとします。

Sub Sample1()
 Dim i As Long, cnt As Long

  '//一旦C列以降を消去//
   Range("C1").CurrentRegion.ClearContents
    For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
     If InStr(Cells(i, "A"), "曜日") > 0 Then
      cnt = cnt + 1
      Cells(cnt, "C") = Cells(i, "A")
     Else
      Cells(cnt, Columns.Count).End(xlToLeft).Offset(, 1) = Cells(i, "A")
     End If
    Next i
   Range("E:F").NumberFormatLocal = "h:mm"
End Sub

とりあえずはお示しの画像のような感じになると思います。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます!
関数でのやり方も教えていただけたら嬉しいです。

お礼日時:2019/12/13 23:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!