Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


892 / 2272 ツリー ←次へ | 前へ→

【9614】カレンダー式スケジュール表について(1) たまお 07/6/26(火) 1:47 質問[未読]
【9615】カレンダー式スケジュール表について(2) たまお 07/6/26(火) 2:01 質問[未読]
【9619】Re:カレンダー式スケジュール表について(2) 小僧 07/6/26(火) 13:04 回答[未読]
【9639】Re:カレンダー式スケジュール表について(2) たまお 07/7/1(日) 23:12 お礼[未読]

【9614】カレンダー式スケジュール表について(1)
質問  たまお  - 07/6/26(火) 1:47 -

引用なし
パスワード
   現在、下記クエリを参考にカレンダー式スケジュール表(記入するための画面)を
作成しております。(詳細は条件をご確認願えたらありがたいです)

● クエリの内容
No_連休 ユーザID  場所  所属  姓名 連休名 日01     D01   CC01 T_色.CD・・・・(略)
-------------------------------------------------------------------
65    a0000001  東京  C所属  高橋 冬休み 12/25(木)  ○    1 ビットマップイメージ
70    a0000001  東京  C所属  高橋 春休み 3/25(金)  ×    2 ビットマップイメージ
75    b0000001  大阪  B所属  河野 夏休み 7/25(水)       1 ビットマップイメージ
75    a0000001  東京  C所属  高橋 夏休み 7/25(水)       1 ビットマップイメージ
-------------------------------------------------------------------
日01:日01〜日17 まであり、日付を表示させるためのフィールド
DD01:スケジュールを記入させるためのフィールドで、DD01〜DD17まである。
CC01:色を表示させるための番号  例えば、1と入れたら、T_色.CDのところに
ビットマップイメージが自動入力される。(1は赤、2は白とする) CC01〜CC17まである。


上記のような感じのクエリで、下記のような感じのカレンダー式スケジュール表を
作成したいものです。

● 画面の内容:単票フォーム

◇記入画面の詳細          No_連休,ユーザID ← 不可視
−−−−−−−−−−−−−−−−−−−−−−−−−−−
場所:                      [保存:コマンドボタン]
姓名:                      [閉じる:コマンドボタン]
−−−−−−−−−−−−−−−−−−−−−−−−−−−
過去の連休名 [夏休み |▼] ← コンボボックスで過去の連休を参照する。(cmb_連休)
−−−−−−−−−−−−−−−−−−−−−−−−−−−
   日    月    火 7/25(水) 7/26(木) 7/27(金) 7/28(土) ←日付を表示
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
7/29(日) 7/30(月) 7/31(火) 8/1 (水) 8/2 (木) 8/3 (金) 8/4 (土)
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
8/5 (日) 8/6 (月) 8/7 (火) 8/8 (水) 8/9 (木) 8/10(金)    土
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
   日    月    火    水    木    金    土
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←記入不要
−−−−−−−−−−−−−−−−−−−−−−−−−−−

● 操作の流れ

例えば、高橋さんがログインした場合、記入画面は、

No_連休 ユーザID  場所  所属  姓名 連休名 日01     D01   CC01 T_色.CD・・・・(略)
--------------------------------------------------------------------------------------------
75    a0000001  東京  C所属  高橋 夏休み 7/25(水)       1 ビットマップイメージ

のみ表示。

そういう流れで進めたいですが、

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
やりたいことは、以下4点です。

(1)記入画面が開いた時に最初に表示されるスケジュールは、「No_連休」が一番
大きい数字で、なおかつ、ログインしたユーザのレコードが表示されるものとする。

(2)スケジュール記入の最初の日を、曜日位置に合わせて第1週に埋め込む。
例えば、夏休みのスケジュール記入の最初の日は、7/25(水)です。
それを第1週の、4番目の位置〜17日分表示させたい。

日    月    火 7/25(水) 7/26(木) 7/27(金) 7/28(土) ←4番目の位置に表示したい

で、過去の連休名というコンボボックスでは、過去の連休を参照するわけですが、
もし、「冬休み」を選択した場合は、最初の日は、12/25(木)です。

したがって、

