【Access VBA】テキストボックスの文字数を全角2バイト、半角1バイトとして制限する

テキストボックスの文字数を全角2バイト、半角1バイトとして制限する


標準モジュールに下記コードを記述します。

Function LimitedString(inString As String, LenMax As Byte) As String

'
'
'  テキストボックスに入力された文字列の,文字数を制限する。
'  全角文字を2,半角文字を1と計算する。
'  全角文字の 2byte 中最後の 1byte が、文字数制限を超えたときは,
'  最後の全角文字を削除する。
' 引数)
'  InString : 入力済み文字列
'  LenMax   : 制限するByte数
'
' 返り値)
'  制限数で後ろが切り取られた文字列
'
'

    Dim WorkStringUni As String
    Dim WorkStringSys As String
   
    WorkStringUni = inString
       
    If LenB(StrConv(WorkStringUni, vbFromUnicode)) > LenMax Then
        WorkStringSys = StrConv(WorkStringUni, vbFromUnicode)
        WorkStringSys = LeftB(WorkStringSys, LenMax + 1)
        WorkStringUni = StrConv(WorkStringSys, vbUnicode)
        WorkStringUni = Left(WorkStringUni, (Len(WorkStringUni) - 1))
    End If
   
    LimitedString = WorkStringUni
   
End Function

下記サイトよりコピペしました。
MS Access:入力文字数を制限する(半角:1,全角:2で) | 戯れ言葉
テキストボックスの変更時のイベントプロシージャに下記コードを記述します。

Private Sub txtSample_Change()
    Dim MaxTxtBytes As Byte
    MaxTxtBytes = 10
    If txtSample.Text <> "" Then
        txtSample = LimitedString(txtSample.Text, MaxTxtBytes)
        txtSample.SelStart = txtSample.SelLength
    End If
End Sub

【Access VBA】レポートのセルを結合したように見せる

レポートのセルを結合したように見せる



レコードソースの準備

下のようなレコードソースを用意しました。


レポートの作成

下のようなレポートを作成しました。
詳細セクションの明細番号テキストボックスから数量テキストボックスまでをまたぐように別のテキストボックス(名前:txtBack)を配置します。このテキストボックスに1行おきに背景色を設定します。
罫線の部分に赤色の直線と緑色の直線(名前:lineDate)および水色の直線(名前:bottomLine)を配置しています。
日付が1行上のレコードと同じ場合に緑色の直線を非表示にし、日付の文字を白色にします。
水色の直線はページが2ページ以上になるとき最終ページ以外のページの一番下の罫線になります。

レポートの読み込み時とクリック時および日付ヘッダーのフォーマット時のイベントプロシージャに以下のコードを記述します。
印刷時に指定行数になるまで空白行を出力します。空白行のテキストボックスを非表示にするため、すべてのテキストボックスにタグを設定しています。

Private intCount As Integer 'レポートのレコード件数格納用変数
Private n As Integer '行番号格納用変数
Private dDate As Date '1行上の日付格納用変数
Private lngNo As Long '明細番号格納用変数
Const printRec As Integer = 20 '印刷する行数

Private Sub Report_Load()
    intCount = DCount("明細番号", Me.RecordSource)
    n = 0
    dDate = 0
    Me![日付].Visible = True
    Me!lineDate.Visible = True
    Call SetTextBox(True)
End Sub

Private Sub Report_Click()
    n = 0
    dDate = 0
    Me![日付].Visible = True
    Me!lineDate.Visible = True
    Call SetTextBox(True)
End Sub

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer) 
    intCount = DCount("明細番号", Me.RecordSource) 
    n = 0
    dDate = 0
    Me![日付].Visible = True
    Me!lineDate.Visible = True
    Call SetTextBox(True)
End Sub

Private Sub SetTextBox(ByVal flag As Boolean)
    Dim ctl As Control
    For Each ctl In Me.Section(0).Controls
        If ctl.Tag = "表示" Then
            ctl.Visible = flag
        End If
    Next
End Sub

詳細セクションの描画時のイベントプロシージャに下記コードを記述します。

