入退室ログから出社時刻、退社時刻を抽出する方法

このQ&Aのポイント
  • 1カ月分の入退室ログの元データから、各日の一番早い時刻を出社時刻、一番遅い時刻を退社時刻として個人別の勤務表データを作る方法を紹介します。
  • 元データをExcelのマクロを使って処理することで、出社時刻と退社時刻を抽出し、別のシートに出力することが可能です。
  • 出社時刻と退社時刻のデータを抽出する際には、操作者と時刻の情報を組み合わせて処理を行います。
回答を見る
  • ベストアンサー

入退室ログから出社時刻、退社時刻を抽出したい

1カ月分の入退室ログの元データから、 各日の一番早い時刻を出社時刻、一番遅い時刻を退社時刻と みなして個人別の勤務表データを作ろうと思います。 EXCELのマクロで実現可能でしょうか? どなたか親切な方、プログラミング方法を教えてください<(__)> 元データをsheet1に、ボタンクリックで、別シートに出力できるのが理想です。 <元データ> 操作者,時刻 太郎さん,2011/12/1 8:10 花子さん,2011/12/1 8:40 太郎さん,2011/12/1 8:55 花子さん,2011/12/1 12:05 太郎さん,2011/12/1 15:22 太郎さん,2011/12/1 17:59 花子さん,2011/12/1 18:30 太郎さん,2011/12/1 21:10 花子さん,2011/12/2 8:22 太郎さん,2011/12/2 8:58 太郎さん,2011/12/2 11:00 花子さん,2011/12/2 12:01 太郎さん,2011/12/2 15:39 太郎さん,2011/12/2 17:01 太郎さん,2011/12/2 18:02 花子さん,2011/12/2 19:55 太郎さん,2011/12/3 9:02 ・ ・ <output> 太郎さんの出社時刻,退社時刻 2011/12/1 8:10,2011/12/1 21:10 2011/12/2 8:58,2011/12/2 18:02 ・ ・

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

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.3

このケースならVBAで対応するより関数で表示したほうが簡単かも知れません。 データが1000行目までに入力されており、開始年月日がD1セル、名前がE1セルに入力されているなら、以下の式を入力して下方向にオートフィルしてください。 出社時刻 =MIN(INDEX((($A$2:$A$1000<>$E$1)+(INT($B$2:$B$1000)<>$D$1+ROW(A1)-1))*100000+$B$2:$B$100,)) 退社時刻 =MAX(INDEX((($A$2:$A$1000=$E$1)*(INT($B$2:$B$1000)=$D$1+ROW(A1)-1))*$B$2:$B$1000,)) 該当データがない場合、空白表示する必要があるなら、セルの書式設定で表示形式をユーザー定義にして以下のように入力して下さい。 [>50000]"";[=0]"";yyyy/m/d h:mm

yunachie
質問者

お礼

ご回答ありがとうございます。 頂いた関数で試してみたのですが、退社時刻はばっちり出たのですが、 なぜか出社時刻は#N/Aと表示されてうまくいきません。 ご教授いただけるとありがたいです。 よろしくお願いします。

その他の回答 (2)

  • MRT1452
  • ベストアンサー率42% (1392/3296)
回答No.2

作り方は色々あると思いますが、可能です。 VBAマクロでという事なので結構力技に派なると思いますが。 ぱっと考えて、 人と日付で二重ループにして、チェックですかね。 ちょっとしたテクとして、メインの処理をする前に、 操作者を第1ソートキー、,時刻を第2ソートキーとして並べ替えをする処理を入れると良いかと。 そうすする事でデータが並んでいるという前提でメインのマクロを組めるので、考えやすくなります。 例えば作業者の現在の行と1つ前の行のデータが違えば、その作業者のデータは終わりというような判断が出来るようになります。 バラバラだとまた最初から舐めていく必要が出てきますが、並べ替えて判定させれば最初からやり直す必要も無いので、 処理時間が短くなることも期待できます。 また時間も並べかえることで同様に日の区切りも判定できますし、 その中で頭と終わりを抜けば、その日の最初と最後となります。 ※あくまで机上論です。

yunachie
質問者

お礼

ご回答ありがとうございます。 考え方は理解できました。 私自身、VBAマクロがわかってもいないのに、 それを指定したのが間違いだったと気がつきました。 ありがとうございます。

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.1