日    月    火    水 12/25(木) 12/26(金) 12/27(土) ←5番目の位置に表示したい

という風に表示したい。

(3)スケジュール記入対象日以外の日は日付を埋め込まない。

(4)画面を閉じる時は非連結に元に戻す。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

上記内容ですが、最初に設定した日の曜日によって、位置が変わることから、
・日付表示用のテキストボックス(名前:日01〜日17)、
・スケジュール記入用テキストボックス(名前:DD01〜DD17)
・色を表示させるためのビットマップ系のコントロール(bb01〜bb17)

を4週間分配置(非連結状態)して、記入する時は、最初の設定日の曜日を確認(日なら日、木なら木)して、
置くべき位置を指定し、その位置から17日分、連結状態にする。

という感じで、上記4点をプログラムで表現したい。

長文になってしまったので、引き続き投稿させて頂きたいと思います。
申し訳ありません。

【9615】カレンダー式スケジュール表について(2)
質問  たまお  - 07/6/26(火) 2:01 -

引用なし
パスワード
   上記、スケジュールを記入させるためのプログラムを作成してみましたが、
非連結を連結にするための関数は分かっても、

第一週間目のある位置から17日分、非連結を、連結にさせる工夫に悩んで
おりますので教えて頂けると幸いです。

(それ以外の日付表示用テキストボックスは表示しない、
記入用テキストボックスは入力できないようにLockプロパティでロックする)


★ここの部分、読んで頂けるとありがたいです。

そこの部分のプログラム表現で悩んでいます。

非連結:
(1)日付表示用テキストボックス4週間分(日01〜日28)
(2)スケジュール記入用ボックス4週間分(DD01〜DD28)
(3)色表示用ビットマップ系(bb01〜bb28)

上記の非連結コントロールが並んでいる状態で、
曜日を確認し、第1週間目のどこに置くか指定し、その位置から17日分を
連結状態にする。(1)、(2)、(3)のボックスをすべて17日分のみ連結状態に
し、それ以外は、入力不要とする。

例) 日なら1番目に指定、月なら2番目を指定


連結:日01、D01、CC01、日02、・・・17日分

プログラムで表すとしたら、下記のような感じですが、

Me.日01.ControlSource = 日01
Me.DD01.ControlSource = D01
Me.CC01.ControlSource = CC01

For文を使ってまとめられる方法はないでしょうか?


---------------------------------------------
Option Explicit

Private Sub cmb_連休_AfterUpdate()  ←過去の連休を選択

On Error GoTo Err_cmb_連休_AfterUpdate

  If IsNull(cmb_連休) Then     ←空白は禁止
    MsgBox "選択して下さい。", vbCritical, "警告"
    Exit Sub
  End If

  Me.Filter = "ユーザID = '" & str1 & "' And 連休対象 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True
  ↑ログインしたユーザで、かつ、選択した連休名を抽出。

Exit_cmb_連休_AfterUpdate:
  Exit Sub

Err_cmb_連休_AfterUpdate:
  MsgBox "編集中は使えません。" & Chr(13) & "※ 保存してからご利用下さい。", vbExclamation, "通知"
  Resume Exit_cmb_連休_AfterUpdate

End Sub


--------------------------
Private Sub Form_Open(Cancel As Integer)   ←記入画面を開く

  Dim lngGrey As Long   '色を設定する(グレー:記入できないことが分かる)
  Dim inc01 As Variant  '最初に設定した日付を記憶
  Dim days01 As Variant  '曜日を確認する

  Me.RecordSource = "SELECT ・・・・・・"  ←クエリを抽出

  'レコードソースにて、指定したクエリからログインしたユーザのユーザIDを参照し、個人データのみ抽出する
  Me.cmb_連休 = DLookup("[連休対象]", "T_連", "No_連休 = " & DMax("No_連休", "T_連"))
  Me.Filter = "ユーザID = '" & str1 & "' And 連休対象 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True
                 ↑ログインしたユーザIDをstr1に保存している
  '------------------------------------

  '抽出したレコードから、最初の日を確認する。
  No_holi = DMax("No_連休", "T_連")
  inc01 = DLookup("[日01]", "T_連", "No_連休 = " & No_holi)

  '抽出したデータから、日〜土を抽出する。
  days01 = Right(Left(days01, 2), 1) ← 例) 7/25(土) の「土」を抽出したい

  '第一週間目のどこに置くか設定する
