[[20190420164533]] 『シフト表から日付を指定しその日の出勤者を割り出』(かげやま) ページの最後に飛ぶ

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

 

『シフト表から日付を指定しその日の出勤者を割り出したい』(かげやま)

検索しこちらまでやってきました、
http://www.excel.studio-kazu.jp/kw/20100118144139.html#comment
を見て、一列だけの出勤者を再現することは出来たのですが、
もう少し便利にすることは可能でしょうか…

A列(A2以下)に勤務しているものの名前、
1行目(B1:AF1)に日付が。
表内には早、遅、休が入力されています。
イメージとしては以下です。

   12345…
Aさん 早遅休早早…
Bさん 遅休遅早早…
Cさん 休早早休遅…

ここから、同じワークシート内に

=TODAY()の早出⇒●さん
=TODAY()の遅出⇒○さん
=TODAY()の休 ⇒◎さん

と表示することは出来るでしょうか?
それぞれのシフトが一人とは限らない場合もあります。

どなたかお力お貸しくださると幸いです
どうぞよろしくお願いします

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 こんばんは ^^ つくってみました。
Dateにプラスマイナスして様子みてください。
Option Explicit
Sub main()
    Dim Bary, 早, 遅, 休
    Dim i As Long
    Dim X As Long
    Dim Td As Date
    With Worksheets("Sheet1")
        Bary = .Range("A1").CurrentRegion
        Td = Date
        X = WorksheetFunction.Match(Format(Td, "yyyy/m/d"), WorksheetFunction.Index(Bary, 1, 0), 0)
        For i = 2 To UBound(Bary, 1)
            Select Case Bary(i, X)
                Case "早"
                    早 = 早 & Bary(i, 1) & ","
                Case "遅"
                    遅 = 遅 & Bary(i, 1) & ","
                Case "休"
                    休 = 休 & Bary(i, 1) & ","
            End Select
        Next
        MsgBox Td & " の早出は" & Left(早, Len(早) - 1) & Chr(10) & _
               Td & " の遅出は" & Left(遅, Len(遅) - 1) & Chr(10) & _
               Td & " の休は" & Left(休, Len(休) - 1)
    End With
End Sub
(隠居じーさん) 2019/04/20(土) 18:55

 A列には何行目まで名前が入力されているのか
 結果を同じシートのどこに表示したいのか
 分かるように質問してください。

 A2:A10に名前
 結果表示は13行目から

	A	B	C	D
13	早			
14	遅			
15	休			

 A13:A15には 早、遅、休 とだけ入力

 B13 =IFERROR(INDEX($A:$A,SMALL(IF(INDEX($B$2:$AF$10,0,DAY(TODAY()))=$A13,ROW($A$2:$A$10)),COLUMN(A1))),"")

 Ctrl+Shift+Enter で確定し、右と下にコピー

 COLUMN(A1) はA1セルの値とは関係ありません。変更しないように。

 以上、参考まで
(笑) 2019/04/21(日) 12:06

»隠居じーさんさん

マクロでの設定ありがとうございました、設定してみたのですが、
実行してみると、構文エラーが出てしまいました
Select Case Bary(i, X)がドラッグされた状態になり、
Sub main()が黄色でハイライトされました。。
ううむ、難しいです、ありがとうございます!!

»(笑)さん
すみません、、詳細にお伝えした方が良かったですね
表示する場所も特にこだわりありませんでした
成員は11人となっています
こちらでA12まで入力したものでやってみたところ表示すること出来ました!
ありがとうございます!!

追加の質問となってしまうのですが、これを翌日のもので出すことも出来ますか?
DAY(TODAY())の部分をDAY(TODAY()+1)やDAY(TODAY())+1、
別のセル(AF17)に前記したもの入力したものを入力など試したのですが、
+1がつくと途端にIFERRORのエラーの場合の値である空白になってしまいます。

もし可能であれば教えていただけると幸いです。
(かげやま) 2019/04/22(月) 17:07


自己解決致しました(応急的ではありますが…)

早・遅・休・QのなかでQだけに上記のエラーが出ていたようだったので
暫定的にQ=きというふうにひらがなに置換したところ+1をしても動いてくれました!!

アルファベットで出来る方法あれば楽なので、
お助け頂けたら何よりです!!

よろしくお願いします

(かげやま) 2019/04/22(月) 17:27


お役に立たなかったみたいで済みません。
>>構文エラー
ですか?
エラー番号なんか解りますでしょうか。
あと
日付欄は文字列でしょうかシリアル値でしょうか。
後学の為お教えいただければ幸いです。 m(_ _)m
(隠居じーさん) 2019/04/22(月) 18:23

 処理対象シート名 Sheet1 です。
      A      B        C        D        E        F        G       
   1  氏名    4月1日   4月2日   4月3日   4月4日   4月5日   4月6日 ....4月30日
   2  A2     休       休       遅       遅       早       早      
   3  B3     遅       遅       早       早       早       休      
   4  C4     早       早       早       休       休       遅      
   5  D5     休       遅       遅       早       早       早      
   6  E6     遅       遅       早       早       早       休      
   7  F7     遅       早       早       早       休       休      
   8  G8     早       早       早       休       休       遅      
   9  H9     早       早       休       休       遅       遅      
  10  I10    早       休       休       遅       遅       早      

 上記表を使用、日付欄はシリアル値です。。。で一応、動作確認はしてあるのですが。
