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

Access2003で時間外労働時間の管理しようと思っています。

私のAccessのレベルは
「Microsoft Office Specialist Access2002」を取得していますが
実務では作成した事が無くペーパードライバーといった所です。
SQLやVBAは触り程度の理解しかありません。

現在Excel2003で管理している時間外労働時間の管理をAccess2003に移行しようと思っています。
【現在のExcelイメージ】
---------------------------
氏名コード | 氏名 | 2月分
-------------------------------------------------------------
日付 | 休日区分 | 平日(普通) | 平日(深夜) | 休日(普通) | 休日(深夜)
-------------------------------------------------------------
2/11 |   
2/12 | 休日 |
2/13 | 休日 |
 ~ |  
3/08 |  
3/09 | 休日 |
3/10 |  
-------------------------------------------------------------
合計

人別に毎月11日~翌月10日までの枠を設け
毎月50名分程度の表を作成しています。
尚、一部の部署はシフト制の為、休日区分を設ける必要があります。
シフトの状態を把握し易くし平日・休日の間違いを無くす為に
時間外あるなしに関わらず毎月11日~翌月10日までの全ての日に対し入力項目を用意したいです。

最終的には従業員毎の1ヶ月分の合計数字を一覧表で出したいのですがExcelでは出来ないような気がしてきました。。。
Accessならそういった集計も可能かなと思い作成してみようと思いました。
単純に時間外が発生した日だけを都度日付と共に入力していくならば簡単に作成出来たのですが、入力フォームを上記Excelのように1ヶ月分の日にち全てとなると行き詰ってしまいました。。。

説明不足等あるかもしれませんが
何か良いアドバイスありましたらお願い致します。m(_ _)m

A 回答 (4件)

最後に



この記述で動くものは確認できたでしょうか。

それだけが心配です。
    • good
    • 0

つづき



' 表示対象範囲(日付)生成
'
Public Sub MakeMonthDays(dt As Date)
  Dim rs As New ADODB.Recordset
  Dim wdt As Date
  Dim iDayCount As Integer
  Dim i As Integer

  wdt = DateValue(Format(dt, "yyyy/mm/01"))
  iDayCount = DateDiff("d", wdt, DateAdd("m", 1, wdt))
  CurrentProject.Connection.Execute "DELETE * FROM T_月日;"
  rs.Open "T_月日", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
  wdt = wdt + 10
  For i = 1 To iDayCount
    rs.AddNew
    rs("日") = wdt
    rs.Update
    wdt = wdt + 1
  Next
  rs.Close
End Sub

' 行選択後削除されると「T_月日」「T_時間外」の対象レコードが削除されるので
' 表示対象範囲(日付)を再生成する
'
Private Sub Form_AfterDelConfirm(Status As Integer)
  Call MakeMonthDays(DateSerial(CInt(Left(Me.txt01, 4)), CInt(Right(Me.txt01, 2)), 1))
  Me.Requery
End Sub

' 更新/追加の前で、「T_時間外」登録に必要な「日付」「pno」を他から設定
'
Private Sub Form_BeforeUpdate(Cancel As Integer)
  If (Not IsNull(Me.cbx01)) Then
    Me!日付 = Me.日
    Me!pno = Me.cbx01
  Else
    Cancel = True
    Me.Undo
  End If
End Sub

' 初期表示、社員選択なし&表示対象範囲(日付)を今月へ
'
Private Sub Form_Load()
  Me.txt00 = ""
  Me.cbx01 = Null
  Call MakeMonthDays(Date)
  Me.txt01 = Format(Date, "yyyymm")
  Me.Requery
End Sub

' 社員変更
'
Private Sub cbx01_Click()
  If (Not IsNull(Me.cbx01)) Then
    Me.txt00 = Me.cbx01.Column(2)
  Else
    Me.txt00 = ""
  End If
  Me.Requery
End Sub