★ここの部分

  If inc01 = "日" Then

  ElseIf inc01 = "月" Then

  ElseIf inc01 = "火" Then

  ElseIf inc01 = "水" Then

  ElseIf inc01 = "木" Then

  ElseIf inc01 = "金" Then

  ElseIf inc01 = "土" Then

  End If

End Sub

【9619】Re:カレンダー式スケジュール表について(2)
回答  小僧  - 07/6/26(火) 13:04 -

引用なし
パスワード
   ▼たまお さん:
こんにちは。

申し訳ないのですが、仕様をずらずらと書かれていても
当方にはあまり理解できないので
一部分だけですが回答をさせて頂きます。


>連結:日01、D01、CC01、日02、・・・17日分
>Me.日01.ControlSource = 日01
>Me.DD01.ControlSource = D01
>Me.CC01.ControlSource = CC01
>
>For文を使ってまとめられる方法はないでしょうか?

For i = 1 to 17
    Me.Controls("日" & Format(i, "00")).ControlSource = "日" & Format(i, "00")
    Me.Controls("DD" & Format(i, "00")).ControlSource = "DD" & Format(i, "00")
    Me.Controls("CC" & Format(i, "00")).ControlSource = CC" & Format(i, "00")
Next i

コントロール名とコントロールソース名が一緒ですと
誤作動を発生させる可能性があるので、
テキストボックスの名前は例えば txt日01 とかにしておいた方が無難かもしれませんね。


> Dim inc01 As Variant  '最初に設定した日付を記憶
> Dim days01 As Variant  '曜日を確認する

>  No_holi = DMax("No_連休", "T_連")
>  inc01 = DLookup("[日01]", "T_連", "No_連休 = " & No_holi)
>
>  '抽出したデータから、日〜土を抽出する。
>  days01 = Right(Left(days01, 2), 1) ← 例) 7/25(土) の「土」を抽出したい


以下は強制ではありませんが…。

まず、No_holi のデータ型はどうなっているのでしょう?(恐らく数値型かな)
変数:inc01、days01 についてもVariant型で宣言している為、
コードが見づらいモノになってしまってないでしょうか。

当方であれば、T_連 の 日01 フィールドのデータ型を日付型にして
テキストボックスの書式で m/d(aaa) と設定し表示させ、
VBA のコードでは日付型で受ける方法を取ると思います。

曜日を抽出したければ Format関数で Format([日付],"aaa") で可能ですし、
そもそも

>  If inc01 = "日" Then
>
>  ElseIf inc01 = "月" Then
>
>  ・・・

の箇所ではWeekday関数で数値だけ取ってくれば処理が可能かと思われます。
更にSelect Case 文と合わせて(日01 が日付型だとします)


Dim No_holi As Long
Dim inc01 As Date

  '抽出したレコードから、最初の日を確認する。

  No_holi = DMax("No_連休", "T_連")
  inc01 = "#" & DLookup("[日01]", "T_連", "No_連休 = " & No_holi) & "#"

  Select Case Weekday(inc01)
    Case 1  '----日曜日----

    Case 2  '----月曜日----
    ・
    ・
    ・
    Case 7  '----土曜日----
  End Select


のような使い方ができるのではないでしょうか。

【9639】Re:カレンダー式スケジュール表について(2)
お礼  たまお  - 07/7/1(日) 23:12 -

引用なし
パスワード
   ▼小僧 さん:
遅くなり申し訳ありません。

>For i = 1 to 17
>    Me.Controls("日" & Format(i, "00")).ControlSource = "日" & Format(i, "00")
>    Me.Controls("DD" & Format(i, "00")).ControlSource = "DD" & Format(i, "00")
>    Me.Controls("CC" & Format(i, "00")).ControlSource = CC" & Format(i, "00")
>Next i

Formatを使ってコントロールをまとめる方法があるんですね。
大変、勉強になりました。ありがとうございました。

