Excel VBA質問箱 IV

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

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


10528 / 13644 ツリー ←次へ | 前へ→

【21268】MonthViewのDayBoldプロパティの初期化 びねがっち 05/1/18(火) 10:00 質問[未読]
【21272】Re:MonthViewのDayBoldプロパティの初期化 びねがっち 05/1/18(火) 10:41 発言[未読]
【21281】Re:MonthViewのDayBoldプロパティの初期化 びねがっち 05/1/18(火) 13:16 質問[未読]
【21282】Re:MonthViewのDayBoldプロパティの初期化 IROC 05/1/18(火) 13:26 回答[未読]
【21285】Re:MonthViewのDayBoldプロパティの初期化 びねがっち 05/1/18(火) 13:47 質問[未読]
【21287】Re:MonthViewのDayBoldプロパティの初期化 IROC 05/1/18(火) 14:04 回答[未読]
【21290】Re:MonthViewのDayBoldプロパティの初期化 びねがっち 05/1/18(火) 14:18 お礼[未読]

【21268】MonthViewのDayBoldプロパティの初期化
質問  びねがっち  - 05/1/18(火) 10:00 -

引用なし
パスワード
   はじめまして。よろしくお願い致します。

現在、「営業日マップ」の設定をユーザーに行わせるために MonthView を
フォーム上に配置し、休日に該当する日付を太字とし、日付をクリックする
ことで 休日/営業日 を切り替えさせようと思っています。

そこで、既に用意されている営業日情報を参照して MonthView に
反映させるプロシージャを組み、UserForm_Initialize() から呼び出して
いるのですが、ひとつとして DayBold が反映されていない状態です。
どのような原因が考えられますでしょうか。
また、このような問題を解決されている方がいましたら、教授のほどを
お願い致します。

参考までに、プログラムは次のようになります。

'***************************************************************
' カレンダー初期化テスト
'***************************************************************
Private oSettings As clsSettings ' 各種設定を扱う自作クラス
Private dic As Object ' 営業日情報辞書
' [営業日辞書仕様]
'  Key : #年/月/1# As Date
'  Item(Key) : パラメータ As Long
'
'  パラメータ
'   n ビット目が 1 の場合、Key 年月の n 日が休日。0 の場合は営業日。
'   ...011010 の場合、2、4、5日が休日となる。

'===============================================================
' フォーム初期化
'===============================================================
Private Sub UserForm_Initialize()
 Dim i As Integer, nMonths As Integer
 Dim dDate As Date, dDayFirst As Date

 Set dic = CreateObject("Scripting.Dictionary") ' 辞書インスタンス化
 
 ' カレンダー表示日付範囲取得 ------------------------------------------
 nMonths = MonthView.Columns * MonthView.Rows ' 表示されている月数
 ' 8番目の日付の年と月から最初のついたちの年月(第一表示月)を取得
 dDate = MonthView.VisibleDays(8)
 dDayFirst = DateSerial(Year(oDate),Month(oDate),1) ' 第一表示月
 
 ' 営業日マッピング開始 ------------------------------------------------
 dDate = dDayFirst ' 一時保存用 Date を第一表示月に初期化
 For i = 1 To nMonths
  MapMonthBold Year(dDate), Month(dDate) ' >> 営業日マッピング
  dDate = DateAdd("m",1,dDate) ' 一時 Date + 1月
 Next
End Sub

'===============================================================
' 営業日マッピング
'===============================================================
Private Sub MapMonthBold(ByVal nYear As Integer, ByVal nMonth As Integer)
 Dim i As Integer
 Dim nDayMax As Integer
 Dim lHoliday As Long ' 営業日パラメータ
 Dim dFD As Date

 dFD = DateSerial(nYear, nMonth, 1) ' 1日
 nDayMax = Day(DateAdd("d", -1, DateAdd("m", 1, dFD))) ' 日数

 ' 該当年月の営業日辞書が登録されていない場合にのみ
 ' 辞書にパラメータを登録

 ' 辞書がある
 If dic.Exists(dFD) Then
  lHoliday = dic.Item(dFD)
 ' 辞書がない
 Else
  lHoliday = oSettings.getHoliday(nYear, nMonth)
  dic.Add dFD, lHoliday
 End If

 ' 該当年月全日付について太字設定
 For i = 1 To nDayMax
  ' i ビット目を抽出して値が 0 以外なら休日、0 なら営業日
  If lHoliday And 2 ^ (i - 1) Then
   MonthView.DayBold(DateSerial(nYear, nMonth, i)) = True
  Else
   MonthView.DayBold(DateSerial(nYear, nMonth, i)) = False
  End If
 Next
