ロゴ(青) Excel/VBA Tips ロゴ(緑)

Tips06-2: カレンダーコントロール色々(MSCAL 利用例)

Access 付属の【 MSCAL.ocx 】

[Windows98SE/Access2000]の環境では、[MSCAL]の
ヘルプは下記の場所にあります。
ショートカットを作っておくと便利でしょう。
[ C:\Program Files\Microsoft Office\Office\MSCAL.hlp ]


    (注) Access2010 から MSCAL.ocx が無くなりましたので、Excel 2010(Office 2010 Pro) では
          カレンダーコントロールは利用できません。


  --- イベント ---
  Click / DblClick
  [日]をマウスでクリック/ダブルクリックした際に発生
  KeyDown / KeyUp / KeyPress
  [日]をキーボードで選択した際に発生
  BeforeUpdateAfterUpdate
  選択された[日]が変わった際に、Valueプロパティ変更される前後で発生
  NewYear / NewMonth
  表示月が変わって、年/月が変わった際に発生
  --- メソッド ---
  Today
  本日日付の月を表示し、本日日付を選択する。
  [Value]プロパティに本日日付を代入するのと同義
  NextYear/PreviousYear
  表示月を [翌年] [前年] に変更する
  NextMonth/PreviousMonth
  表示月を [翌月] [前月]に変更する
  NextWeek/PreviousWeek
  選択されている[日]を翌週(↓)/先週(↑) に動かす
  NextDay / PreviousDay
  選択されている[日]を翌日(→)/前日(←)に動かす
  Refresh
  カレンダーを再描画する
  AboutBox
  カレンダーコントロールのバージョン情報ボックスを表示
  --- プロパティ ---
  BackColor
  カレンダー全体の背景色
  Day / Month / Year / Value
  選択された[日]の『日/月/年』およびシリアル値
  DayFont / DayFontColor
  [曜日]タイトルのフォント
  DayLength
  [曜日]タイトルの日本語/英語 表記
  カレンダーコントロールのバージョンによって、互換性に問題があります。
  MSCAL Ver 〜9  「0(日), 1(S), 2(Sun)」
  MSCAL Ver10〜 「0(日曜日), 1(日), 2(Sunday), 3(Sun)」
  英語版 Excel  「0(S), 1(Sun), 2(Sunday)」
  MonthLength
  [月]の日本語/英語 表記
  日本語版 0( 1月 2月 3月‥‥   ), 2( January  February  March ‥‥ )
  英語版    0( Jan  Feb  Mar ‥‥ ), 2( January  February  March ‥‥ )
  FirstDay
  カレンダーの左端に来る曜日
  カレンダーコントロールのバージョンによって、互換性に問題があります。
  MSCAL Ver 〜9  「1(), 2(月), ‥‥ 6(金), 7()」
  MSCAL Ver10〜 「1(月), 2(火), ‥‥ 6(), 7()」
  GridFont / GridFontColor
  [日]のフォント
  GridCellEffect
  [日]の表示形式(フラット、 凸、 凹)
  GridLineColor
  [日]の表示形式をフラットにした場合の境界線カラー
  ShowHorizontalGrid
  ShowVerticalGrid
  [日]の表示形式をフラットにした場合の境界線表示有無
  TitleFont / TitleFontColor
  タイトル表示の[年] [月]のフォント
  ValueIsNull
  [日]選択時は False 、未選択時は True 。True の代入で選択解除できる。
  ShowTitle
  タイトル表示の[年] [月]の表示有無
  ShowDays
  [曜日]タイトルの表示有無

  カレンダーコントロールのバージョンによって、互換性に問題があります。
      Access2000以前の[9.0]Access2002以降の[10.0]では、同じ値でも結果が
      異なります(2004/2/9 追記)
      参考HP : すぐに役立つエクセルVBAマクロ集 ( 解説ページ )
          [ACC2002]カレンダーコントロールのプロパティの設定値で異なる結果が表示
          補) [DayLength]の「設定値と表示内容」が上記で異なっていますが 『すぐに役立つ』の方が正しいです。
  Excel側から見た場合、Excel2000だから[MSCAL 9.0]、Excel2002だから[MSCAL 10.0]と確実
        には言えません。例えば[OFFICE2002Personal + Access2000]という環境ならば、Excel2002で
        あっても、MSCALはVer9 です。したがって、Excel/VBAにおいて[Application.Version]を使って
        設定値を切り換えるという方法は100%の解決法とは言えません(どのPCにも OFFICE-Pro が
        入っていて、Excel とAccess のバージョンが同じという環境ならば大丈夫です)。

        この不具合を完全に回避するには「MSCALそのもののバージョンを取得」する必要があります。