>当方であれば、T_連 の 日01 フィールドのデータ型を日付型にして
>テキストボックスの書式で m/d(aaa) と設定し表示させ、
>VBA のコードでは日付型で受ける方法を取ると思います。

T_連の、日01フィールド型は12/25(木)という表示形式であれば、
本来は、日付型ですが、以下の理由によりテキスト型にしています。

7/25(水) 7/26(木) 7/27(金) 7/28(土) という表示形式<日01〜日04>もあれば、
連休の事情により、
●:7/25(水) 7/26(木) 7/27(金) 7/28(土) という表示形式にしたい場合も
ありますので、テキスト型にしています。
----------------------------------------------
あと、別件で申し訳ありませんが、スケジュールの記入/閲覧画面に対して
実はイメージをフォームに表示する方法色を表示させるためのテーブル構成に
ついていろいろ考えてみて、以下のホームページの内容の通り変更した。


※ERROR:本文に禁止語句が含まれているため、URLを貼り付けられない
ようなので、大変申し訳ありませんが、

Googleで、「[ACC97] イメージをテーブルに保存せずフォームに表示する方法」と
入れて検索したら、1番目に表示されますので、ご確認下さい。
そのURLのように変更しました。

変更前:
CC  CD          説明
−−−−−−−−−−−−−−−−−−
1   ビットマップイメージ  出社日
2   ビットマップイメージ  連休対象日
−−−−−−−−−−−−−−−−−−

変更後:
CC  P       説明
−−−−−−−−−−−−−−−−−−
1   C:\color1.bmp   出社日
2   C:\color2.bmp   連休対象日
−−−−−−−−−−−−−−−−−−


記入画面は、以下の画面構成ですが、上記のようにテーブル構成にしたため、
色を表示させるものは、日付を表示させるためのテキストボックスの後ろに、
イメージを表示させるためのコントロールを置き、C:\ の下に置いた色ファイルを
読み込む方法でプログラムを作成しました。
そうすることで、以下のサイトのように、Access のテーブルにイメージデータを
保存せずにファイルサイズを小さくできることで対応させて頂きました。

● 画面の内容:単票フォーム

◇記入画面の詳細          No_連休,ユーザID ← 不可視
−−−−−−−−−−−−−−−−−−−−−−−−−−−
場所:                      [保存:コマンドボタン]
姓名:                      [閉じる:コマンドボタン]
−−−−−−−−−−−−−−−−−−−−−−−−−−−
過去の連休名 [夏休み |▼] ← コンボボックスで過去の連休を参照する。(cmb_連休)
−−−−−−−−−−−−−−−−−−−−−−−−−−−
   日    月    火 7/25(水) 7/26(木) 7/27(金) 7/28(土) ←日付を表示
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
7/29(日) 7/30(月) 7/31(火) 8/1 (水) 8/2 (木) 8/3 (金) 8/4 (土)
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
8/5 (日) 8/6 (月) 8/7 (火) 8/8 (水) 8/9 (木) 8/10(金)    土
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
   日    月    火    水    木    金    土
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←記入不要
−−−−−−−−−−−−−−−−−−−−−−−−−−−

No_連休 ユーザID    組織名 姓名   連休   日01   D01  CC01  T_色_1.P    日02
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
60    a000001    □aa○cc AA    盆07   12/27(水)    1    C:\color1.bmp  12/28(木)・・(略)
65    a000001    □aa○cc AA    夏季07  4/25(水)    1    C:\color1.bmp  4/26(木)・・(略)
65    a000002    □aa○cc SS    夏季07  4/25(水)    1    C:\color1.bmp  4/26(木)・・(略)
70    a000001    □aa○cc AA    秋07   7/25(水)    1    C:\color1.bmp  7/26(木)・・(略)
75    a000001    □aa○cc AA    冬07   8/11(土)    2    C:\color2.bmp  8/12(日)・・(略)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

日01〜日17:日付表示
D01〜D17:スケジュール記入用
CC01〜CC17:1を選択したらC:\color1.bmp、2を選択したらC:\color2.bmp

以下プログラムです。
小僧さんのプログラムを参考に、1画面1レコード分に対して、以下、やりたい4点ができるように
色を区別できるように表示できました。