どこか相違点等、御座いますでしょうか。
(隠居じーさん) 2019/04/22(月) 18:30

»隠居じーさんさん

今データ触れる状況でなく、エラー番号は明日以降確認させていただければと思いますm(_ _)m
すみません。。
日付欄、表示は日付(4/1)になっていますが
標準ですと数字の羅列になっていたのでシリアル値での入力になっているはずです

マクロは連続印刷くらいでしか(これもおおよそコピペさせて頂きました)
使ったことがなく…
あとは簡単なマクロ記録くらいですね
自分で組むというのはとてもとても…勉強になりますありがとうございます

無知に等しいのでヘルプもきちんとできているかわからずご迷惑おかけしていると思います
お付き合い頂きありがとうございます!

(かげやま) 2019/04/22(月) 18:39


私の単純な入力ミスの可能性もありますかね…
明日確認してみようと思います、ありがとうございますm(_ _)m

拝見いたしました、使用したい表と相違ないです
なのでますます私の入力ミスの可能性がたかまりましたかね…

(かげやま) 2019/04/22(月) 18:42


 >>なのでますます私の入力ミスの可能性がたかまりましたかね…
 いえ、
とんでもないです。私のミスかもしれませんです。
後ほど、一部変更し、アップいたします。よろしければ、
お手すきの時にでもお試しください。
m(_ _)m
(隠居じーさん) 2019/04/22(月) 18:52

 標準モジュールへコピペしてください。
一部、日付の検索方法を変えてみまし
た。エラー処理も入れてみましたので、
もし表示されるメッセージが有れば、
教えて下さい。一応、自己解決された、
とのことですし、何かと御多忙の事と
ご推察いたしますので、ご興味が御有
りなら、お手すきのときにでも、で結
構でございます 。。。 でわ m(_ _)m

 Option Explicit
Sub Sample02()
    Dim Bary, 早, 遅, 休
    Dim i As Long
    Dim X As Long
    Dim Td As Date
    Dim r As Range
    Dim rr As Range
    With Worksheets("Sheet1")
        Bary = .Range("A1").CurrentRegion
        Td = Date
        Set rr = .Range(.Range("B1"), .Cells(1, .Columns.Count).End(xlToLeft))
        On Error GoTo err01
        For Each r In rr
            If CDbl(Td) = CDbl(r.Value) Then
                X = r.Column
            End If
        Next
        For i = 2 To UBound(Bary, 1)
            Select Case Bary(i, X)
                Case "早"
                    早 = 早 & Bary(i, 1) & ","
                Case "遅"
                    遅 = 遅 & Bary(i, 1) & ","
                Case "休"
                    休 = 休 & Bary(i, 1) & ","
            End Select
        Next
        MsgBox Td & " の早出は" & Left(早, Len(早) - 1) & Chr(10) & _
               Td & " の遅出は" & Left(遅, Len(遅) - 1) & Chr(10) & _
               Td & " の休は" & Left(休, Len(休) - 1)
    End With
    Set rr = Nothing
    Erase Bary
    Exit Sub
err01:
    If err.Number = 13 Then
        MsgBox "日付の値が異常です"
    ElseIf err.Number = 9 Then
        MsgBox "指定日付が存在する範囲を超えています"
    Else
        MsgBox "原因不明のエラーです" & err.Number & err.Description
    End If
    On Error GoTo 0
    Set rr = Nothing
    Erase Bary
End Sub
(隠居じーさん) 2019/04/22(月) 20:29

 >Qだけに上記のエラーが出ていた

 同じ「Q」でも当日は問題なく、翌日分だけが表示されないということ?

 そんなことはないと思いますけどね。
 実際こっちでも試してみましたが、当日も翌日も表示されます。
 もう一度、確認してみてください。
 
「Q」だと当日も翌日も表示されない、ということなら
 全角と半角の違いとかが考えられます。

 ■重要な補足&確認

 ・例えば今日が22日なら、その式は、何月とかに関係なくB列から数えて22列目を検索しています。
  1行目の日付は見てません。
  つまり、今日は5月なのに、元のシフト表は4月のまま、なんてことは想定していない、ということ。

  問題ありますか? あるのなら修正案を提示しますけど。

 ・上記と関連しますが、翌日分の表示は
  DAY(TODAY())+1 としてください
  DAY(TODAY()+1) ←はダメ!!!

  今日が4月30日だとすると、翌日の場合、後者は「1」になり、B列の4月1日を検索してしまいます。

 ・上記に関連しての確認
  今日が4月30日のような月末なら、翌日分はどうなればいいんですか?

 以上です
(笑) 2019/04/22(月) 22:12

コメント返信:

[ 一覧(最新更新順) ]


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