Private Sub 詳細_Paint()
    Me!bottomLine.BorderStyle = 0
    n = n + 1
    If n = 1 Then
        lngNo = Me![明細番号]
    End If
    If Me![明細番号] = lngNo Then
        dDate = 0        
        n = 1
    End If
    If n Mod 2 = 0 Then '1行おきにレコードの背景色を設定
        Me!txtBack.BackColor = RGB(235, 241, 222)
    Else
        Me!txtBack.BackColor = RGB(255, 255, 255)
    End If
    If Me![日付] = dDate Then '日付が上の行と同じときは非表示
        Me![日付].ForeColor = vbWhite
        Me!lineDate.BorderStyle = 0
    Else
        Me![日付].ForeColor = vbBlack
        Me!lineDate.BorderStyle = 1
    End If
    dDate = Me![日付]
End Sub

レポートビューを表示すると下のようになります。

詳細セクションのフォーマット時のイベントプロシージャに下記コードを記述します。

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    n = n + 1
'----------空白行の設定---------------------------------
    If n Mod printRec > 0 Then
        If n < intCount Then
            Me.NextRecord = True
            Call SetTextBox(True)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        ElseIf n = intCount Then
            Me.NextRecord = False
            Call SetTextBox(True)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        ElseIf n > intCount Then
            Me.NextRecord = False
            Call SetTextBox(False)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        End If
    Else
        If n < intCount Then
            Me.NextRecord = True
            Call SetTextBox(True)
            Me!bottomLine.Visible = True
            Me!bottomLine.BorderStyle = 1
            Me![newPage].Visible = True
        ElseIf n = intCount Then
            Me.NextRecord = True
            Call SetTextBox(True)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        ElseIf n > intCount Then
            Me.NextRecord = True
            Call SetTextBox(False)
            Me!bottomLine.Visible = False
            Me![newPage].Visible = False
        End If
    End If
'-------------------------------------------------------
    If n Mod 2 = 0 Then '1行おきにレコードの背景色を設定
        Me!txtBack.BackColor = RGB(235, 241, 222)
    Else
        Me!txtBack.BackColor = RGB(255, 255, 255)
    End If
    If Me![日付] = dDate Then '日付が上の行と同じときは非表示
        Me![日付].Visible = False
        Me!lineDate.Visible = False
    Else
        Me![日付].Visible = True
        Me!lineDate.Visible = True
        Me!lineDate.BorderStyle = 1
    End If
    If n Mod printRec = 1 Then '1行目は必ず表示する
        Me![日付].Visible = True
        Me!lineDate.Visible = True
        Me!lineDate.BorderStyle = 1
        Me![日付].ForeColor = vbBlack
    End If
    If n = intCount + 1 Then '最終行の日付の下側の罫線を表示
        Me!lineDate.Visible = True
        Me!lineDate.BorderStyle = 1
    End If
    dDate = Me![日付]
End Sub

印刷すると下のように出力されます。

【Access VBA】テキストボックスに日付しか入力できないようにする

クリップボードに日付型データが入っている場合のみ日付型テキストボックスの右クリックメニューの「貼り付け」を有効にする

クリップボードに日付型データが入っている場合は日付型テキストボックスの右クリックメニューの「貼り付け」を有効にし、クリップボードに日付型データが入っていない場合は日付型テキストボックスの右クリックメニューの「貼り付け」を無効にします。



クリップボードのデータを取得する関数の記述

標準モジュールにクリップボードのデータを取得する関数を記述します。

Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClipboardData Lib "user32.dll" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As LongPtr, ByVal lpString2 As LongPtr) As LongPtr

Public Function GetClipboard() As String
    Dim iStrPtr As LongPtr
    Dim iLen As LongPtr
    Dim iLock As LongPtr
    Dim sUniText As String
    Const CF_UNICODETEXT As LongPtr = 13&
    OpenClipboard 0&
    If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
        iStrPtr = GetClipboardData(CF_UNICODETEXT)
        If iStrPtr Then
            iLock = GlobalLock(iStrPtr)
            iLen = GlobalSize(iStrPtr)
            sUniText = String$(CLng(iLen \ 2& - 1&), vbNullChar)
            lstrcpy StrPtr(sUniText), iLock
            GlobalUnlock iStrPtr
        End If
        GetClipboard = sUniText
    End If
    CloseClipboard