しかし・・・・・・問題が発生。閲覧画面は一覧表示のため、色を
区別できません。
新規ページへ続く・・


Option Compare Database
Dim flgSaveOK As Boolean

Private Sub Form_BeforeUpdate(Cancel As Integer)
  If Not flgSaveOK Then
    Cancel = True
  End If
End Sub

Private Sub Form_Current()

  Dim No_holi As Long
  Dim inc01 As Variant
  Dim days01 As Variant
  Dim i As Integer
  Dim lngGrey As Long

  For i = 1 To 28
    Me.Controls("txt日" & Format(i, "00")).ControlSource = ""
    Me.Controls("txtD" & Format(i, "00")).ControlSource = ""
    Me.Controls("txtD" & Format(i, "00")).Locked = False
    Me.Controls("txtD" & Format(i, "00")).BackColor = RGB(255, 255, 255)
    Me.Controls("連結" & Format(i, "00")).Picture = ""
  Next i

  No_holi = Me.No_連休
  inc01 = DLookup("[日01]", "T_連", "No_連休 =" & No_holi)
  days01 = Left(Right(inc01, 2), 1)
  lngGrey = RGB(219, 215, 218)

  If days01 = "日" Then
    For i = 1 To 17
      Me.Controls("txt日" & Format(i, "00")).ControlSource = "日" & Format(i, "00")
      Me.Controls("txtD" & Format(i, "00")).ControlSource = "D" & Format(i, "00")
      Me.Controls("連結" & Format(i, "00")).Picture = Me.Controls("txtP" & Format(i, "00"))
    Next i
    For i = 18 To 28
      Me.Controls("txtD" & Format(i, "00")).Locked = True
      Me.Controls("txtD" & Format(i, "00")).BackColor = lngGrey
      Me.Controls("連結" & Format(i, "00")).BackColor = lngGrey
    Next i

  ElseIf days01 = "月" Then
  ・・・(略)

End Sub

Private Sub cmb_連休_AfterUpdate()

On Error GoTo Err_cmb_連休_AfterUpdate
  Me.Filter = "ユーザID = '" & str1 & "' And 連休対象 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True

Exit_cmb_連休_AfterUpdate:
  Exit Sub

Err_cmb_連休_AfterUpdate:
  MsgBox "編集中は 検索機能は使えません。", vbExclamation, "通知"
  Resume Exit_cmb_連休_AfterUpdate

End Sub

Private Sub Form_Open(Cancel As Integer)

  Me.ShortcutMenu = False
  DoCmd.MoveSize 2000, 300, 9900, 7500
  Me.RecordSource = "SELECT ・・・略"

  Me.cmb_連休 = DLookup("[連休名]", "T_連", "No_連休 = " & DMax("No_連休", "T_連"))
  Me.Filter = "ユーザID = '" & str1 & "' And 連休対象 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True

End Sub

Private Sub btn_閉じる_Click()
・・略
End Sub

Private Sub btn_保存_Click()
・・略
End Sub

Private Sub Form_Error(DataErr As Integer, Response As Integer)
・・略
End Sub

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
やりたいことは、以下4点です。

(1)記入画面が開いた時に最初に表示されるスケジュールは、「No_連休」が一番
大きい数字で、なおかつ、ログインしたユーザのレコードが表示されるものとする。

(2)スケジュール記入の最初の日を、曜日位置に合わせて第1週に埋め込む。
例えば、夏休みのスケジュール記入の最初の日は、7/25(水)です。
それを第1週の、4番目の位置〜17日分表示させたい。

日    月    火 7/25(水) 7/26(木) 7/27(金) 7/28(土) ←4番目の位置に表示したい

で、過去の連休名というコンボボックスでは、過去の連休を参照するわけですが、
もし、「冬休み」を選択した場合は、最初の日は、12/25(木)です。

したがって、

日    月    火    水 12/25(木) 12/26(金) 12/27(土) ←5番目の位置に表示したい

という風に表示したい。

(3)スケジュール記入対象日以外の日は日付を埋め込まない。

(4)画面を閉じる時は非連結に元に戻す。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

892 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free