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
No.3
- 回答日時:
つづき
' 表示対象範囲(日付)生成
'
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([平日_普通]) のように変更します。
テーブルの各フィールドに対してのインデックス設定は適宜行ってください。
休日区分はコンボボックス化し、決まった文字列を入れるようにするとか、社員テーブルのように外出しして番号のみで管理するなど、いろいろ変更点があると思います。
No.2ベストアンサー
- 回答日時:
私なりの回答を載せるかどうか昨日から迷っていたのですが。
(かなりの長文になります。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
の部分を、以下に書き換えます。(貼り付けます)
つづく
長文での回答、ホントにありがとうございます。
正直分からない部分も多くありますが、
そこらへんはネットや本で知らべ理解出来るよう頑張ります。
テーブル「T_社員」「T_時間外」はほぼ同じでしたが、
「日」だけの「T_月日」は考えもしませんでした。
これを参考にして勉強しながら進めていきたいと思います。
このような丁寧な回答を頂けると
もっと頑張って勉強しよういう気持ちが沸いてきます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) 翌日にお休み予定の従業員がいる場合にアラートを出したい 1 2023/07/11 11:18
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Access(アクセス) Accessで予定表を作成しようとしてます。 テーブル フィールド名 連番 オートナンバー型 年月日 2 2023/07/23 11:40
- 会社・職場 転職についてどっちが良いと思いますか? 私は新卒社会人一年目。女です。 現在働いている会社が凄く嫌で 3 2023/01/20 21:31
- 労働相談 飲食店勤務のスタッフの勤怠管理について 新規事業で飲食店を始めたのですが、深夜営業もあり勤怠管理が難 2 2023/04/23 15:56
- その他(就職・転職・働き方) 内定を3社貰って悩んでます 8 2022/08/10 04:38
- 転職 転職活動中で2社内定があり迷っています。皆様ならAとBどちらの方が良いと思いますか?理由もお願いしま 1 2023/02/06 12:20
- 労働相談 有給休暇使用時の賃金の計算方法について 5 2022/04/04 00:02
- その他(ビジネス・キャリア) グーグルの障害者訓練プログラム募集あるがどうだろ?6時間勤務で月収22万!! 1 2023/02/17 20:36
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
access別のテーブルを参照して...
-
Accessでフォームに自動入力し...
-
入力した値をコンボボックスに...
-
テキスト型のフィールドでハイ...
-
Accessフォームが入力できません。
-
前のレコードの値を自動で入れたい
-
Access2010 レコードの更新日付...
-
Accessで時間外管理の作成について
-
インデックスまたは主キーにはn...
-
Accessでデータを更新したらそ...
-
エクセル フィルタの抽出結果...
-
access ダブリ登録を防止したい
-
アクセスでコードを入れると名...
-
Access サブフォームでの選択行...
-
エクセルで、抽出したデータだ...
-
Accessのコンボボックスでリス...
-
ACCESSでVBAから選択クエリの抽...
-
ACCESS 複数のフォームから同一...
-
ExcelのComboboxでマウスのスク...
-
2回目に画面のレコードセットの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータを更新したらそ...
-
前のレコードの値を自動で入れたい
-
インデックスまたは主キーにはn...
-
Accessでフォームに自動入力し...
-
access別のテーブルを参照して...
-
Accessフォームが入力できません。
-
入力した値をコンボボックスに...
-
ACCESSでフォームのチェックボ...
-
テキスト型のフィールドでハイ...
-
access ダブリ登録を防止したい
-
ACCESS フォームで入力データ...
-
アクセスでコードを入れると名...
-
Accessのフォーム入力をしても...
-
AccessVBAの値によっ...
-
Accessで、最後(更新)にエラ...
-
「バリアント型でない変数に Nu...
-
ACCESS2000の帳票フォームでテ...
-
アクセスで自動でレコードを増やす
-
ACCESSで定型入力の〒が表示さ...
-
Accessのフォームでデータ入力...
おすすめ情報