質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

7805閲覧

access カレンダー 常に表示する

yama0131

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/03/11 01:24

編集2020/03/11 02:21

前提・実現したいこと

https://hatenachips.blog.fc2.com/blog-entry-191.html
こちらのサイトを参考にして、常に表示されるカレンダーを作成しています。
(access2007までにあったカレンダコントロールのようなものです。)

上記サイトで紹介されているものは、日付の入ったテキストボックスをクリック時にその日付を取得して
カレンダーフォームを開き、カレンダーをクリックしてテキストボックスに日付を反映させています。

日付のテキストボックスをクリックしてカレンダーを表示するのではなく、
常にカレンダー表示して、クリックした際に日付のテキストボックスに日付を反映させてあげたいと思っています。

追記
サブフォームとして、ほかのフォームにカレンダーを張り付けてカレンダーを利用したいと考えています。

発生している問題・エラーメッセージ

該当のソースコード

VBA

1 2'フォーム 開くとき 3Private Sub Form_Open(Cancel As Integer) 4 Dim i As Integer 5 6 Dim WindowHandle As Long 7 Dim DeviceContextHandle As Long 8 Dim aRect As RECT 9 Dim PixelToInchX As Long 10 Dim PixelToInchY As Long 11 Dim X As Long '左位置 12 Dim Y As Long '上位置 13 Dim WorkAreaRight As Integer 14 Dim WorkAreaBottom As Integer 15 16 WindowHandle = GetFocus() 17 If WindowHandle = 0 Then Exit Sub 18 19 GetWindowRect WindowHandle, aRect 20 21 DeviceContextHandle = GetDC(WindowHandle) 22 PixelToInchX = GetDeviceCaps(DeviceContextHandle, LOGPIXELSX) 23 PixelToInchY = GetDeviceCaps(DeviceContextHandle, LOGPIXELSY) 24 25 X = (aRect.Right / PixelToInchX) * INCH_TO_TWIP 26 Y = (aRect.Top / PixelToInchX) * INCH_TO_TWIP 27 ReleaseDC WindowHandle, DeviceContextHandle 28 29 SystemParametersInfo SPI_GETWORKAREA, 0&, aRect, 0& 30 WorkAreaRight = (aRect.Right / PixelToInchX) * INCH_TO_TWIP 31 WorkAreaBottom = (aRect.Bottom / PixelToInchX) * INCH_TO_TWIP 32 33 34 'ここでフォーカスが来ているテキストボックスの日付を取得していると思うのですが、 35  'テキストボックスをクリックしないでカレンダーを表示させたいので、別の方法で取得したい。 36 Set ctl = Screen.ActiveControl 37 If X + Me.WindowWidth > WorkAreaRight Then X = X - Me.WindowWidth - ctl.Width 38 If Y + Me.WindowHeight > WorkAreaBottom Then Y = WorkAreaBottom - Me.WindowHeight 39 Me.SetFocus 40 DoCmd.MoveSize X, Y 41 42 For i = 1 To 42 43 Me("D" & i).OnClick = "=SetDate(" & i & ")" 44 Next 45 Me.cmdPrev.OnClick = "=MoveMonth(-1)" 46 Me.cmdNext.OnClick = "=MoveMonth(1)" 47 48 If IsDate(ctl.Value) Then 49 SetCalendar CDate(ctl.Value) 50 Else 51 SetCalendar Date 52 End If 53End Sub

試したこと

[Forms]![日報]!日付2.SetFocus
[Forms]![日報]!日付2.Value = "2020/03/11"
Set ctl = Screen.ActiveControl
'別のテキストボックスに日付を入力して、フォーカスをしてみたがctlに日付が入らなかった。

openプロシージャを色々と変更したができなかった。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/03/11 02:08 編集

リンク先では、紐付けるコントロールのイベントから呼び出していると思うんですが、常に表示させるためにこのForm_Openはどのタイミングで呼び出すようにしているんですか?
yama0131

2020/03/11 02:23

説明が足りていませんでした。 カレンダーはサブフォームとして別のフォームに表示したいと考えています。 なので、イベントがあって開くのではなく、別方法で実行できればと思ったのですが 難しいでしょうか。
sazi

2020/03/11 02:45 編集

フォーカス取得時のイベントで開く設定で回答しましたが、そうじゃない場合、一体どこで開く設定を行うつもりですか? リンク先では、activeconntrolで制御しているので、コントロールのイベントでない場合には値を返却するコントロールに結び付ける必要がありますけど、その辺の考慮はどのように?
guest

回答2

0

サブフォームとして、ほかのフォームにカレンダーを張り付けてカレンダーを利用したいと考えています。

下記の手順でどうぞ。

カレンダーダイアログ日付入力関数 祝日表示対応版 - hatena chips
のサンプルデータベースファイルの F_Calendar フォームを使用したいデータベースファイルにインポートします。
名前を F_CalendarSubForm に変更します。

フォームの開くときのイベントプロシージャを削除します。(Private Sub Form_Open(Cancel As Integer)・・・
代わりに下記の関数を貼り付けてください。

vba

1'親フォームから呼び出される初期化関数 2Public Sub Form_Init(DateTextBox As Control) 3 4 Set ctl = DateTextBox 5 Debug.Print Parent.Name 6 Dim i As Integer 7 For i = 1 To 42 8 Me("D" & i).OnClick = "=SetDate(" & i & ")" 9 Next 10 Me.cmdPrev.OnClick = "=MoveMonth(-1)" 11 Me.cmdNext.OnClick = "=MoveMonth(1)" 12 13 If IsDate(ctl.Value) Then 14 SetCalendar CDate(ctl.Value) 15 Else 16 SetCalendar Date 17 End If 18End Sub 19

入力フォームのテキストボックス名を「txt日付」とします。
このフォーム上に F_CalendarSubForm をドラッグ&ドロップしてサブフォームとして配置します。
サブフォームコントロール名は「CalendarSubForm1」とします。
入力フォームの読み込み時のイベントプロシージャを下記のように記述します。

vba

1Private Sub Form_Load() 2 On Error Resume Next 3 Dim F As Form 4 Set F = Me.CalendarSubForm1.Form 5 If Err = 0 Then F.Form_Init Me.txt日付 6End Sub

以上です。

投稿2020/03/11 05:44

hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

良く分かりませんけど、「常に表示」がフォーカスがある時という事なら、フォーカス取得イベントに

=CallCalendar()

とかを設定すれば良いんじゃないでしょうか?

投稿2020/03/11 02:11

sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問