'フォーム 開くとき
Private Sub Form_Open(Cancel As Integer)
Dim i As Integer
For i = 1 To 42
Me("T" & i).OnClick = "=SetDate(" & i & ")"
Next
Me.cmdPrev.OnClick = "=MoveMonth(-1)"
Me.cmdNext.OnClick = "=MoveMonth(1)"
Me.txtDate = Date '<--修正
SetCalendar
End Sub
Surface Pro 3(Windows8.1)に、プリインストールのOffice HOME and business2013と追加でAccess2013をインストールして使っています。 Access2013ですが、ネットワークにつながっていないときは普通に動作するのですが、ネットワークにつながっていると、起動したあとDBを開くときに1~2分くらい時間がかかります。
Option Explicit
Private WithEvents コマンド As CommandButton
Private WithEvents テキスト As TextBox
'初期化メソッド 引数はコマンドボタン コマンドボタンのTagにテキストボックス名を設定しておく
Public Sub Init(objコマンド As CommandButton)
Set コマンド = objコマンド
Set テキスト = objコマンド.Parent.Controls(objコマンド.Tag)
コマンド.OnClick = "[イベント プロシージャ]"
End Sub
Private Sub コマンド_Click()
テキスト.Value = IIf(Nz(テキスト.Value) = "有", "無", "有")
End Sub
'自身を返すプロパティ
Public Property Get Self() As Variant
Set Self = Me
End Property
フォームモジュール
Private Sub Form_Load()
Static co As New Collection 'Class1保存用
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.ControlType = acCommandButton And ctl.Tag <> "" Then
With New Class1
.Init ctl
co.Add .Self
End With
End If
Next
End Sub
↪︎残業1を新テーブルに追加クエリその5(残業1がIs Not Null)を作る。 ↪︎残業2を新テーブルに追加クエリその6(残業2がIs Not Null)を作る。 ↪︎残業1開始と勤務開始を新テーブルの勤務開始と勤務終了に追加クエリその7を作る。
(残業1開始がIs Not Null、残業1終了がIs Null) ↪︎勤務終了と残業2終了を新テーブルの勤務開始と勤務終了に追加クエリその8を作る。
(残業2開始がIs Null、残業2終了がIs Not Null)
POption Compare Database
Option Explicit
Private WithEvents コマンド As CommandButton
Private WithEvents テキスト As TextBox
`初期化メソッド
Public Sub Init(objコマンド As CommandButton, objテキスト As TextBox)
Set コマンド = objコマンド
Set テキスト = objテキスト
コマンド.OnClick = "[イベント プロシージャ]"
End Sub
Public Sub コマンド_Click()
Debug.Print "クリック"
テキスト.Value = IIf(Nz(テキスト.Value) = "有", "無", "有")
End Sub
フォームモジュール
Private Sub Form_Load()
Static co As New Collection 'Class1保存用
Dim ctl As Control
For Each ctl In Me.Controls
If Left(ctl.Name, 3) = "txt" Then
Dim cls As Class1
Set cls = New Class1
cls.Init Me.Controls("cmd" & Mid(ctl.Name, 4)), ctl
co.Add cls
End If
Next
End Sub
hatena様
直接早々にご返事ありがとうございます。
実行時エラー'2465':
指定された式で参照されている'T44463'フィールドが見つかりません。
デバッグすると
'カレンダー 日にち設定関数
Private Sub SetCalendar(aDate As Date)
Dim i As Integer, D As Date, m As Integer, n As Integer
If Not IsNull(Me.txtDate) Then
Me("T" & Me.txtDate - FirstDay).BackStyle = 0 '透明
と表示されてしまいます。
再度お願いできますでしょうか?
F_Calendarフォームの開く時のイベントプロシージャを下記のように修正してください。
Me.txtDate に代入した日付の月が表示されます。
丁寧なご返事ありがとうございます。
私が製造者ですが、Date()みたいなのを
入れたり消したりした記憶はあります。その辺が
まずいんでしょうね。
後は、再クエリとか、値の代入とか
色々思うような動きをさせるために、
イベントに設定しています。
それがエラーになっている危険性が大と思いました。
また調べてご報告します!
自己解決しました。
DAOのworkspaceを処理の最後でcloseしたところ書き込めるようになりました。
(先日までは書き込めていたのによくわからない・・・)
調査していまして気になることが出てきました。
このデータベースは、マシン'PC名'のユーザー'Admin'が開いています。データベースが使用可能になった時点で、再度実行してください。
とポップアップが出ます。
おそらくDB開いたままロックがかかっているので書き込めないのだと思いますが、原因が分かりません。
(トランザクションかけた後にコミットがうまく動作していない?)
hiroton様 回答ありがとうございました。
りんご様 仰る通りですね。ちょっと事情がありまして、質問しました。
hatena様 いつも素晴らしいコードありがとうございます。Tagプロパティは初めて知りました。
返信が遅れて申し訳ありません。
本当にありがとうございました。
りんご様
度々ご回答ありがとうございます。
こちらの設定もしてみたのですが、この設定をするとAccessのロゴが20秒くらい表示されAccessが起動します。
結局20秒待つ事には変わりがないので、設定を戻している状態です…。
>> 1
外部に接続出来ないPCなので、これも的外れかもしれませんが、念のため。
「Officeのインターネット接続を許可する」を無効にする。[ファイル] - [オプション] - [トラスト センター] - [トラスト センターの設定] - [プライバシーオプション] - [プライバシー設定]
規定値を設定しない、イベントスタート後、Me.Undoするとか、でしょうか?そもそも論から的外れでしたら、ごめん。
りんご様
ご回答ありがとうございます。こちらのサイトも見ていたのですが、
そもそも外部に接続できないPCですので、この設定はできませんでした…。
ググッただけです。知識が無いので責任は負えません。
テーブルの日付フィールドが、規定値:Date()だという前提で、当てずっぽうですが。
⬇レコードの編集中に、うっかりクリックを押して、確定されてしまった。
こんな経験はないですか?同様に、レコードの編集中に、イベントが発生したので取り敢えず確定されてしまった。その後、イベントスタート。新規レコードの日付フィールドには、本日の日付が自動入力されているので、フォームの日付を代入・上書き。テーブルを開いてみると、あら不思議、2つのレコードが出来ました。もしかして、こんな状況なのではないでしょうか?
3件目からは、既存レコードの編集中にイベントが発生しているから、影響しないという事かもしれない。(新規レコードの日付フィールドに代入・上書きされるだけ)。
フォームがテーブルやクエリに連結している前提ですが、新規レコードに移動して、イベントを発生させると…。
既に回答した通りですが、質問のコード部分には勝手にデータを登録するような仕組みはありません。入力したことのない値(本日の日付)のデータが作られるということは何かを条件に自動でデータを登録する仕組みがどこかにあるということです
作った人なら当然知っている仕様だと思いますが確認できませんか?
作った人がすでに連絡を取れない状態でどうにかしなければならないということであれば、その動作からどこかの何かを探すという作業が発生します。大本の質問とは全く関係ない仕事だということは理解してください
とりあえず見るべきはフォームのプロパティのイベントタブですね
未確認の
[イベント プロシージャ]
やマクロが設定されていませんか?りんごさんへ
テキストボックスですが、非連結です。
新規に質問項目を立ち上げました。
どうぞ宜しくお願い致します。
hiroton さんへ
ところで、エラーですが、
色々調査した結果、
必ず、本日の日付が自動入力されるようになっているようです。
そうして、本日の日付を入力しようとしたら重複エラーが出て、
日付を変えると入力できて、でも、本日の日付のデーターが
必ず入っているという感じみたいです。
最初から、違う日付を入れた場合、
本日の日付のデーターが自動で入力され、
1件登録しただけのつもりなのに、
本日の日付のデーターと別の日の日付データー
2件が入力されるみたいです。
3件目のデーターからは
ちゃんと重複エラーも出るし、
データーも1件入力したら
1件だけしか登録されません。
大変お手数ですが、御指南を
宜しくお願い致します。
新しく質問記事を立ち上げました。
宜しくお願い致します。
いまいち、状況が伝わらないのですが、フィールドA、フィールドBをもとに、フィールドCを絞り込みたいという事でしょうか?
範囲内の抽出が出来るという事なので、下記、情報で解決しませんか?
クエリの抽出条件の例 - Microsoft Support
値が指定範囲外にある
<5000 or >10000
範囲外の値を含む
<#2006/2/2# or >#2006/2/4#
汎用性を持たせるのは凄い事だけど、貴方にしか保守出来なくなるのではないかと心配です。

>> 5
AccessVBAで画像を作りたいのであれば、『テキストボックス配置、ボタン配置、クリック時イベント:[イベントプロシージャ]』、ここまでノーコードじゃダメなの?
教えていただきありがとうございました。
内部処理を見直してhirotonさんにご教示いただいたNZを使ってみたのですが、それでもやはり単体では厳しかった(クエリが複雑過ぎますがでました)ため、りんごさんにご教示いただいた追加クエリ等を使った結果、想定していたイメージの通りのものができました。
大変助かりました。
本当にありがとうございました。
hirotonさんも指摘していますし、上の回答でも、下記のように仕様を提示してます。
もし、コントロールの名前を変更せずにということなら、下記のような仕様でどうでしょうか。
(こちらの仕様の方がコードがシンプルになるし、変更に強いコードになります。)
仕様
コマンドボタンのTagプロパティに関連付けるテキストボックス名を設定しておく。
例
コマンドボタン名「コマンド51」
テキストボックス名「テキスト0」
の場合、コマンドボタン「コマンド51」のTagプロパティに「テキスト0」と設定する。
クラスモジュール
フォームモジュール
おお、なるほど。
お二人の回答を見て大分回りくどいことをやっていたことに気づきました。
かなりごてごて書き込んでしまっているので、少し中身を見直してみます。
追加クエリという手がありましたね。うっかりしていました。
選択クエリとテーブル作成クエリで作ることばかりを考えていました
中身の見直しと追加クエリで再挑戦してみます
項が分かれていたほうが入れ子少なくてわかりやすいかと思ったけど
長くてもこのくらいなら全部Nzの入れ子の形でも問題なさそう
テキスト0の名前を、
txt0
コマンド51の名前を、
cmd0
に変更してみましょう
りんご様 回答ありがとうございました。
hatena様 いつもご教示ありがとうございます。
私の書き方が悪かったとおもいます。
図のように、コマンド51をクリックすると、テキスト0に、有、無が表示されるようにしたいのです。
テキスト0の名前は、txtテキスト0
コマンド51の名前は、cmdコマンド51です。
色々試したのですが、作動しません。
できましたら、もう一度、コードのご教示をお願いします。
本当に申し訳ありません。
NzはNullを判定するだけなんでIIf条件分岐でIsNull判定するのと同じですけどね。式が短く書けるだけです(大事)
残業3は残業代の切り替わりをわかりやすくしてるだけかな?データ上では意味ないですが業務上ではよくある話ですかね
休日2がある場合に中抜け扱いとすると、平日の時間休に申請があるとき、申請上の時間合計とデータ上の中抜けの時間合計が合わないってことになります。
休日のデータには休日フラグを立てて、そのレコードは集計から省くようにすれば問題ないんですが、hiroton的には元データから存在しないような作りのほうが好きですね
休日1と休日2の間には中抜けがあるけど休日2と休日3(2レコード目の休日1)の間には中抜けがないっていうのも混乱のもとですし
ちょっと挙げたようにUNION使えばできないことでもないですが、ほしい結果次第ですかね。今回は使わなくてもよさそうでそのほうが高速そうでもあります。
>> 8にイメージを出していますが、「休日2発生時は中抜け扱いをする」ならフィールドの位置をうまい具合に入れ替えるような条件判断を作ってあげればいいので考えてみてください
クエリを考えるのに必死になりすぎて、NZの存在を忘れていました・・・。
ちょっと見直します。
残業と残業の間で中抜けは発生しないと思われます。
分析してみましたが、残業開始から早朝帯や深夜帯に入ると残業3が入っているように見えます。
時間休あります。
平日の普通の勤務と同じ、時間休開始、時間休終了で中抜けを判別しています。
フレックス専用で時間休を値が入るところはないです。
では、具体的に処理した場合どんなデータになりますか?
1レコード目
↓
2レコード目
↓
2で行こうと思っています。
作成し始めたばかりの時に、私のスキルでは1つにまとめるのは難しいとお話しし、了承をいただいています
基本的にはクエリを分ける必要はなく、それぞれの入力からそのレコードがどの勤務形態なのかを判定してその時の対応するフィールドの値を取ってこればいいです。
テクニックとして、それぞれの入力が排他的であればそれぞれの時間を合計してあげればほしい時間になります
↓そのまま開始時間同士を合計する(データなし(Null)は0とする)
通常勤務の時間は残業時間によって変わるので、この計算の前に残業時間を考慮したデータ上の開始時間を作成します。
これらを組み合わせればクエリを分けることなくそれぞれの時間を求めることができます。
休日については扱いに不明点があります。>> 5に要点をまとめているので確認してください。それに合わせて事前にデータの整形が必要になります
たぶん、休日2のあるレコードだけ抽出してUNIONすることになるんじゃないかと予想しています
あと、残業3が出るというのは残業と残業の間に中抜けがありそうですがどうなんでしょう?具体的なデータでほしい結果を考えてみてください
もう一つ、フレックスって時間休ないんですかね。扱い的には休日みたいに複数レコード発生とかしてそうですけど(データ処理的には問題ない)
この場合最終的にはどういうデータにしたいんでしょう?
1.中抜けなしの3レコードにする
2.それぞれそのまま扱う(1レコード目は中抜けあり、2レコード目は中抜けなし)
3.1レコードにまとめる(中抜けの表現はどのように?)
ちょっと、複雑なので、フレックスと残業3は抜きに、方向性を考えてみました。
↪︎休日1と残業1を仮テーブルに追加クエリその1(休日2と残業2は追加先を指定しない)を作る。
↪︎休日2と残業2を仮テーブルに追加クエリその2(休日1と残業1は追加先を指定しない)を作る。
↪休日1と残業1と残業2を仮テーブルに追加クエリその3を作る。
↪開始、終了、時間休、残業を仮テーブルに追加クエリその4を作る。
↪︎残業1を新テーブルに追加クエリその5(残業1がIs Not Null)を作る。
↪︎残業2を新テーブルに追加クエリその6(残業2がIs Not Null)を作る。
↪︎残業1開始と勤務開始を新テーブルの勤務開始と勤務終了に追加クエリその7を作る。
(残業1開始がIs Not Null、残業1終了がIs Null)
↪︎勤務終了と残業2終了を新テーブルの勤務開始と勤務終了に追加クエリその8を作る。
(残業2開始がIs Null、残業2終了がIs Not Null)
↪︎勤務開始、勤務終了、時間休開始、時間休終了を新テーブルの勤務開始、勤務終了、中抜け開始、中抜け終了に追加クエリその9を作る。
最後は、クエリで見やすい順番に。
すみません、入力間違えました。正しくは以下のとおりです。
2レコードになるパターンは、
勤務時間 8:00~10:00、10:30~12:00、19:00~20:00
(1レコード目)休日1開始8:00、休日1終了10:00、休日2開始10:30、休日2終了1:00、
(2レコード目)休日1開始19:00、休日1終了20:00
ありがとうございます。
レコードはこんな感じです。
名前、日付、平日開始時間、平日終了時間、残業1開始、残業1終了、残業2開始、残業2終了、残業3開始、残業3終了、
時間休開始、時間休終了、休日1開始時間、休日1終了時間、休日2開始時間、休日2終了時間、
フレックス開始、フレックス終了
平日出勤した時点で、自動的に平日開始と平日終了時間が入ります。
午前休や午後休を取得した場合でも、平日開始と平日終了は変わりません。固定です。
時間給(中抜け)や午前休などを取得したかどうかは、時間休開始と時間休終了で判断します。
残業1が始業前残業、残業2が後残業です。残業3は残業1の前だったり残業2の後だったりと不定です。
フレックスは残業なしという扱いです。
基本的には1レコードです。
中抜けは、平日と休日で変わります。
・平日の場合:開始時間8:20(固定)、終了時間17:20(固定)、時間休開始14:00、時間休終了15:00
・休出の場合:休日1開始時間8:20、休日1終了時間14:00、休日2開始時間15:00、休日2終了時間17:20
2レコードに分れるのは休出限定だと思います。
頻度はそれほど出ないけど、よく出る(?)らしいです。
勤務時間 8:00~10:00、10:30~12:00、19:00~20:00
(1レコード目)休日1開始8:00、休日1終了10:00、休日2開始10:30、休日2終了1:00、
(2レコード目)休日1開始19:00、休日2終了20:00
抽出したいのは、名前、日付、勤務開始、勤務終了、中抜け開始、中抜け終了です。
勤務時間は残業も含めた時間を出したいです。
開始時間は始業前残業開始時間から、終了時間は後残業終了までです。
ありがとうございます。
勤務表データは、一月分ずつまとまってきます。
そのため、必要なデータはすべて入力済みの状態で手元に来ます。
オンライン勤務表なのであまり詳しくはわからないのですが、
PCのONとOFF時間を取得しているようなので、残業1~3は、おそらく内部で自動的に振り分けていると思います。
取得したい項目は少ないのに、関連する項目が多くて困っています。
よろしくお願いします。
勤務表は、こんな感じですか?
1つのレコードに、名前、日付、休日開始時間、休日終了時間、休日残業開始時間、休日残業終了時間、平日開始時間、平日終了時間、平日残業開始時間、平日残業終了時間、フレックス開始時間、フレックス終了時間、フレックス残業開始時間、フレックス残業終了時間が記録される。
どのように記録していますか?例えば、平日勤務8:20〜17:20、中抜け14:00〜15:00の場合、開始時間8:20終了時間14:00と開始時間15:00終了時間17:20の2レコード。
名前、日付、勤務開始時間、勤務終了時間、中抜け開始時間、中抜け終了時間、残業開始時間、残業終了時間みたいな感じにしたいのでしょうか?
タイムカードの有無、中抜け記録と残業記録のタイミング(後日、報告?)など追加情報があれば、他の人のアドバイスが増えるかも。
まずは、りんごさんの指摘されている点について確認してみてください。
それで解決しない場合は下記の手順を試してみてください。
新規に空のAccdbファイルを作成する。
このファイルに、VBAの動かない問題のAccdbファイルから、すべてのオブジェクト(テーブル、クエリ、フォーム、レポート、モジュール)をインポートする。
この新しいAccdbファイルで動くかどうか確認してみてください。
マクロが動いているそうなので、関係ないとは思いますが、念のため、コンテンツの有効化は出来ていますか?
回答ありがとうございます。
Access2003から変換したaccdbで、新規フォームを作成してそこにコマンドボタンを配置してMsgBoxで試したところ無反応でした。変換したファイルに問題あるのでしょうか?
質問のコード、実際には動作しませんね。
動作確認済みのコードかと思って回答コード書きましたが、これでは動きません。
ctl.OnClick = "[イベント プロシージャ]" とイベントとVBAを関連付けるコードはクラスモジュール内に書かないと動かないです。
サンプル作成して気が付きました。
下記は動作確認済みです。
クラスモジュール Class1
フォームモジュール
この動画、ちょっとおかしい部分が目につきますね。まあ、全て解説していたら時間がどれだけあっても足りないのでしょうがないですが。
私の場合はテーブルで直接入力することはないので、テーブルにはルックアップは設定しない場合が多いかな。
入力フォームの方でコンボボックスで設定すれば同じことができますし、状況に合わせていろいろ工夫できますので。
例えば、下記のようにどちらでも入力できるようにしたりします。
コードでも名称でも入力できるコンボボックス - hatena chips