End Sub
'***************************************************************

ボタンを配置し、UserForm_Initialize() で行っていることをそれに
実装してあげると、正しく太字がマッピングされます。
ステップインを行いながらウォッチウィンドウで MapMonthBold プロシージャ
内の変数を見てみたのですが、一応どの変数も正しい動きをしているようでした。

【21272】Re:MonthViewのDayBoldプロパティの初期化
発言  びねがっち  - 05/1/18(火) 10:41 -

引用なし
パスワード
   自分の質問を見直してみたら、

Private Sub UserForm_Initialize()
 MonthView.DayBold(Date) = True
End Sub

で今日の日付が太字にならないよ、というだけの質問でした。
失礼しました。

【21281】Re:MonthViewのDayBoldプロパティの初期化
質問  びねがっち  - 05/1/18(火) 13:16 -

引用なし
パスワード
   自己解決とまではいきませんが…、回避方法を見つけました。

Activate イベント発生後に MsgBox を表示させ、
フォームの描画が完全に完了してから MonthView.DayBold を行ったところ
太字にできたため、UserForm_Initialize 内で Application.OnTime によって
1 秒遅らせてMonthView.DayBold を行ってみたところ、
なんとかフォーム表示のタイミングからワンテンポ遅れて太字になりました。

友達に配布するものなので、あまり慎重になる必要がないためこれで
一応安心なのですが、よりよい方法がありましたらお教え頂けると嬉しいです。

よろしくお願い致します。

【21282】Re:MonthViewのDayBoldプロパティの初期化
回答  IROC  - 05/1/18(火) 13:26 -

引用なし
パスワード
   Initializeイベントではなく、Activateイベントでためしてみてはどうでしょうか?

【21285】Re:MonthViewのDayBoldプロパティの初期化
質問  びねがっち  - 05/1/18(火) 13:47 -

引用なし
パスワード
   ご回答、ありがとうございます。

▼IROC さん:
>Initializeイベントではなく、Activateイベントでためしてみてはどうでしょうか?

先程 Activate 内で直に書いてみたのですが、うまくいきませんでした。

Kernel32.dll から Sleep を持ってきて Activate 内で 10 秒ほど
停止させてみたのですが、10 秒ほど真っ白のウィンドウが表示された後、
あざ笑うかのように太字なしの MonthView が表示されたため、
Activate は恐らくスケルトンが描かれてから中身を描画する間の
微妙なタイミングで実行されるものだと判断し、諦め
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=21281;id=excel
の方法を取ってみた次第です。
自分は Excel2002 SP3 上で作成しています。

Res:21281 の方法にしても、MonthView 描画前に太字に設定した場合
DayBold の値を取得すると、既に太字にセットされているようなので、
チェックして太字じゃなければ再び太字にし直すということができないので
不安があります。

重ね重ね申し訳ありません。
これからもアドバイス等ございましたら、是非、よろしくお願い致します。

【21287】Re:MonthViewのDayBoldプロパティの初期化
回答  IROC  - 05/1/18(火) 14:04 -

引用なし
パスワード
   >真っ白のウィンドウが表示
DoeventsやRepaintを入れてみるのはどうでしょうか?

【21290】Re:MonthViewのDayBoldプロパティの初期化
お礼  びねがっち  - 05/1/18(火) 14:18 -

引用なし
パスワード
   ▼IROC さん:
>DoeventsやRepaintを入れてみるのはどうでしょうか?

おおっ!できました!

本当にありがとうございます。
大変助かりました。

今後も何卒よろしくお願い致します。

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