' 表示月変更
' 更新前処理では入力が正当か判別
' 正当なら Tag へ処理年月格納、ダメなら Cancel=True
' 更新後処理では、Tag 経由で得られる処理年月で表示対象範囲を再生成
'
Private Sub txt01_BeforeUpdate(Cancel As Integer)
  Dim sTmp As String
  Dim sYear As String
  Dim sMonth As String
  Dim wdt As Date
  Dim iECount As Integer

  sTmp = Trim(Nz(Me.txt01.Text))
  Select Case Len(sTmp)
    Case 1, 2
        sYear = Format(Date, "yyyy")
        sMonth = sTmp
    Case 3
        sYear = Left(Format(Date, "yyyy"), 3) & Left(sTmp, 1)
        sMonth = Right(sTmp, 2)
    Case 4
        sYear = Left(Format(Date, "yyyy"), 2) & Left(sTmp, 2)
        sMonth = Right(sTmp, 2)
    Case 5
        sYear = Left(sTmp, 4)
        sMonth = Right(sTmp, 1)
    Case 6
        sYear = Left(sTmp, 4)
        sMonth = Right(sTmp, 2)
    Case Else
        sYear = ""
  End Select
  If (Len(sYear) = 0) Then
    Cancel = True
    Exit Sub
  End If

  On Error GoTo ERR_HAND
  iECount = 0
  wdt = DateValue(sYear & "/" & sMonth & "/01")
  Me.txt01.Tag = Format(wdt, "yyyymm")
  Exit Sub

ERR_HAND:
  iECount = iECount + 1
  If (iECount <= 1) Then
    Select Case Len(sTmp)
      Case 2
          sYear = Left(Format(Date, "yyyy"), 3) & Left(sTmp, 1)
          sMonth = Right(sTmp, 1)
          Resume
      Case 3
          sYear = Left(Format(Date, "yyyy"), 2) & Left(sTmp, 2)
          sMonth = Right(sTmp, 1)
          Resume
    End Select
  End If
  Cancel = True
End Sub

Private Sub txt01_AfterUpdate()
  Me.txt01 = Me.txt01.Tag
  Call MakeMonthDays(DateSerial(CInt(Left(Me.txt01.Tag, 4)), CInt(Right(Me.txt01.Tag, 2)), 1))
  Me.Requery
End Sub


Microsoft Visual Basic のメニュー「ツール」->「参照設定」で
 Microsoft ActiveX Data Objects 2.1 Library が追加されていることを確認します。

フォームのデザイン画面に戻り、イベントが関連付けられているか確認します。
・フォーム
 更新前処理 / 削除後確認 / 読み込み時
・コンボボックス「cbx01」
 クリック時
・テキストボックス「txt01」
 更新前処理 / 更新後処理

関連付けが正しければ、保存し、フォームビューで動きを確かめてみます。


概要

テーブル「T_月日」は処理対象の日付が入るワーキング用テーブルです。
複数人同時に処理するのであれば、操作する人個々に必要なものなので工夫が必要です。

入力したデータのみ、テーブル「T_時間外」に格納されて行きます。
社員とデータの関連付けは、「pno」で行います。
(コードや名前は付属情報として扱います)

年月指定用テキストボックス「txt01」の表示は、YYYYMM です。
が、入力は月だけで・・・等の判別処理します。

後々の集計作業では、テーブル「T_時間外」を操作します。

フォーム上でも「平日_普通」,「平日_深夜」,「休日_普通」,「休日_深夜」の
合計を確認したい場合には、フォームのデザインで詳細部分の
「平日_普通」,「平日_深夜」,「休日_普通」,「休日_深夜」を選択後コピーを選び
フォームヘッダ/フッタどちらかに貼り付けします。
貼り付け後、プロパティでコントロールソースを =Sum([平日_普通]) のように変更します。


テーブルの各フィールドに対してのインデックス設定は適宜行ってください。

休日区分はコンボボックス化し、決まった文字列を入れるようにするとか、社員テーブルのように外出しして番号のみで管理するなど、いろいろ変更点があると思います。
    • good
    • 0

私なりの回答を載せるかどうか昨日から迷っていたのですが。


(かなりの長文になります。MDBを渡す手段を知らないので)

このような長文回答の是非について、ご意見ください。
(今後の参考にさせていただきます)

(何らかの反応はしてください)


以下参考まで。(Access2000/2007では動いてます)
正式なやり方か、わかりません。
(1か月表示で、穴埋め的に入力:データは入力したものだけ格納)
(見栄えや詳細部分は割愛します:はっきりとした仕様がわからないので)
(「Microsoft Office Specialist Access2002」はどんなものかわかりません)
(理解と裏付けはしっかりと行ってください)

Access2000での手順になります。(2003でも同様かと)

Access を起動し、新規MDBを作ります。

以下の条件でサンプルをテーブル「T_社員」として取込みます。
pno(長整数:主キー),pcode/pname(テキスト)

"pno","pcode","pname"
1,"A0001","ああああ0001"
2,"B0001","いいいい0001"

