Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the all-in-one-seo-pack domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the easy-fancybox domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the urvanov-syntax-highlighter domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the breadcrumb-navxt domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the advanced-ads domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Notice: 関数 _load_textdomain_just_in_time が誤って呼び出されました。lancr ドメインの翻訳の読み込みが早すぎました。これは通常、プラグインまたはテーマの一部のコードが早すぎるタイミングで実行されていることを示しています。翻訳は init アクション以降で読み込む必要があります。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 6.7.0 で追加されました) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Warning: Cannot modify header information - headers already sent by (output started at /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php:6114) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-content/plugins/all-in-one-seo-pack/app/Common/Meta/Robots.php on line 87

Warning: Cannot modify header information - headers already sent by (output started at /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php:6114) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/feed-rss2.php on line 8
VBA | 診療放射線技師がPythonをはじめました。 http://radiology-technologist.info 診療放射線技師のPython日記。解析等で使えるコードを作成、アップしていきたいと思っています。その他いろいろ Sat, 10 Apr 2021 01:05:41 +0000 ja hourly 1 https://wordpress.org/?v=6.7 https://i0.wp.com/radiology-technologist.info/wp-content/uploads/2018/09/cropped-logo5.png?fit=32%2C32 VBA | 診療放射線技師がPythonをはじめました。 http://radiology-technologist.info 32 32 164362728 microsoft ACCESSで勤務管理⑤~代休発生と消化予定日を登録~ http://radiology-technologist.info/post-1347 Sat, 10 Apr 2021 01:04:11 +0000 http://radiology-technologist.info/?p=1347 こんにちは。前回は、決めた当直順に割り振りを行い、 […]

The post microsoft ACCESSで勤務管理⑤~代休発生と消化予定日を登録~ first appeared on 診療放射線技師がPythonをはじめました。.]]>
こんにちは。前回は、決めた当直順に割り振りを行い、日当直の一覧表の作成までを行いました。

今回は、発生した代休一覧表を作成し、そこから代休消化を登録。代休消化の予定を入れたか一目でわかるシステムを作っていきます。


代休一覧表を作成する

代休一覧表を作成します。これは、クエリの集計機能を使っていきます。

いきなりクロス集計を使うと少しこんがらがりやすくなるので、一度代休一覧のクエリを作成しました。


代休一覧のクエリを作成

テーブル「当直順」の「技師ID」フィールドのIDを元にテーブル「日当直」の「代休発生日」と「代休消化日」、テーブル「calender」のフィールド「代休」の値を参照します。

また、代休が何回目なのかを計算するためにフィールド「count」を作成します。ここのフィールドは、代休が発生するたびに1づつ累積されるフィールドにします。これは後に作成する代休一覧の際に重要なフィールドになってきます。

countのフィールドに入力する計算値は以下となります。