下記でどうでしょう outputは勉強と思って自分でアレンジしてください。 ---- Sub test1() Dim strSql As String Dim cn As Object Dim rs As Object Const adOpenForwardOnly = 0 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") With cn .Provider = "MSDASQL" .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _ "DBQ=" & ThisWorkbook.FullName & "; ReadOnly=True;" .Open End With strSql = "Select " _ & " 操作者 " _ & " ,format(時刻,'yyyymmdd') as 日付 " _ & " ,min(format(時刻,'hh:nn')) as 出社 " _ & " ,max(format(時刻,'hh:nn')) as 退社 " _ & "From [Sheet1$A1:B18] " _ & "group by 操作者, format(時刻,'yyyymmdd') " ' Debug.Print strSql rs.Open strSql, cn, adOpenForwardOnly Worksheets("sheet2").Cells(1, 1).Value = "操作者" Worksheets("sheet2").Cells(1, 2).Value = "日付" Worksheets("sheet2").Cells(1, 3).Value = "出社" Worksheets("sheet2").Cells(1, 4).Value = "退社" Worksheets("sheet2").Cells(2, 1).CopyFromRecordset rs rs.Close Set rs = Nothing cn.Close Set cn = Nothing MsgBox "Sheet2に出力しました" End Sub

yunachie
質問者

お礼

早速のご回答ありがとうございました。 頂いたコードで試してみたのですが、 [Microsoft][ODBC Driver Manager]パラメータが少なすぎます。2を指定してください。 が出てどうしていいかわからなくなり挫折してしまいました。