以下の条件でサンプルをテーブル「T_時間外」として取込みます。
(このテーブルがメイン扱いになります)
pno(長整数),日付(日付/時刻),休日区分(テキスト),他は倍精度浮動小数点
主キーは自動設定

"pno","日付","休日区分","平日_普通","平日_深夜","休日_普通","休日_深夜"
1,2009/3/1,"休日",0.00,2.00,2.50,0.00
2,2009/3/4,"休日",2.50,0.00,0.00,0.00
1,2009/3/3,"休日",2.50,1.00,0.00,0.00
1,2009/3/13,"休日",1.50,2.00,0.00,0.00
1,2009/3/10,"休日",4.00,1.50,0.00,0.00
2,2009/3/15,"休日",3.50,1.00,0.00,0.00
2,2009/3/17,"休日",0.00,0.00,1.50,1.50

T_時間外ができたら、デザインで
休日区分のフィールドサイズを10くらいに変更
倍精度浮動小数点のフィールドの既定値を 0 に設定

以下の条件でテーブル「T_月日」を作成します。
フィールド1つのみで、名前「日」を日付/時刻型、主キーなし。

使用するテーブルは「T_社員」「T_時間外」「T_月日」の3つです。

以下の内容で、クエリ「Q_時間外」を作ります。(SQLビューで貼り付け)

SELECT T_月日.日, T1.休日区分, T1.平日_普通, T1.平日_深夜, T1.休日_普通, T1.休日_深夜, T1.pno, T1.日付
FROM T_月日 LEFT JOIN (SELECT * FROM T_時間外 WHERE T_時間外.pno = Nz([Forms]![F_時間外]![cbx01],0)) AS T1 ON T_月日.日 = T1.日付
ORDER BY T_月日.日;

以下の手順でフォーム「F_時間外」を作成します。
・ウィザードを使用してフォームを作成するから
・クエリ:Q_時間外のフィールドを全て選択
・表形式を選択
・フォーム名を「F_時間外」とし、フォームのデザイン編集

フォームのデザイン画面になるので、プロパティを表示させます。

フォームの以下プロパティを変更
「追加の許可」->「いいえ」
「レコードセット」->「ダイナセット (矛盾を許す)」

フォームヘッダ部分右側にある「pno」「日付」を削除

詳細部分
・右側にある「pno」「日付」を削除(もしくは、「可視」->「いいえ」)
・左側にある「日」のプロパティ
  「書式」->「m/d」に、「編集ロック」->「はい」へ

フォームヘッダ部分を縦方向に広げ、以下を追加。
・社員コード表示用テキストボックス「txt00」を作成
 プロパティで、「編集ロック」->「はい」
 (コンボボックスで社員を選択した時に表示するだけに使用)

・社員選択用コンボボックス「cbx01」を作成
 値集合ソースは以下

SELECT T_社員.pno, T_社員.pname, T_社員.pcode FROM T_社員 ORDER BY T_社員.pname;

 列数:3
 列幅:0cm;3cm;1.5cm
 連結列:1
 入力チェック:はい

・年月指定用テキストボックス「txt01」を作成
 プロパティで、「IME 入力モード」->「オフ」

必要なVBA部分を記述して行きます。
コンボボックス「cbx01」のクリック時をイベントプロシージャにし、「・・・」ボタンをクリックします。

Private Sub cbx01_Click()

End Sub

の部分を、以下に書き換えます。(貼り付けます)

つづく
    • good
    • 1
この回答へのお礼

長文での回答、ホントにありがとうございます。
正直分からない部分も多くありますが、
そこらへんはネットや本で知らべ理解出来るよう頑張ります。
テーブル「T_社員」「T_時間外」はほぼ同じでしたが、
「日」だけの「T_月日」は考えもしませんでした。
これを参考にして勉強しながら進めていきたいと思います。
このような丁寧な回答を頂けると
もっと頑張って勉強しよういう気持ちが沸いてきます。
ありがとうございました。

お礼日時:2009/03/04 23:26

こんにちは。


どこまでできて、どこからできないのか具体的な内容でなければ回答できませんよ。

この回答への補足

すみませんm(_ _)m
自分ではなるべく具体的に書いたつもりでしたが
まだ自分の力量が無くうまく表現出来ていなかったようですね。
Accessも慣れておらずこのサイトでの質問も初めてだったもので。。。
もっと自分で頑張ってみて、もう少し踏み込んだ質問が出来るようにしてみます。
ありがとうございました。

補足日時:2009/03/04 23:07
    • good
    • 0

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