count: Int(DSum(“代休”,”K_代休一覧2″,”技師ID = ” & [技師ID] & ” And 日付 <= #” & [日当直].[日付] & “#”)+0.5)*Int([代休]+0.5)

考え方としては、現在のレコードよりも前の代休カウント数の合計に当日の代休発生数を足すという考え方です。

しかし、ここで問題が出てきます。休日の代休発生数は1日なので単純に累積していけばいいのですが、診療日である土曜日の当直では代休発生数が「0.5」という事です。集計クエリで使用する場合、ここは整数である必要があるので、この「0.5」の処理を考えなくてはいけません。

なので、代休発生数に0.5を足して、小数点以下切り捨てという方法を用いれば無事に解決することができます。(小数点以下、切り上げで処理する方法でもOK)

そこで、Int関数を使用することで、小数点以下を切り上げることができます。

なので、先ほどのフィールドの計算式の初めにInt関数を付けています。


もう一つ、フィールドを作成します。「検索」フィールドと名前を付けてみました。といっても、何かを検索するわけではありません。。。。。

ここのフィールドは、文字列を連結したフィールドとします。

連結するフィールドは、「代休数」のフィールドと、「代休消化日」のフィールドを連結します。クエリのフィールド部分には以下を記載します。

検索: [代休] & “,” & [代休消化日]

このフィールドは、後に代休消化日の予定を入力した際に使用します。

クエリを実行した結果は以下となります。

クエリを保存します。名前は「K_代休一覧2」としました。


代休一覧のクロス集計

ここからは、代休発生日を技師ごとに一覧で表示する部分をやっていきます。

最終的には上記のような感じです。代休が発生する日を表示します。橙色で表示されている日は代休発生数が0.5日で、水色の部分が代休発生数が1日になります。

灰色で表示されているのが代休消化を指定した日になります。

この一覧の作成にはクロス集計を使用します。

まず、先ほど作成したクエリを選択し、クエリウイザードをクリックします。

そして、クロス集計ウィザードを選択します。

表示にクエリを選択し、先ほど作成したクエリを選択します。

行見出し「技師ID」を選択します。

行見出しには「count」を選択します。

集計方法にはカウント以外であればなんでも構いません。

また、集計を表示したい場合には集計値を表示するにチェックを入れます。

なお、これにチェックを入れた場合は当直回数の合計が表示されます。

クエリの名前を指定して実行します。

数の様な表示が出てきました。

ここで、日付に年が表示されていますがここは、”mm/dd”の表示がいいので変更しましょう。

デザインビューで開きます。

日付を選択し、プロパティーの書式を”mm/dd”と入力することで変更することができます。

あとは、これをフォームで表示すれば初めに表示したような形式で表示することができます。

フォームの作成は前回記事の「一覧表の作成」を参照ください。

あれ。。。技師名が表示されていないことに気が付いてしまいました。。。

修正するのが面倒なのでデザインビューで開き、「技師ID」と「合計日付」の間にテキストボックスを挿入します。

そこのコントロールソースに

=DLookUp("&#91;名前]","技師","&#91;技師ID] = " &amp; &#91;技師ID] &amp; "")

と入力することで技師名を表示しました。

あと、日付の表示もテキストボックスを選択し、書式タブに”mm/dd”と入力することで変更することができます。


広告
デル株式会社

ダブルクリックで代休消化指定の日付を入力する

それでは、代休の日付をダブルクリックすることで消化予定の日付を登録できるシステムを組みたいと思います。


フォームの作成

登録方法は、日付をダブルクリックすることでカレンダー様のフォームが出現して日付をクリックすることで登録できるシステムとします。

余計なコンボボックス等が出ています、本当は、なくてもいいのですが、コードを書いていく上で、前のフォームから引き継いだ引数をここに表示することでわかりやすくなるので表示しています。後で非表示にしたほうがスッキリします。

まずは、上図のフォームを作成します。フォームはモーダルフォームとし、このフォームが開いているときは他の作業ができないフォームです。

当直の月、および翌月のカレンダーを作成します。

横7つ、縦5つのボタンを2セット配置します。

ここは、初めに作成したフォーム「カレンダー」の制作過程と変わらないので簡単な説明とコードだけの表示とします。

代休一覧のフォームから代休が発生する日付と、何番目の代休かを引数として受け、その年と月からカレンダーを作成していきます。

Private Sub Form_Load()
    Dim strOpenArgs As Variant
    Dim ID_引数 As Long
    Dim 種類 As String
    Dim 番号 As Integer
    
    テキスト71.Value = Year(Date)
    テキスト77.Value = Month(Date)
    
    初期化
        
    strArgs = Split(Me.OpenArgs, ",")

        テキスト73 = strArgs(0)
        テキスト74 = strArgs(1)
        テキスト75 = strArgs(2)
        テキスト76 = strArgs(3)
        
    
End Sub

初期化のプロシージャ―ではまずボタンの表示を一度、すべて非表示にし、文字も無しにします。その後、順番にボタンを表示、日付の表示をしていきます。

Private Sub 初期化()
    For i = 1 To 70
        Me("コマンド" &amp; i).Visible = False
        Me("コマンド" &amp; i).Caption = ""
    Next i
    

    d = CDate(テキスト71 &amp; "/" &amp; テキスト77 &amp; "/1")
    

    
    startday = DateSerial(テキスト71, テキスト77, 1)
    endday = DateSerial(テキスト71, テキスト77 + 1, 0)
    
    next_startday = DateSerial(テキスト71, テキスト77 + 1, 1)
    next_endday = DateSerial(テキスト71, テキスト77 + 2, 0)


    For i = 1 To 35
    
        If Weekday(startday) &lt;= i Then
            Me("コマンド" &amp; i).Visible = True
            Me("コマンド" &amp; i).Caption = Format(d, "mm/dd")
            pre_month = Month(d)
            d = d + 1
            aft_month = Month(d)
            
        End If
        
        If pre_month &lt;> aft_month Then
            i = 35
        End If
            
    Next i
    
    If テキスト77 = 12 Then
        d = CDate(テキスト71 + 1 &amp; "/" &amp; 1 &amp; "/1")
        next_startday = DateSerial(テキスト71 + 1, 1, 1)
        Else
        d = CDate(テキスト71 &amp; "/" &amp; テキスト77 + 1 &amp; "/1")

    End If
    
    pre_month = Month(d)
    i = 36
    
    For i = 36 To 70

        If Weekday(next_startday) + 35 &lt;= i Then
            Me("コマンド" &amp; i).Visible = True
            Me("コマンド" &amp; i).Caption = Format(d, "mm/dd")
            
            d = d + 1
            aft_month = Month(d)

            If pre_month &lt;> aft_month Then
                i = 70
            End If
        End If

        If pre_month &lt;> aft_month Then
            i = 70
        End If

    Next i

End Sub

フォームが表示され、ボタンが押されたらテーブル「日当直」にボタンの日付を登録します。

当直順を登録した時と同様に、登録だけのプロシージャ―を作成し、ボタンを押した際に、ボタンに表示されている日付を引数に登録のプロシージャ―を呼び出す形にする予定でした。その方がスマートなのですが、今回は一度、コンボボックスに表示させ、登録のプロシージャ―ではコンボボックスの値を参照して登録する形式をとりました。理由はありません。

登録のプロシージャ―を以下に記載します。

Private Sub 登録()

    sql_update = "update 日当直 SET 代休消化日 = #" &amp; コンボ78 &amp; "# where 日付 = #" &amp; CDate(テキスト74) &amp; "# and 技師 = " &amp; テキスト73 &amp; ";"
    DoCmd.RunSQL sql_update
    Forms!&#91;F_代休一覧].Requery
    DoCmd.Close

End Sub

ボタンが押された時のコードは以下になります。

Private Sub コマンド1_Click()
    コンボ78.Value = Format(コマンド1.Caption, "yyyy/mm/dd")
    登録
End Sub

上記コードを各ボタンに設定していきます。

これで、登録用のフォームは完了です。

ただこれだけだと、変更がフォーム上に反映されません。


当直一覧のフォームに設定

それでは、当直一覧の方の設定戻ります。デザインビューで開きます。

代休が表示されるテキストボックスの上で右クリック「イベントのビルド」⇒「コードビルダ」を選択します。

下の図の部分を「DbClick」を選択します。

引数として渡す文字列を作成します。

strOpenArgs = 技師ID & “,” & CDate([1]) & “,” & “日当直” & “,” & CStr(1)

CDateは、テキストボックスに表示されている文字列を日付型としてCStrは文字列として認識させます。

なので、上記コードでは、代休発生1の部分に表示されている日付を、明示的に日付としています。CStr(1)は代休消化日を登録する際にレコードを検索する為に使用しています。

そして、先ほど作成しフォームを開きます。その際に、今作成した引数を渡します。

Private Sub Ctl10_DblDblClick(Cancel As Integer)
    strOpenArgs = 技師ID &amp; "," &amp; CDate(&#91;10]) &amp; "," &amp; "日当直" &amp; "," &amp; CStr(10)
    DoCmd.OpenForm "F_代休登録", , , , , , strOpenArgs
End Sub

このコードを各テキストボックスに設定していきます。CDate([1]) , CStr(1)内の数字の変更を忘れないでくださいね。

これで、一連の流れは出来上がりました。

広告
HP Directplus -HP公式オンラインストア-


フォーム「代休一覧」の条件付き書式の設定

いよいよ、最終段階に入りました。

代休が0.5日の時の表示設定と、代休消化の指定をした際の表示変更です。

メニューバーの書式を選択します。

まずは、代休消化日の指定をした場合の処理です。

新しいルールを選択します。

書式設定で「式」を選択します。

その右側に以下の式を入力します。

Len(DLookUp(“検索”,”K_代休一覧2″,”日付=#” & [3] & “# and 技師ID = ” & [技師ID] & “”))>10

これは、検索フィールドの文字列が10文字以上の時にテキストボックスの背景色が灰色になるようにしてあります。

同様に0.5日の代休の時は

新規ルールを作成し、式の欄に

DLookUp(“代休”,”calender”,”日付=#” & [3] & “#”)=’0.5′

を入力することで処理が完了です。


いかがでしたか?

これで業務管理のファイル作成は完了です。

かなり長丁場になりました。

お疲れ様でした。

広告
上新電機 パソコン買取サービス
The post microsoft ACCESSで勤務管理⑤~代休発生と消化予定日を登録~ first appeared on 診療放射線技師がPythonをはじめました。.]]>
1347
microsoft ACCESSで勤務管理②~仕様を考える と カレンダー編~ http://radiology-technologist.info/post-1245 Sun, 28 Mar 2021 07:48:09 +0000 http://radiology-technologist.info/?p=1245 microsoftのACCESSで勤務管理というこ […]

The post microsoft ACCESSで勤務管理②~仕様を考える と カレンダー編~ first appeared on 診療放射線技師がPythonをはじめました。.]]>
microsoftのACCESSで勤務管理ということで、前回はACCESSの基本的なところを書いてみました。

今回は、システムをどのような仕様に仕上げていくのかを考えてみたいと思います。


システムの仕様を考える

まずは、最終的な形を考えてみます。

  • 日ごとに日勤者、夜勤者を表示できる
  • 日勤者、夜勤者の変更ができる
  • 技師ごとに代休が発生する日の勤務日数を表示できる
  • 技師ごとに、代休が発生する日勤、夜勤を一覧で表示できる
  • 発生した代休の消化予定を確認できる

をとりあえずの仕様とします。


広告
デル株式会社

システムの流れを考える

仕様ができたところで、システムの大きな流れを考えてみます。

  1. カレンダーの作成
  2. 日勤、夜勤の順番を決める
  3. 設定開始日を決めて順番に技師を割り当てていく
  4. 割り当てたものを1行一日の形式で表示する
  5. 技師ごとに代休発生日を表示
  6. 代休の消化予定日を登録

という流れで行きたいと思います。


カレンダーの作成

テーブルの作成

カレンダーの作成です。まずは、カレンダーのテーブルを作成します。

メニューバー「作成」タブ内のテーブルをクリックします。フィールドの設定していきます。

まずは、使わないかもしれませんがオートナンバー型のIDというフィールドは作成しておきましょう。続いて、日付/時刻型の日付というフィールド。

後は休みの日には代休をカウントするための「代休」というフィールドを数値型で作成。あと、使わないかもしれませんが翌日が代休の時の為のフィールド「翌日代休」も作成します。

続いて、登録方法を考えます。Excel等で作成してインポートというのがシステム側としては一番楽なのですが、使用者を考えると毎月の祝日と祭日を登録していくのは面倒です。なので以下のようなフォームでの登録方法としてみました。


フォームの作成

見た目にはあまりこだわっていないので、センスがないというのは無しで・・・・・。ちなみに、このカレンダーは1年分登録ができるように371個のトグルボタンを配置しました。トグルボタンとは、OnとOffを指定できるボタンです。もし、休日ならばOn平日ならばOffです。

開始日付と終了日付を指定して「作成」ボタンを押すことで日付が書かれたボタンが表示され、休日なら自動でボタンがOnになる仕様です。休日、祭日が間違っていなければ「登録」ボタンでテーブルに登録を行います。

それでは、フォームを作成していきましょう。

まずは、トグルボタンを配置していきます。トグルボタンは上のアイコンになります。日曜日から順に土曜日までを1行になるように7個配置します。

その後は、一行丸ごと選択してコピー&ペーストで複製していきます。

その際、トグルボタン名が「トグル152」「トグル153」のように数字が連番になるように注意してください。

あと、配置したトグルボタンの上に曜日をラベルで配置しておくとわかりやすいです。

終わりましたら続いて、カレンダーを作成する日付と終了する日付を指定します。これはコンボボックスで作成します。

コンボボックスはデザインタブ内の上のアイコンになります。

配置が完了したらプロパティーを開いて書式を「日付(L)」とします。これを終了日も同じように作成します。

続いて、作成ボタンと、登録ボタン、そしてメニューボタンを作成します。

メニューボタンは上の画像のアイコンになります。

3つ配置します。動作は日ほど設定しますのでとりあえずは、配置だけにしておきます。

配置したら、ボタンの上の表題を「作成」、「登録」、「メニュー」としておいてください。

とりあえず、フォームの作成は完了です。保存しましょう。名前に関してはのちにVBAでコードを書いていくのでわかりやすいように「F_calender」としましょう。「F_」はフォームという意味です。のちに組むクエリなのでは「K_」とルールを決めて名前を付けると日にわかりやすくなります。


VBAでコードを書いていく

それでは、コードを書いてきます。

日付を指定して作成ボタンを作成した際に、トグルボタンに日付を表示するわけですが、初めの日が何曜日かを判定してどのトグルボタンから表示していくかを決めます。また、開始日前のトグルボタンは非表示にしておくとわかりやすいのでまずはその処理から始めていきます。


開始日の曜日の取得

作成ボタンの上で右クリックをします。「イベントのビルド」⇒「コードビルダー」を選択します。

以下の画面が出てきます。

もし出てこない場合は、ボタンのプロパティーで「イベント」タブ「クリック時」の[埋め込みマクロ]を削除してください。

ボタンを押したときに、下の画面の

「Private Sub コマンド2_Click()」から「End Sub」までのコードが実行されることになります。

まずは、開始日の曜日を判定するところから始めます。日付の曜日判定にはWeekday()関数を使います。カッコ内に日付を入れることで曜日が数字として返ってきます。返ってくる数値は曜日によって以下の表のようになります。

日曜日
月曜日
火曜日
水曜日
木曜日
金曜日
土曜日

変数startdayとして開始日の曜日を取得します。

startday = Weekday(Me!day_start) – 1

私は、開始日コンボボックス名を「day_start」と変えてしまったので、変更していない方は

startday = Weekday(Me!コンボ1) – 1

に様に、開始日のコンボボックスの名前欄に書かれている名前に書き換えてください。

startday = Weekday(Me!day_start) – 1の「-1」は何をしているのかというと

設置したトグルボタンの始まりが「トグル0」と0から始まっていると思うので-1をしています。

開始日の曜日が取得できたのでトグルボタンの開始日以前のトグルボタンを非表示にする作業をしたいと思います。とりあえず、日曜日から土曜日までのトグルボタンをすべて非表示にします。この作業はfor文を使って繰り返していきます。

Private Sub コマンド2_Click()
    For i = 0 To 6
        Me("トグル" &amp; i).Visible = False
        Next i
End Sub

いざ、フォームを表示して作成ボタンをクリックしてみてください。

フォームを表示するのはツールバーの「ホーム」タブの一番左。フォームビューを選択します。

一番上の行のトグルボタンが消えているのが確認できます。

それでは、曜日によって表示するようにしましょう。先ほど取得した曜日の数字がトグルボタンの数字以上であればトグルボタンを表示するコードを書いていきます。

先ほどのコードに以下を追加します。

For i = 0 To 6
    If startday &lt;= i Then
         Me("トグル" &amp; i).Visible = True
    End If
    Next i

いかがでしょうか?

きちんと木曜日からトグルボタンが表示されていると思います。


トグルボタンに日付を表示していく

それでは、トグルボタンに曜日を表示させていきましょう。

これもfor文で終了日まで繰り返していきます。開始日から、終了日までの日数を計算します。diff_dayという変数に入れます。

期間を計算する計算式は以下となります

diff_day = DateDiff(“d”, Me!day_start, Me!day_end)

DateDiff(“d”, 開始日,終了日)で日単位での期間が計算できます。

ちなみに、終了日のコンボボックス名をday_endとしてしまっているのでそこは皆さんの環境によって書き換えてください。

それではfor文で書いていきましょう

以下のコードを追加してください。

diff_day = DateDiff("d", Me!day_start, Me!day_end)

For i = 0 To diff_day + 1

    Me("トグル" &amp; startday + i).Caption = Format(day_start + i, "mm/dd")
    next i

きちんとトグルボタンに日付が表示されたと思います。なお、期間+1日まで日付を表示したのはちょっと分け合ってですが、そこは後々書きます。


休日設定

日付の表示までできましたが、いちいち休日の日のボタンを押していくのは面倒なのでプログラムで解決してしまいましょう。

まずは、日曜日の設定ですが、初めに出てきたweekday関数で簡単に解決できます。

If Weekday(day_start + i) - 1 = 0 Then Me("トグル" &amp; startday + i).Value = True

当院は、第2土曜日が休診日になるのでその設定をします。

第2土曜日の判定をするのは先ほどのweekday関数で戻り値が土曜日である6であることと、第2週目であることで判定します。

第2週目ということを判定するのは日付を7で割った答えが2であればいいのですが、単純にやってしまうと間違ってしまいます。

まずは、日付に6を足してあげる必要があります。例えば、1日が土曜日であった場合、7で割ると0になってしまい、次の週の8日が1週目となってしまいす。そのため、日付に6を足してあげて7で割ることで何週目かを求めることができます。

第2土曜日を判定するコードは以下となります。

If Weekday(day_start + i) - 1 = 6 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" &amp; startday + i).Value = True

次に各月での祝祭日の設定になります。これは、月によって処理を変えていきますので「select case」の関数によって処理を変えていきます。

'各祝祭日設定
        Select Case Month(day_start + i)
            Case 1
                If Day(day_start + i) = 1 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 2 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 3 Then Me("トグル" &amp; startday + i).Value = True
                If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" &amp; startday + i).Value = True
                If Weekday(day_start + i) - 1 = 6 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" &amp; startday + i).Value = True

            Case 2
                If Day(day_start + i) = 11 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 23 Then Me("トグル" &amp; startday + i).Value = True

            Case 3
                If Day(day_start + i) = 21 Then Me("トグル" &amp; startday + i).Value = True

            Case 4
                If Day(day_start + i) = 29 Then Me("トグル" &amp; startday + i).Value = True

            Case 5
                If Day(day_start + i) = 3 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 4 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 5 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 15 Then Me("トグル" &amp; startday + i).Value = True

            Case 7
                If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 3 Then Me("トグル" &amp; startday + i).Value = True

            Case 8
                If Day(day_start + i) = 11 Then Me("トグル" &amp; startday + i).Value = True

            Case 9
                If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 3 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 22 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 23 Then Me("トグル" &amp; startday + i).Value = True

            Case 10
                If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" &amp; startday + i).Value = True

            Case 11
                If Day(day_start + i) = 3 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 23 Then Me("トグル" &amp; startday + i).Value = True

            Case 12
                If Day(day_start + i) = 29 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 30 Then Me("トグル" &amp; startday + i).Value = True
                If Day(day_start + i) = 31 Then Me("トグル" &amp; startday + i).Value = True


        End Select

いかがでしょうか?きちんと休日、祭日の設定ができていますね。

もし、間違っていた場合はトグルボタンで作成しているので変更が可能になっています。

ちなみに、終了日以降のトグルボタンの非表示は面倒になってしまったので省略してしまいました……


テーブルへの登録

カレンダーの表示は完了しましたが、テーブルへの登録が完了していませんのでこれからはカレンダーへの登録をしていきます。

コードとしてはSQL文を使って登録をしていきます。

テーブルへのデータ登録を行うSQL文はINSERT文を使います。

INSERT INTO 登録するテーブル ([フィールド1],[フィールド2],[フィールド3]) VALUES(値1,値2,値3)

これを変数に入れ、VBAで実行する形となります。

テーブル「calender」への登録は日付、代休、翌日代休を登録していきます。

登録していく日付はトグルボタンに表示されている日付を登録し、トグルボタンがTRUEの場合は、holidayという変数を1にします。翌日の代休に関しては次のトグルボタンの状態を見て判断をします。

なお、土曜日に当直の場合0.5日分の代休が発生するので、土曜日の場合は初めにholidayの変数に0.5を代入し、第2土曜日であればholidayに1に変更するという作業にします。

'当日の代休設定
        If Weekday(day_start + i) = 7 Then holiday = 0.5
        If Me("トグル" &amp; startday + i).Value = True Then holiday = 1
'翌日の代休設定
        If Weekday(day_start + i) + 1 = 7 Then next_holiday = 0.5

        If Me("トグル" &amp; startday + i + 1).Value = True Then next_holiday = 1

そうしましたらSQL文を作成、実行します。

'sql実行
        sql_insert = "INSERT INTO calender (&#91;日付],&#91;代休],&#91;翌日代休]) VALUES (#" &amp; Me!day_start + i &amp; "# , " &amp; holiday &amp; " , " &amp; next_holiday &amp; ")"
        DoCmd.RunSQL sql_insert

上記コードをfor文を使って設定したい日数分だけ繰り返します。

なお、最終日は翌日の代休が分からないのでわざと1日カレンダーの作成を行いました。そして、テーブルへの登録を行う際に登録回数を1回減らすことで登録日数分にします。

いかに登録ボタンが押された時のコードを書きます。

Private Sub コマンド397_Click() '登録ボタン
    Dim startday As Integer
    DoCmd.SetWarnings WarningsOn:=False
    
    startday = Weekday(Me!day_start) - 1
    diff_day = DateDiff("d", Me!day_start, Me!day_end)
    
    holiday = 0
    next_holiday = 0
    
    For i = 0 To diff_day 
    
        insert_day = day_start + i
        
        today_week = Weekday(day_start + i)
        
        '当日の代休設定
        If Weekday(day_start + i) = 7 Then holiday = 0.5
        If Me("トグル" &amp; startday + i).Value = True Then holiday = 1
            
        
        '翌日の代休設定
        If Weekday(day_start + i) + 1 = 7 Then next_holiday = 0.5
        
        If Me("トグル" &amp; startday + i + 1).Value = True Then next_holiday = 1
        
        'sql実行
        sql_insert = "INSERT INTO calender (&#91;日付],&#91;代休],&#91;翌日代休]) VALUES (#" &amp; Me!day_start + i &amp; "# , " &amp; holiday &amp; " , " &amp; next_holiday &amp; ")"
        DoCmd.RunSQL sql_insert
        
        holiday = 0
        next_holiday = 0
    Next i
End Sub


広告
HP Directplus -HP公式オンラインストア-

動作確認

それでは、動作確認をしてみましょう。

フォームビューで開いて、開始日と終了日をしていします。

その後、作成ボタンを押してください。

休日設定が間違っていなければ登録ボタンを押すことでテーブルに登録されます。

calenderのテーブルを開いてきちんと登録されているか確認してみてください。

いかがでしたか?

次回は当直順を決め、それを順番に埋めていき当直表を作成する作業を紹介したいと思います。

お疲れ様でした。

広告
上新電機 パソコン買取サービス
The post microsoft ACCESSで勤務管理②~仕様を考える と カレンダー編~ first appeared on 診療放射線技師がPythonをはじめました。.]]>
1245