End Function

下記サイトからコピペしました。
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説


ショートカットメニューの作成

標準モジュールに下記コードを記述します。

Sub CreateShortcutMenu(ByVal SCM As String)
'エラーなら引数のコマンドバーを削除
On Error Resume Next
  CommandBars(SCM).Delete
On Error GoTo 0
' "shortcut"をCommandBarオブジェクト変数に設定 →①
Dim Shortcut As CommandBar
'新しいショートカット型のコマンド バーを作成し、コマンド バーのコレクションに追加。→②
Set Shortcut = CommandBars.Add(SCM, msoBarPopup, False, True)
'作成したコマンドバーにid=19「コピー」コントロール,id=22「貼り付け」コントロールを追加。→③
Shortcut.Controls.Add Type:=msoControlButton, ID:=19, before:=1
Shortcut.Controls.Add Type:=msoControlButton, ID:=22, before:=2
If SCM = "ShortcutMenu_Date" Then 
 If IsDate(GetClipboard) Then
     Shortcut.Controls(2).Enabled = True
 Else
     Shortcut.Controls(2).Enabled = False
 End If
End If
' "shortcut" 変数がCommandbarオブジェクトを参照するのを解除 →④
Set Shortcut = Nothing
End Sub

下記サイトのコードを改変してショートカット型コマンドバーの名前がShortcutMenu_Dateの場合でクリップボードのデータが日付でないときは「貼り付け」を無効にしています。
ランタイム版で右クリックショートカットメニューを使用する 静にして以て幽なり

オブジェクトの参照設定

「ツール」タブの「参照設定」をクリック
   ↓
Microsoft Office ××.× Object Library」をチェック


ショートカットメニュー作成用プロシージャの実行

フォームに下記コードを記述します。

Private Sub Form_Open(Cancel As Integer)
    CreateShortcutMenu ("ShortcutMenu_Date")
    CreateShortcutMenu ("ShortcutMenu_Name")
End Sub


ショートカットメニュープロパティの設定

「ファイル」タブの「オプション」をクリック
   ↓
Accessのオプション」ダイアログボックスを表示
   ↓
「カレントデータベース」をクリック
   ↓
「既定のショートカットメニュー」のチェックを外す
   ↓
フォームのショートカットメニュープロパティで「はい」を選択
   ↓
テキストボックスのショートカットメニューバープロパティにショートカットメニュー名を入力
日付テキストボックス:ShortcutMenu_Date
名前テキストボックス:ShortcutMenu_Name


日付テキストボックスのイベントプロシージャの記述

日付テキストボックスのイベントプロシージャに下記コードを記述します。

Private Sub txtDate_KeyDown(KeyCode As Integer, Shift As Integer)
    KeyCode = 0
End Sub

Private Sub txtDate_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = acRightButton Then
        CreateShortcutMenu ("ShortcutMenu_Date")
    End If
    txtDate.SelStart = 0
    txtDate.SelLength = Len(Nz(txtDate.Text))
End Sub

【Access VBA】ショートカットメニュー表示を特定のコントロールに限定する

ショートカットメニュー表示を特定のコントロールに限定する

テキストボックスを右クリックしたときはショートカットメニューを表示し、フォームを右クリックしたときはショートカットメニューを非表示にします。


テキストボックスを右クリックしたときに表示するショートカットメニューの作成

標準モジュールに下記のコードを記述します。

Sub CreateShortcutMenu()
'エラーなら"ShortcutMenu"というコマンドバーを削除
On Error Resume Next
  CommandBars("ShortcutMenu").Delete