関連するQ&A

  • Excel(マクロ?VBA?)で最大日付の行を抽出

    Excelのデータ抽出で困っております。 下記のようなデータがあり、各IDの最大日付の行を抽出しようとしていますが、抽出方法がわからず、困っています。  氏名  ID   日付   山田太郎 10 2012/12/01 山田太郎 10 2013/08/01 山田太郎 10 2014/12/01 山田太郎 10 2015/08/01 山田花子 20 2012/12/01 山田花子 20 2013/08/01 山田花子 20 2013/12/01 この際に、 山田太郎 10 2015/08/01 山田花子 20 2013/12/01 という2つの行を抽出したいですが、抽出方法がわかりません。 関数を使ってやろうとも思いましたが、関数をどれを使えばいいかわかりません。 別シートに抽出でも全く問題ありませんので、恐れ入りますが、抽出方法を教えてください。 よろしくお願いいたします。

  • シート内の抽出について(Excel)

    シート内の抽出について(Excel) シート内に同じ文字列が複数存在するデータから抽出して使用したいのですが、ご存知の方おりましたら教えていただきたいのですが。 例    A   B   C   D  1 001  ABC 500  太郎 2 001  ABC 200  花子 3 001  ABC 150  太郎 4 002  DEF 500  次郎 5 002  DEF 200  三郎 6 002  DEF 150  次郎 7 002  DEF 100  次郎 このようなシートがあったとしますと 抽出条件として ’001’ とした場合 番号:001    A   B   C   D  1 001  ABC 500  太郎 2 001  ABC 200  花子 3 001  ABC 150  太郎 このように他のシートに抽出できればベストなのです。 データーが膨大なものでオートフィルターで抽出しコピー&ペーストでは時間がかかり過ぎてしまいます。関数でなんとかなればと思っておりますがお知恵をかしていただけないでしょうか?

  • エクセルについて

    エクセルについて、 山田太郎  150 154 155 156 佐藤花子  151 153 158 高橋二郎  152 159 162 163 164 165    : (それぞれ別のセルに入力) というようなシート(1)の横書きのデータをもとにして、別のシート(2)の 150 151 152 153 154 : という縦書きの数列の横に、シート(1)の対応する名前 150 山田太郎 151 佐藤花子  152 高橋二郎 153 佐藤花子 154 山田太郎  : を表示させる方法をご教授願います。 実際のデータはシート(1)、シート(2)ともに膨大なデータのため、手作業の処理は 困難な状況です。 よろしくお願いいたします。m(_ _)m

  • Excel関数である条件に満たしたものを抽出

    Excel関数である条件に満たしたものを別シートに抽出したいのですが たとえばsheet1に A   B    C ID  名前   条件フラグ 101  太郎   1 102  花子   3 103  一郎   2 104  二郎   3 というデータがあってここから 条件フラグが「3」のものだけをsheet2に抽出したいのですが オートフィルタではなく関数で処理をしたいと思います。お分かりの方、ご教授ください。

  • VBAを利用した抽出の仕方を教えてください!

    知恵をおかしください。 sheet1に以下の残業時間早見表があるとします。 A列  B   C  D  /  18:00 19:00 20:00 8:30  1   2   3 9:00  0.5  1.5  2.5 9:30  0   1   2 縦軸を出社時間で横軸を退社時刻として、 SHEET2のA列に出社時間とB列に退社時間を入力すればC列に残業時間がsheet1から条件にあった値を抽出して表示させるようにしたいです。 『例えば、9時に出社して19時に退社したら1.5時間残業したと自動表示されるといったような・・・』 マクロやVBAを利用してやる方法を教えてください。お願いします。

  • 【EXCEL VBA】データの並べ替えの方法

    元データが左から右へ氏名コード、日付(2011/5/1)、出社時刻、退社時刻、日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻、と順に1ヶ月分入力されています。(画像上) このデータを一番左端に氏名コード、上から日付(2011/5/1)、出社時刻、退社時刻、行を変えて日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻。(画像下)と言う形に行・列の並べ替えをしたいと考えています。 EXCELの機能である、「コピー→編集→形式を選択して貼り付け→行列を入れ替える」では対応できず、VBAマクロ又は関数で試みようとしましたが、こちらも対応方法が見つかりません。 何かいい方法がございましたら、ご指導のほど宜しくお願い致します。 尚、作業環境はWindows7、MS office2010です。 

  • エクセルの抽出結果表示について。

    こんばんは。 エクセルのピポットテーブルを利用し、集計表を作成しています。 そこで質問なのですが、シート(1)には、   A      B     C    D 1 伝票番号 お客様名 品名  数量 2 123   山田太郎 りんご 10 3 123   山田太郎 みかん 12  4 123   山田太郎 レモン  9 5 125   山田花子 りんご 11 6 125   山田花子 メロン  6 7 139   川田昭子 なす   5 8 139   川田昭子 トマト  6       ・       ・        ・ というような、データが入力されているとします。(日々入力されていく為、何千行になることも・・・) シート(2)には、このシート(1)より伝票番号からデータを呼び出し、順番に下の行に表示を加えいきたいのです。 そして、このシート(2)のデータを基にピポットテーブルを作成し、集計表を完成させたいのです。 いまは、シート(2)のような内容を2度手間のように、入力し集計表を作成しています。 ただシート(1)のような全体分のデータはあるので、利用したいし、手間を省きたいのです。 マクロとかになるのですかね? (あまり分からないけれど・・・) VLOOKUP関数を利用しようとしたのですが、例のように、同じ伝票番号に対して、複数行のデータがあるため、1行しか表示できないのです。 なにか、いい方法はありますか?

  • ピボットテーブル

    エクセルで次のようなデータがあります。 日にち 氏名 時間 1  太郎 18:00 1  花子 19:00 3  太郎 20:00  これを次のようなシートにする方法をお教えください。 日にち 太郎  花子 1   18:00 19:00 2 3   20:00 つまりデータのない日にちも表示したいんです。 ピボットテーブルでは2日が表示されません。 よろしくお願いいたします。

  • エクセルで条件に合ったデータ抽出・自動更新

    エクセルで条件に合ったデータが別のセルに自動に書き出され、元データの更新に応じいつも更新されるようにしたいのです。 A列   B列     C列   D列 No.   会員名   条件1  条件2 1     山田花子  ○    ○ 2    田中太郎  ○   (空白)              ×    ○              (空白) ○ 会員は200人くらい、上記のように条件は4種類です。 この表の外(できれば別シート)に条件が○○の人の名前がずらり、 ×○の人の名前がずらり、というように それぞれの条件に合った人の名前だけが表内の順序どおりに書き出され、 元データを更新すると、条件ごとに書き出した名前も 自動的に(または更新ボタン一つで、) 更新されるようにしたいのです。 マクロはできません どうしたらいいですか?

  • 【Excel】指定する項目のみ集計したい

    はじめまして。 書籍やネットで調べてみたのですがどうしても分からず質問させて頂きました。 Excelにおいての集計に関する質問です。 sheet Aには以下のようなデータがあったとします。 山田太郎:りんご :1 山田花子:さくらんぼ :1 山田花子:バナナ :1 山田太郎:みかん :1 山田太郎:新幹線 :1 山田太郎:パパイヤ :1 山田花子:消防車 :1 山田太郎:電車 :1 山田太郎:キウイ :1 このデータの果物だけの個数をsheet Bに名前ごとに集計は可能でしょうか 山田太郎:6 山田花子:3 ではなく、 山田太郎:4 山田花子:2 のように。 ちなみに、集計したい項目の果物のリストは、sheet Cにあります。 フィルターをかけて、必要のないデータを集計から除外しようとしましたが、データ量が膨大なため難しいです。 各データ項目の横に数値の1があるため、それを用いsumifs関数も試しましたが、果物のリストの部分でうまく条件指定ができず、上手く行きませんでした(0になりました。) 拙い説明で申し訳ございませんが、何卒ご教示頂けますと幸いです。 よろしくお願い致します。

専門家に質問してみよう