'---- OptionButtonで指定 -----------------
Private Sub UserForm_Initialize()
  Calendar1.Value = Date
End Sub

Private Sub Calendar1_Click()
  If (OptionButton1.Value = True) Then
    TextBox1.Value = Format(Calendar1.Value, "yyyy/m/d")
  ElseIf (OptionButton2.Value = True) Then
    TextBox2.Value = Format(Calendar1.Value, "yyyy/m/d")
  ElseIf (OptionButton3.Value = True) Then
    TextBox3.Value = Format(Calendar1.Value, "yyyy/m/d")
  ElseIf (OptionButton4.Value = True) Then
    TextBox4.Value = Format(Calendar1.Value, "yyyy/m/d")
  Else
  End If
End Sub



'----- 直前のControlで振り分け -----
Private strCalendarTarget As String

Private Sub UserForm_Initialize()
  Calendar1.Value = Date
  strCalendarTarget = ""
End Sub

Private Sub TextBox1_Enter()
  strCalendarTarget = "TextBox1"
End Sub

Private Sub TextBox2_Enter()
  strCalendarTarget = "TextBox2"
End Sub

Private Sub TextBox3_Enter()
  strCalendarTarget = ""    '日付入力欄ではないのでクリア
End Sub

Private Sub Calendar1_Click()
  If (strCalendarTarget <> "") Then
    Me.Controls(strCalendarTarget).Value = Format(Calendar1.Value, "yyyy/m/d")
  Else
    '直前のコントロールが日付入力欄ではない
  End If
End Sub



'----- カレンダーフォーム呼び出し関数(標準モジュール) ----------
Public Function CalendarDate(ByRef CalDate As Date) As Boolean
  Load frmCalendar
  With frmCalendar
    .Calendar1.Value = CalDate
    .Show
    If (.Calendar1.ValueIsNull = True) Then
      CalendarDate = False    '日付入力キャンセル
    Else
      CalendarDate = True
      CalDate = .Calendar1.Value
    End If
  End With
  Unload frmCalendar
End Function

'---- カレンダーフォームモジュール(frmCalendar) -----
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If (CloseMode = vbFormControlMenu) Then
    Cancel = True    '閉じるのを[Hide]で行なう為に[X]ボタンは不可
  End If
End Sub

Private Sub cmdCancel_Click()
  Calendar1.ValueIsNull = True
  Me.Hide    '呼び元でアクセスできるように[Hide]
End Sub

Private Sub Calendar1_Click()
  Me.Hide    '呼び元でアクセスできるように[Hide]
End Sub

'----- カレンダーフォーム利用(ユーザーフォームから利用) ----------
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyDate As Date
  If IsDate(TextBox1.Value) Then
    MyDate = CDate(TextBox1.Value)
  Else
    MyDate = Date
  End If
  If (CalendarDate(MyDate) = True) Then
    TextBox1.Value = Format(MyDate, "yyyy/m/d")
  End If
  Cancel = True
End Sub

Private Sub TextBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim MyDate As Date
  If IsDate(TextBox2.Value) Then
    MyDate = CDate(TextBox2.Value)
  Else
    MyDate = Date
  End If
  If (CalendarDate(MyDate) = True) Then
    TextBox2.Value = Format(MyDate, "yyyy/m/d")
  End If
  Cancel = True
End Sub

'----- カレンダーフォーム利用(シートから利用 ダブルクリックで表示) ----------
Private Sub Worksheet_BeforeDoubleClick (ByVal Target As Range, Cancel As Boolean)
Dim MyDate As Date
  If (Target.Column = 2) Then    '(B列)
    If IsDate(Target.Text) Then
      MyDate = CDate(Target.Text)
    Else
      MyDate = Date
    End If
    If (CalendarDate(MyDate) = True) Then
      Target.Value = MyDate
    End If
    Cancel = True
  Else
  End If
End Sub

'----- カレンダーフォーム利用(シートから利用 右クリックで表示) ----------
Private Sub Worksheet_BeforeRightClick (ByVal Target As Range, Cancel As Boolean)

    〜〜 中のコードはダブルクリックと同じ 〜〜

End Sub

'----- カレンダーフォーム利用(シートから利用 セル選択で表示) ----------
Private Sub Worksheet_SelectionChange (ByVal Target As Range)
Dim MyDate As Date
  If (Target.Column = 2) Then    '(B列)
    If IsDate(Target.Text) Then
      MyDate = CDate(Target.Text)
    Else
      MyDate = Date
    End If
    If (CalendarDate(MyDate) = True) Then
      Target.Value = MyDate
    End If
    'Cancel = True    '←Cancel は不用
  Else
  End If
End Sub



 Home   Back Page   

ロゴ(ゴールド)   ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2001 Allrights Reserved.