On Error GoTo 0
' "shortcut"をCommandBarオブジェクト変数に設定 →①
Dim Shortcut As CommandBar
'新しい”ShortcutMenu”という名前のショートカット型のコマンドバーを作成し、コマンドバーのコレクションに追加。→②
Set Shortcut = CommandBars.Add("ShortcutMenu", msoBarPopup, False, True)
'作成したコマンドバーにid=19「コピー」コントロール,id=22「貼り付け」コントロールを追加。→③
Shortcut.Controls.Add Type:=msoControlButton, ID:=19
Shortcut.Controls.Add Type:=msoControlButton, ID:=22
' "shortcut" 変数がCommandbarオブジェクトを参照するのを解除 →④
Set Shortcut = Nothing
End Sub

下記サイトからコピペしました。
ランタイム版で右クリックショートカットメニューを使用する 静にして以て幽なり

オブジェクトの参照設定

「ツール」タブの「参照設定」をクリック
   ↓
Microsoft Office ××.× Object Library」をチェック

ショートカットメニュー作成用プロシージャの実行

フォームに下記コードを記述します。

Private Sub Form_Open(Cancel As Integer)
CreateShortcutmenu 'プロシージャ名を書くだけ
End Sub


ショートカットメニュープロパティの設定

「ファイル」タブの「オプション」をクリック
   ↓
Accessのオプション」ダイアログボックスを表示
   ↓
「カレントデータベース」をクリック
   ↓
「既定のショートカットメニュー」のチェックを外す
   ↓
フォームのショートカットメニュープロパティで「はい」を選択
   ↓
テキストボックスのショートカットメニューバープロパティにショートカットメニュー名(ShortcutMenu)を入力

【Access VBA】カレンダーコントロールの作成

カレンダーコントロールの作成

ボタンをクリックするとカレンダーコントロールが表示され、カレンダーコントロールの日付をクリックすると、テキストボックスに日付が入力されます。

フォームの作成

フォームを2個用意します。
Fサンプルフォームにテキストボックス1個とボタン1個を配置します。


Fカレンダーフォームにテキストボックス1個、コンボボックス1個、ボタン4個を配置します。
ボタンのタグに「Up」または「Down」を記述します。クラスでどちらのボタンが押されたのか判別するのに使用します。




ラベルコントロールの作成

標準モジュールに下記のコードを記述し、実行するとラベルが生成します。
冒頭の宣言セクションでSleep関数の参照を宣言しています。スピンボタンの処理で使用します。
宣言セクションのPublic変数はカレンダーコントロールで選択した日付を格納するために使います。

Option Compare Database
Option Explicit
#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Public sDate As Date 'カレンダーコントロールで選択した日付を格納する変数
Private Sub ラベルコントロール作成()
    DoCmd.OpenForm "Fカレンダー", acDesign
    Dim lbl As Control
    Dim i As Integer, j As Integer, c As Integer
    Dim dayOfWeek() As Variant
    dayOfWeek = Array("日", "月", "火", "水", "木", "金", "土")
    Const leftMgn As Single = 0.2 '左余白(cm)    
    Const topMgn As Single = 1.2 '上余白(cm)    
    Const lblMgn As Single = 0.1 'ラベル間隔(cm)
    Const lblWidth As Single = 1 'ラベル幅(cm)
    Const lblHeight As Single = 1 'ラベル高さ(cm)
    Const cmTwip As Single = 567 '1cm当たりのtwip
    For i = 1 To 7
        Set lbl = CreateControl("Fカレンダー", acLabel, , , , cmTwip * leftMgn _
                  + (cmTwip * lblWidth + cmTwip * lblMgn) * (i - 1), cmTwip * _
                  topMgn, cmTwip * lblWidth, cmTwip * lblHeight)
        With lbl
            .Caption = dayOfWeek(i - 1)
            .BorderColor = vbBlack
            .BorderStyle = 1
            .ForeColor = vbBlack
            .FontSize = 22
            .TextAlign = 2
            .TopMargin = 50
            .Name = "曜日" & i
        End With
    Next
    c = 1
    For i = 1 To 6
        For j = 1 To 7
            Set lbl = CreateControl("Fカレンダー", acLabel, , , , cmTwip * leftMgn + _
                      cmTwip * (lblWidth + lblMgn) * (j - 1), cmTwip * (topMgn + _
                      lblHeight + lblMgn) + (i - 1) * cmTwip * (lblHeight + lblMgn), _
                      cmTwip * lblWidth, cmTwip * lblHeight)
            With lbl
                .BorderColor = vbBlack
                .BorderStyle = 1
                .Name = "日" & c
                c = c + 1
            End With
        Next
    Next
    
    DoCmd.Close acForm, "Fカレンダー", acSaveYes
    DoCmd.OpenForm "Fカレンダー"
