Microsoft Access 掲示板

日付【開始日と終了日】の期間に矢印【⇔】のように表示したい

9 コメント
views
4 フォロー

hatena様

初めまして。
いつも大変勉強になる情報有難うございます。

標記の件、質問です。
”日付”を2分割し、”開始日”と”終了日”としています。
スケジュールの中で”出張”のようなものが発生した場合のためですが、この”開始日”と”終了日”を
挟むように”矢印(⇔)”をカレンダー内に表示することは可能でしょうか?

まだまだVBA初心者なのですが、各日ごと別ラベルを作成し、フォームモジュール内
予定表示プロシージャ SetSchedule() の中にVBAを組み込むということでしょうか?

Furu
作成: 2020/04/02 (木) 09:25:10
最終更新: 2020/04/02 (木) 09:25:10
通報 ...
1

まだまだVBA初心者なのですが、各日ごと別ラベルを作成し、フォームモジュール内
予定表示プロシージャ SetSchedule() の中にVBAを組み込むということでしょうか?

はい、基本はそうなりますね。
どのような表示をご希望かにもよりますが、別ラベルではなく、現状の行事予定ラベルに出力させる方法ではいいかもしれません。
例えば下記のような感じなら、ラベルを追加する必要はないです。

1日2日3日4日5日6日7日
出張⇐========⇒

どのようなレイアウトを考えているのか、もう少し具体的に説明していただけると、
回答しやすいです。

2
名前なし 2020/04/02 (木) 16:43:04 e2559@c90e0

ご返信有難うございます。

ちなみに↑の場合は、単純に”件名”ラベルの中に打ち込む感じでも可能と思っていますが、
コチラのイメージ的には別ラベルで、例えば、エクセルで作成できるガントチャートのような
感じでした。
フォーム内 指定日(”開始日”)をクリックし、予定を入力すると別ラベルに”←”が表示され、
”終了日”を入力すると、別ラベル中間日に”=”と最終日に”→”が表示されるイメージです。

4月
| 1日  | 2日 | 3日 | 4日 | 5日 |
| 出張 |     |     |   |    |
|  ←  |  = |  = |  = |  →  |

どのようなVBAを使用すると可能になるかをご教示いただけると幸いです。

3

それなら比較的に簡単にできそうです。
1日に複数の予定が入ることはないですか。
テーブルのデータ例を何レコードか提示していただけたら、サンプルコードを提示できると思います。

4

ご返信有難うございます。

基本的に1日に複数の予定を入れることは無いです。
テーブルのデータはまだ勉強中というのもあり簡素化しています。
"開始日","終了日","件名","備考"

のみです。
よろしくお願いいたします。

5

ガントチャート表示用のラベルを42個、予定表示のラベルの下に配置してください。
名前は、G1 ~ G42 とします。
文字配置は「中央」にしておくといいと思います。

SetSchedule関数を下記のように修正してください。

Public Sub SetSchedule()
    Dim i As Integer
    For i = 1 To 42
        Me("T" & i).Caption = ""
        Me("G" & i).Caption = ""
    Next
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset( _
        "SELECT 開始日, 終了日, 件名 FROM T_予定 WHERE " & _
        "開始日>#" & FirstDay & "# AND 開始日<=#" & FirstDay + 42 & "#", _
        dbOpenForwardOnly, dbReadOnly)
    Do Until rs.EOF
        Dim BeginI As Long
        BeginI = rs!開始日 - FirstDay
        Me("T" & BeginI).Caption = rs!件名
        If Not IsNull(rs!終了日) Then
            Dim EndI As Long
            EndI = rs!終了日 - FirstDay
            Me("G" & BeginI).Caption = ChrW(8656) '"←"
            Me("G" & EndI).Caption = Me("G" & EndI).Caption & ChrW(8658) '"→"
            For i = BeginI + 1 To EndI - 1
                Me("G" & i).Caption = "="
            Next
        End If
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    
End Sub

これで表示できると思います。
ただし、月またぎの予定は考慮してないので、現状のままだとエラーになるか、表示できないと思いますので、
その辺を考慮した処理を追加する必要があります。

今日のところはここまでで。明日、時間が取れたら、月またぎの部分のコードを追加します。
Furuさんの方でもまずは上記のコードの内容を理解して、可能なら月またぎの処理も考えてみてください。

6
名前なし 2020/04/02 (木) 23:07:06 e2559@c90e0 >> 5

早速のお返事有難うございます。
上記コードを理解できるように努めてみます。

追伸;
ちなみに月跨ぎの場合はエラー表示が出ました。
例えば、
月マタギの”2月”を表示した瞬間、”G59”フィールドが見つかりません。
日付をクリックすると”T43870”フィールドが見つかりません。というのもでした。

お時間の都合が付きましたら、教えていただけると幸いです。

7
hatena 2020/04/03 (金) 09:04:18 修正 >> 6

カレンダーの範囲をまたぐときにも対応できる様に処理を追加しました。

Public Sub SetSchedule()
    Dim i As Integer
    For i = 1 To 42
        Me("T" & i).Caption = ""
        Me("G" & i).Caption = ""
    Next
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset( _
        "SELECT 開始日, 終了日, 件名 FROM T_予定 WHERE " & _
        "終了日>#" & FirstDay & "# AND 開始日<=#" & FirstDay + 42 & "#", _
        dbOpenForwardOnly, dbReadOnly)
    Do Until rs.EOF
        Dim BeginI As Long
        BeginI = rs!開始日 - FirstDay
        If BeginI > 0 Then
            Me("T" & BeginI).Caption = rs!件名
        Else
            Me("T1").Caption = rs!件名
        End If
        
        If Not IsNull(rs!終了日) Then
            If BeginI > 0 Then
                Me("G" & BeginI).Caption = ChrW(8656) '"←"
            Else
                BeginI = 0
            End If
            
            Dim EndI As Long
            EndI = rs!終了日 - FirstDay
            If EndI <= 42 Then
                Me("G" & EndI).Caption = Me("G" & EndI).Caption & ChrW(8658) '"→"
            Else
                EndI = 43
            End If
            For i = BeginI + 1 To EndI - 1
                Me("G" & i).Caption = "="
            Next
        End If
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    
End Sub

下記がサンプルファイルです。

FrmCalendar2.zip

8
名前なし 2020/04/03 (金) 15:05:04 e2559@c90e0 >> 6

早々にご対応いただき有難うございます。
イメージしていたコードより思いの外複雑でしたが、勉強になりました。
今後ともよろしくお願いいたします。

9

解決済みということで、閉じます(凍結)。