End Sub

日付ラベルをクリックしたときの処理の記述

クラスモジュールにclsCalendarを作成し、下記のコードを記述します。

Option Compare Database
Option Explicit
Private WithEvents mLbl As Label
Private mForm As Form
 
Public Sub Bind(ByVal oCtrl As Control, ByVal oForm As Form)
    Set mLbl = oCtrl
    Set mForm = oForm
    mLbl.OnClick = "[EVENT PROCEDURE]"
End Sub
 
Private Sub mLbl_Click()
    sDate = CDate(mLbl.Tag)
    DoCmd.Close acForm, mForm.Name
End Sub 

スピンボタンをクリックしたときの処理の記述

クラスモジュールにclsSpinを作成し、下記のコードを記述します。

Option Compare Database
Option Explicit
Private WithEvents mBtn As CommandButton
Private mTxt As TextBox
Private mCbo As ComboBox
Private mString As String
Private mForm As Form
Private startTime As Double
Private lngSpin As Long
Private mCtrl As Control

Public Sub Bind(ByVal oCtrl As Control, ByVal oForm As Form, ByVal oString As String, ByVal oCommandButton As CommandButton)
    Set mCtrl = oCtrl
    Set mForm = oForm
    mString = oString
    Set mBtn = oCommandButton
    mBtn.OnMouseDown = "[EVENT PROCEDURE]"
    mBtn.OnMouseUp = "[EVENT PROCEDURE]"
End Sub
 
Private Sub mBtn_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    startTime = CDbl(Timer)
    Select Case TypeName(mCtrl)
    Case "TextBox"
        Set mTxt = mCtrl
        lngSpin = Val(mTxt.Value)
    Case "ComboBox"
        Set mCbo = mCtrl
        lngSpin = Val(mCbo.Value)
    End Select
    
    Do Until startTime = 0
                Select Case mBtn.Tag
                Case "Up" 
                    lngSpin = lngSpin + 1
                Case "Down"
                    lngSpin = lngSpin - 1
                End Select
                
                Select Case TypeName(mCtrl)
                Case "TextBox"
                    mTxt = lngSpin & mString
                Case "ComboBox"
                    If lngSpin > 12 Then
                        lngSpin = 1
                        mForm.txtYear = Val(mForm.txtYear) + 1 & "年"
                    End If
                    If lngSpin < 1 Then
                        lngSpin = 12
                        mForm.txtYear = Val(mForm.txtYear) - 1 & "年"
                    End If
                    mCbo = lngSpin & mString
                End Select
                    
                Call mForm.displayLabel(Val(mForm.txtYear), Val(mForm.cboMonth))
                
                If CDbl(Timer) - startTime < 1 Then
                    Sleep (300)
                Else
                    Sleep (50)
                End If
            DoEvents
    Loop
    startTime = 0
End Sub
 
Private Sub mBtn_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    startTime = 0
End Sub

カレンダー表示用ボタンをクリックしたときの処理の記述

Fサンプルフォームのボタンのイベントプロシージャを記述します。

Option Compare Database
Option Explicit
Private Sub btnCalendar_Click()
        sDate = Nz(txtDate, 0)
        DoCmd.OpenForm "Fカレンダー", , , , , acDialog
        If sDate <> 0 Then
            txtDate = sDate
        End If
End Sub

カレンダーフォーム用コードの記述

Fカレンダーに下記のコードを記述します。
冒頭の宣言セクションでクラスのインスタンスを生成しています。

Option Compare Database
Option Explicit
Private aClassCalendar() As New clsCalendar
Private aClassSpin(3) As New clsSpin
 
Private Sub Form_Load()    
    Dim i As Integer
 
    If sDate = 0 Then
        txtYear = Year(Date) & "年"
        cboMonth = Month(Date) & "月"
    Else
        txtYear = Year(sDate) & "年"
        cboMonth = Month(sDate) & "月"
    End If
 
    Call displayLabel(Val(txtYear), Val(cboMonth))
 
    For i = 1 To 12
        cboMonth.AddItem i & "月"
    Next
    For i = 1 To 42    
        ReDim Preserve aClassCalendar(i)
        Call aClassCalendar(i).Bind(Controls("日" & i), Me)
    Next    
    Call aClassSpin(0).Bind(txtYear, Me, "年", btnUpYear)
    Call aClassSpin(1).Bind(txtYear, Me, "年", btnDownYear)
    Call aClassSpin(2).Bind(cboMonth, Me, "月", btnUpMonth)
    Call aClassSpin(3).Bind(cboMonth, Me, "月", btnDownMonth)
End Sub
 
Private Function getFirst(ByVal lngYear As Long, ByVal intMonth As Integer) As Integer
    '1日の曜日を数字で取得
    Dim dateFirst As Date
    dateFirst = DateSerial(lngYear, intMonth, 1)
    getFirst = Weekday(dateFirst)
End Function
 
Public Sub displayLabel(ByVal lngYear As Long, ByVal intMonth As Integer)
    Dim i As Integer, c As Integer
    Dim intFirstday As Integer
    Dim intLastDay As Integer
    Dim targetDate As Date
    
    'ラベルの表示をクリア
    For i = 1 To 42
        Controls("日" & i).Caption = ""
    Next
    '今月の日付の設定
    c = 1
    intFirstday = getFirst(lngYear, intMonth)
    intLastDay = Day(DateSerial(lngYear, intMonth + 1, 1) - 1) - 1
    For i = intFirstday To intFirstday + intLastDay
        Controls("日" & i).Caption = c
        Controls("日" & i).Tag = CStr(DateSerial(lngYear, intMonth, c))
        Controls("日" & i).ForeColor = vbBlack
        Controls("日" & i).FontSize = 22
        Controls("日" & i).TextAlign = 2
        Controls("日" & i).TopMargin = 50
        c = c + 1
    Next
    '前月の日付の設定
    targetDate = DateSerial(lngYear, intMonth, 1) - 1
    c = Day(targetDate)
    For i = intFirstday - 1 To 1 Step -1
        Controls("日" & i).Caption = c
        Controls("日" & i).Tag = CStr(DateSerial(Year(targetDate), _
                                               Month(targetDate), c))
        Controls("日" & i).ForeColor = &HA29D96
        Controls("日" & i).FontSize = 22
        Controls("日" & i).TextAlign = 2
        Controls("日" & i).TopMargin = 50
        c = c - 1
    Next
    '来月の日付の設定
    targetDate = DateSerial(lngYear, intMonth + 1, 1)
    c = 1
    For i = intFirstday + intLastDay + 1 To 42
        Controls("日" & i).Caption = c
        Controls("日" & i).Tag = CStr(DateSerial(Year(targetDate), _
                                 Month(targetDate), c))
        Controls("日" & i).ForeColor = &HA29D96
        Controls("日" & i).FontSize = 22
        Controls("日" & i).TextAlign = 2
        Controls("日" & i).TopMargin = 50
        c = c + 1
    Next
    '今日の日付のラベルの境界線色を赤色に設定
    If lngYear = Year(Date) And intMonth = Month(Date) Then
        Controls("日" & Day(Date) + getFirst(Year(Date), Month(Date)) - 1).BorderColor _
        = vbRed
    Else
        Controls("日" & Day(Date) + getFirst(Year(Date), Month(Date)) - 1).BorderColor _
        = vbBlack
    End If
End Sub

Private Sub cboMonth_Change()
    Call displayLabel(Val(txtYear), Val(cboMonth))
End Sub