全コード
- Option Explicit
- '---------------------------------------
- Dim shpHeight As Long
- Dim shpWidth As Long
- Dim TBT As Long
- Dim YBT As Long
- Dim DBT(1 To 6) As Long
- Dim BL(1 To 7) As Long
- Private Const ColorSunday = vbRed
- Private Const ColorSaturday = vbBlue
- Private Const ColorWeekday = vbBlack
- Private Const ColorPreHome = 5288016
- Private Enum IncFlg
- IncForward = 0
- IncBackward = -1
- End Enum
- Private Const FirstYobi = vbSunday
- Private Const DayStr As String = "d"
- Private Const MonthStr As String = "m"
- Private Const YearStr As String = "yyyy"
- Private Const WeekStr As String = "ww"
- Private StartPosi As Integer
- Private MonthLen As Variant
- Private Yobi(1 To 7) As Variant
- Private DefYear As Integer
- Private DefMonth As Integer
- Private DefDay As Integer
- Private CurDate As Date
- Private CurYear As Integer
- Private CurMonth As Integer
- Private CurDay As Integer
- Private DefFirstYobi As Integer
- Private SelectShape As String
- '---------------------------------------
- Public Sub OpenCalendar()
- Dim I As Integer
- Dim J As Long
- Dim BUF As String
- Call DeleteCal
- '--------月の日数の配列 0はダミー値
- MonthLen = Array(0, 31, 28, 31, 30, 31, 30, _
- 31, 31, 30, 31, 30, 31)
- '--------最初に来る曜日を日曜日に指定
- DefFirstYobi = FirstYobi
- For J = 1 To 7
- Yobi(J) = Left$(WeekdayName(J, FirstDayOfWeek:=DefFirstYobi), 1)
- Next J
- shpHeight = 15
- shpWidth = 35
- TBT = ActiveCell.OffSet(0, 1).Top
- BL(1) = ActiveCell.OffSet(0, 1).Left
- YBT = TBT + shpHeight
- DBT(1) = YBT + shpHeight
- For I = 2 To 6
- DBT(I) = DBT(I - 1) + shpHeight
- Next I
- For J = 2 To 7
- BL(J) = BL(J - 1) + shpWidth
- Next J
- Application.ScreenUpdating = False
- BUF = Replace(StrConv(ActiveCell.Value, vbNarrow), ".", "/")
- If IsDate(BUF) Then
- BUF = CDate(BUF)
- Else
- BUF = Date
- End If
- '--------年月日の要素を取り出す
- DefDay = DatePart(DayStr, BUF)
- DefMonth = DatePart(MonthStr, BUF)
- DefYear = DatePart(YearStr, BUF)
- Call UpShapes
- Call StartValues(BUF)
- Call CalendarDisp
- Application.ScreenUpdating = True
- End Sub
- '---------------------------------------
- Private Sub UpShapes()
- Dim SHP As Shape
- Dim I As Integer
- Dim J As Integer
- Dim intLogicalDay As Integer
- '--------
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(1), _
- TBT, shpWidth, shpHeight)
- With SHP
- .Name = "SHP_PreviousYear"
- .OnAction = "ShapeCalendar.PreviousYearClick"
- .TextFrame.Characters.Text = "▼"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- .Fill.ForeColor.RGB = RGB(252, 213, 181)
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(2), _
- TBT, shpWidth * 2, shpHeight)
- With SHP
- .Name = "SHP_TextYaer"
- .OnAction = "ShapeCalendar.Dummy"
- .TextFrame.Characters.Text = ""
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(4), _
- TBT, shpWidth, shpHeight)
- With SHP
- .Name = "SHP_NextYear"
- .OnAction = "ShapeCalendar.NextYearClick"
- .TextFrame.Characters.Text = "▲"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- .Fill.ForeColor.RGB = RGB(146, 246, 166)
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(5), _
- TBT, shpWidth, shpHeight)
- With SHP
- .Name = "SHP_PreviousMonth"
- .OnAction = "ShapeCalendar.PreviousMonthClick"
- .TextFrame.Characters.Text = "▼"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- .Fill.ForeColor.RGB = RGB(252, 213, 181)
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(6), TBT, shpWidth, shpHeight)
- With SHP
- .Name = "SHP_TextMonth"
- .OnAction = "ShapeCalendar.Dummy"
- .TextFrame.Characters.Text = ""
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(7), _
- TBT, shpWidth, shpHeight)
- With SHP
- .Name = "SHP_NextMonth"
- .OnAction = "ShapeCalendar.NextMonthClick"
- .TextFrame.Characters.Text = "▲"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- .Fill.ForeColor.RGB = RGB(146, 246, 166)
- End With
- Call ShapeHyozi(SHP)
- '--------
- For J = 1 To 7
- intLogicalDay = (((J - 1) + (DefFirstYobi - 1)) Mod 7) + 1
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(J), _
- YBT, shpWidth, shpHeight)
- With SHP
- .Name = "SHPY" & Format(J, "00")
- .OnAction = "ShapeCalendar.Dummy"
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- If ((intLogicalDay - 1) Mod 7) = 0 Then
- .TextFrame.Characters.Text = Yobi(intLogicalDay)
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(255, 0, 0)
- ElseIf ((intLogicalDay - 1) Mod 7) = 6 Then
- .TextFrame.Characters.Text = Yobi(intLogicalDay)
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 255)
- Else
- .TextFrame.Characters.Text = Yobi(intLogicalDay)
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorWeekday
- End If
- End With
- Call ShapeHyozi(SHP)
- Next J
- '--------
- For I = 1 To 6
- For J = 1 To 7
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(J), _
- DBT(I), shpWidth, shpHeight)
- With SHP
- .OnAction = "ShapeCalendar.DateClick"
- .Name = "SHPD" & I & J
- .TextFrame.Characters.Text = CStr((I - 1) * 7 + J)
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorWeekday
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- End With
- Call ShapeHyozi(SHP)
- Next J
- Next I
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(1), _
- DBT(6) + shpHeight, shpWidth * 2, shpHeight)
- With SHP
- .Name = "SHP_HOME"
- .OnAction = "ShapeCalendar.GoHome"
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- .TextFrame.Characters.Text = "HOME"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorSaturday
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(3), _
- DBT(6) + shpHeight, shpWidth * 2, shpHeight)
- With SHP
- .Name = "SHP_PREHOME"
- .OnAction = "ShapeCalendar.GoPreHome"
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- .TextFrame.Characters.Text = "preHOME"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorPreHome
- End With
- Call ShapeHyozi(SHP)
- Set SHP = ActiveSheet.Shapes.AddShape(1, BL(5), _
- DBT(6) + shpHeight, shpWidth * 3, shpHeight)
- With SHP
- .Name = "SHP_CANCEL"
- .OnAction = "ShapeCalendar.DeleteCal"
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- .TextFrame.Characters.Text = "CANCEL"
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorSunday
- End With
- Call ShapeHyozi(SHP)
- End Sub
- '---------------------------------------
- Private Sub ShapeHyozi(ByRef myShape As Shape)
- With myShape
- .Line.Visible = msoTrue
- .Line.ForeColor.RGB = RGB(166, 166, 166)
- .Line.Weight = 0.5
- .Fill.Visible = msoTrue
- .Fill.Solid
- .TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
- .TextFrame2.TextRange.Font.Size = 10
- .Placement = xlFreeFloating
- .Locked = msoTrue
- End With
- End Sub
- '---------------------------------------
- Private Sub StartValues(ByVal OpenDate As Date)
- CurDate = OpenDate
- CurYear = DatePart(YearStr, CurDate)
- CurMonth = DatePart(MonthStr, CurDate)
- CurDay = DatePart(DayStr, CurDate)
- Call DispYearMonth
- End Sub
- '---------------------------------------
- Private Sub DispYearMonth()
- With ActiveSheet.Shapes("SHP_TextYaer").DrawingObject
- .Caption = Format(DateSerial(CurYear, CurMonth, 1), "ggge年")
- End With
- With ActiveSheet.Shapes("SHP_TextMonth").DrawingObject
- .Caption = Format(DateSerial(CurYear, CurMonth, 1), "m月")
- End With
- End Sub
- '---------------------------------------
- Private Sub DateClick()
- Dim strN As String
- Dim FLG As Boolean
- '-----マクロを呼び出したオブジェクトの名前
- strN = Application.Caller
- '-----シェイプにテキストデータがない
- If Len(ActiveSheet.Shapes(strN).TextFrame.Characters.Text) = 0 Then
- Exit Sub
- End If
- '-----2回連続でクリックされた場合、Tureで新たに押された場合Falseになる
- FLG = (SelectShape = strN)
- Call ClickShape(strN)
- '-----2回連続でクリックされた場合
- If FLG Then
- ActiveCell.Value = DateSerial(CurYear, CurMonth, CurDay)
- Call DeleteCal
- End If
- End Sub
- '---------------------------------------
- Public Sub DeleteCal()
- Dim SHP() As String
- Dim Sp As Shape
- Dim objRange As Object
- Dim iCount As Long
- Dim I As Integer
- '-----シェイプがなければ終了
- If ActiveSheet.Shapes.Count = 0 Then
- Exit Sub
- End If
- '-----名称がSHPから始まるシェイプの拾い上げ
- ReDim SHP(1 To ActiveSheet.Shapes.Count)
- iCount = 0
- For Each Sp In ActiveSheet.Shapes
- If InStr(1, Sp.Name, "SHP") > 0 Then
- iCount = iCount + 1
- SHP(iCount) = Sp.Name
- End If
- Next Sp
- '-----なければ終わり
- If iCount = 0 Then
- Exit Sub
- End If
- '-----シェイプの一括削除のため一括選択
- ReDim Preserve SHP(1 To iCount)
- Set objRange = ActiveSheet.Shapes.Range(SHP)
- objRange.Select
- '-----削除のためシート保護の解除
- ActiveSheet.Unprotect
- '----一括削除の実行
- objRange.Delete
- End Sub
- '---------------------------------------
- Private Sub GoHome()
- Call MoveToToday(UseCurYear:=True)
- End Sub
- '---------------------------------------
- Private Sub GoPreHome()
- Call MoveToToday(UseCurYear:=False)
- End Sub
- '---------------------------------------
- Private Sub Dummy()
- End Sub
- '---------------------------------------DateCalendarの日付の描写
- Private Sub CalendarDisp()
- Dim newSelected As String
- Dim TsuBan As Integer
- '--------1日の週日
- StartPosi = DatePart("w", _
- DateSerial(CurYear, CurMonth, 1), DefFirstYobi)
- '--------DateCalendarの日付の描写
- Call DaysInMonth(StartPosi)
- '--------選択された
- newSelected = "SHPD" & Grid(CurDay, StartPosi)
- Call ClickShape(newSelected)
- End Sub
- '---------------------------------------
- Private Function Grid(intDay As Integer, _
- intStart As Integer) As String
- Dim TsuBan As Integer
- Dim Res As String
- TsuBan = intDay + intStart - 1
- Res = CStr(((TsuBan - 1) \ 7) + 1) & CStr((TsuBan - 1) Mod 7 + 1)
- Grid = Res
- End Function
- '---------------------------------------
- Private Sub DaysInMonth(intStartDay As Integer)
- Dim intRow As Integer
- Dim intCol As Integer
- Dim intDays As Integer
- Dim intCount As Integer
- Dim strTemp As String
- Dim lngForeColor As Long
- If CurMonth <> 2 Then
- '--------2月以外の場合
- intDays = MonthLen(CurMonth)
- Else
- '-------2月の場合(3月1日の1日前)
- intDays = DatePart(DayStr, DateSerial(CurYear, 3, 1) - 1)
- End If
- '--------月、年を更新した場合、1/31⇒2/28等の処理
- If CurDay > intDays Then
- CurDay = intDays
- End If
- '--------DateCalendarの日付の描写
- intCount = 0
- For intRow = 1 To 6
- For intCol = 1 To 7
- If (intRow = 1) And (intCol < intStartDay) Then
- ActiveSheet.Shapes("SHPD1" & intCol).TextFrame.Characters.Text = ""
- Else
- intCount = intCount + 1
- strTemp = "SHPD" & intRow & intCol
- With ActiveSheet.Shapes(strTemp)
- If intCount <= intDays Then
- .TextFrame.Characters.Text = intCount
- '追加--------休日の赤色表示処理
- Select Case Kyujitu(DateSerial(CurYear, CurMonth, intCount))
- Case 1
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorSunday
- Case 7
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorSaturday
- Case Else
- .TextFrame2.TextRange.Font.Fill.ForeColor.RGB = ColorWeekday
- End Select
- Else
- .TextFrame.Characters.Text = ""
- End If
- End With
- End If
- Next intCol
- Next intRow
- End Sub
- '---------------------------------------
- Private Function HandleSelected(strName As String)
- Call ClickShape(strName)
- End Function
- '---------------------------------------
- Private Sub ClickShape(NewSelect As String)
- If Len(SelectShape) > 0 Then
- If SelectShape <> NewSelect Then
- With ActiveSheet.Shapes(SelectShape)
- .Fill.ForeColor.RGB = RGB(221, 221, 221)
- End With
- SelectShape = NewSelect
- End If
- Else
- SelectShape = NewSelect
- End If
- With ActiveSheet.Shapes(SelectShape)
- .Fill.ForeColor.RGB = RGB(255, 255, 0)
- CurDay = .TextFrame.Characters.Text
- End With
- End Sub
- '---------------------------------------
- Private Sub NextYearClick()
- Call NextYear
- End Sub
- Private Sub PreviousYearClick()
- Call PreviousYear
- End Sub
- Private Sub NextMonthClick()
- Call NextMonth
- End Sub
- Private Sub PreviousMonthClick()
- Call PreviousMonth
- End Sub
- '---------------------------------------
- Public Sub Today()
- Call MoveToToday(UseCurYear:=True)
- End Sub
- Public Sub NextMonth()
- Call ChageCalendar(MonthStr, IncForward)
- End Sub
- Public Sub NextYear()
- Call ChageCalendar(YearStr, IncForward)
- End Sub
- Public Sub PreviousMonth()
- Call ChageCalendar(MonthStr, IncBackward)
- End Sub
- Public Sub PreviousYear()
- Call ChageCalendar(YearStr, IncBackward)
- End Sub
- '---------------------------------------
- Private Sub ChageCalendar(strMoveUnit As String, dt As IncFlg)
- Dim iMonth As Integer
- Dim iYear As Integer
- Dim iDay As Integer
- Dim INCDate As Date
- Dim OldDate As Date
- Dim iInc As Integer
- iYear = CurYear
- iMonth = CurMonth
- iDay = CurDay
- If dt = IncForward Then
- iInc = 1
- Else
- iInc = -1
- End If
- OldDate = DateSerial(iYear, iMonth, iDay)
- INCDate = DateAdd(strMoveUnit, iInc, OldDate)
- iMonth = DatePart(MonthStr, INCDate)
- iYear = DatePart(YearStr, INCDate)
- iDay = DatePart(DayStr, INCDate)
- If CurMonth = iMonth And CurYear = iYear Then
- Call ClickShape("SHPD" & Grid(iDay, StartPosi))
- Else
- CurDay = iDay
- CurMonth = iMonth
- CurYear = iYear
- Call DispYearMonth
- Call CalendarDisp
- End If
- End Sub
- '---------------------------------------
- Private Sub MoveToToday(UseCurYear As Boolean)
- CurMonth = DefMonth
- If UseCurYear Then
- CurYear = DefYear
- End If
- CurDay = DefDay
- Call DispYearMonth
- Call CalendarDisp
- End Sub
ワークシートの仕込み
セルの選択した時アイコンを表示します。
- Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
- Dim weekz As Variant
- Dim wz As Variant
- Call DeleteCal
- weekz = Array("yyyy/mm/dd", "yy/m/d", "yy/mm/dd", "d""日""", "dd""日""", "d/m/yyyy", "dd/mm/yyyy", "ggge", "ge")
- For Each wz In weekz
- If InStr(Cells(Target.Row, Target.Column).NumberFormatLocal, wz) > 0 Then
- Call DispCalendarIcon
- Exit For
- End If
- Next
- End Sub
- Private Sub DispCalendarIcon()
- Dim SHP As Object
- Set SHP = ActiveSheet.Pictures. _
- Insert(Application.Path & "\FORMS\1041\APPTS.ICO")
- With SHP
- .Left = ActiveCell.OffSet(0, 1).Left + 5
- .Top = ActiveCell.OffSet(0, 1).Top + 2
- .Name = "SHPIcon"
- .OnAction = "ShapeCalendar.OpenCalendar"
- .PrintObject = msoFalse
- .Placement = xlMove
- .Locked = msoTrue
- End With
- End Sub
セルをダブルクリックした時
カレンダーを表示
- Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
- Call ShapeCalendar.OpenCalendar
- End Sub
祝日休日を判定する関数
- Private Function Kyujitu(lDate As Long) As Integer
- Dim CurYear As Integer
- Dim ResWeekNum As Integer
- Dim FLG As Boolean
- Dim I As Integer
- Dim J As Integer
- Dim k As Integer
- Dim iCount As Integer
- Dim lDay As Long
- Dim DateBUF As Long
- Dim lKyujitu() As Long
- Dim lKokumin() As Long
- Dim lKanrei() As Long
- Dim lHurikae() As Long
- CurYear = Year(lDate)
- ResWeekNum = Weekday(lDate)
- ReDim lKyujitu(0) '----------値の初期化
- lKyujitu(0) = 0
- ReDim lHurikae(0)
- lHurikae(0) = 0
- ReDim lKokumin(0)
- lKokumin(0) = 0
- ReDim lKanrei(0)
- lKanrei(0) = 0
- If ResWeekNum <> 1 And lDate > DateSerial(1948, 7, 19) Then '----------祝祭日のセット
- '①元日
- iCount = 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 1, 1)
- '②成人の日 1月15日 → 1月の第2月曜
- If CurYear > 1949 And CurYear < 2000 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 1, 15)
- ElseIf CurYear > 1999 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 1, 8) + ((9 - Weekday(DateSerial(CurYear, 1, 8))) Mod 7)
- End If
- '③建国記念の日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 2, 11)
- '④春分の日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- 'int(19.8277+0.242194*(年-1980)-int((年-1983)/4)) ----------1851-1899年通用
- 'int(20.8357+0.242194*(年-1980)-int((年-1983)/4)) ----------1900-1979年通用
- 'int(20.8431+0.242194*(年-1980)-int((年-1980)/4)) ----------1980-2099年通用
- 'int(21.8510+0.242194*(年-1980)-int((年-1980)/4)) ----------2100-2150年通用
- Select Case CurYear
- Case Is < 2100
- DateBUF = Int(20.8431 + 0.242194 * (CurYear - 1980) - Int((CurYear - 1980) / 4))
- Case Is >= 2100
- DateBUF = Int(20.851 + 0.242194 * (CurYear - 1980) - Int((CurYear - 1980) / 4))
- End Select
- lKyujitu(iCount) = DateSerial(CurYear, 3, DateBUF)
- '⑤天皇誕生日→みどりの日→昭和の日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 4, 29)
- '⑥憲法記念日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 5, 3)
- '⑦みどりの日
- If CurYear > 2006 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 5, 4)
- End If
- '⑧こどもの日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 5, 5)
- '⑨海の日 7月20日 → 7月の第3月曜日
- If CurYear > 1995 And CurYear < 2003 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 7, 20)
- ElseIf CurYear > 2002 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 7, 15) + ((9 - Weekday(DateSerial(CurYear, 7, 15))) Mod 7)
- End If
- '⑪山の日
- If CurYear > 2015 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 8, 11)
- End If
- '⑫敬老の日 9月15日 → 9月の第3月曜日
- If CurYear > 1965 And CurYear < 2003 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 9, 15)
- ElseIf CurYear > 2002 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 9, 15) + ((9 - Weekday(DateSerial(CurYear, 9, 15))) Mod 7)
- End If
- '⑬秋分の日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- 'int(22.2588+0.242194*(年-1980)-int((年-1983)/4)) ----------1851-1899年通用
- 'int(23.2588+0.242194*(年-1980)-int((年-1983)/4)) ----------1900-1979年通用
- 'int(23.2488+0.242194*(年-1980)-int((年-1980)/4)) ----------1980-2099年通用
- 'int(24.2488+0.242194*(年-1980)-int((年-1980)/4)) ----------2100-2150年通用
- Select Case CurYear
- Case Is < 2100
- DateBUF = Int(23.2488 + 0.242194 * (CurYear - 1980) - Int((CurYear - 1980) / 4))
- Case Is >= 2100
- DateBUF = Int(24.2488 + 0.242194 * (CurYear - 1980) - Int((CurYear - 1980) / 4))
- End Select
- lKyujitu(iCount) = DateSerial(CurYear, 9, DateBUF)
- If CurYear > 1965 And CurYear < 2000 Then '----------体育の日 10月10日 → 10月の第二月曜日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 10, 10)
- ElseIf CurYear > 1999 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 10, 8) + ((9 - Weekday(DateSerial(CurYear, 10, 8))) Mod 7)
- End If
- '⑭文化の日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 11, 3)
- '⑮勤労感謝の日
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 11, 23)
- '⑯天皇誕生日
- If CurYear > 1988 Then
- iCount = iCount + 1
- ReDim Preserve lKyujitu(iCount)
- lKyujitu(iCount) = DateSerial(CurYear, 12, 23)
- End If
- '----------祝祭休日の判定
- For I = 1 To UBound(lKyujitu())
- If lKyujitu(I) = lDate Then
- ResWeekNum = 1
- End If
- Next I
- End If
- '----------振り替え休日の判定
- If ResWeekNum <> 1 And CurYear > 1972 Then
- '----------値の初期化
- iCount = 0
- FLG = False
- DateBUF = 0
- For lDay = DateSerial(CurYear, 1, 1) To DateSerial(CurYear, 12, 31)
- If Weekday(lDay) = vbSunday Then
- For I = 1 To UBound(lKyujitu())
- If lKyujitu(I) = lDay Then '----------日曜日で祝日であること
- FLG = True
- DateBUF = lDay
- End If
- Next I
- End If
- If FLG = True And lDay = DateBUF + 1 Then '----------翌日の判定
- FLG = False
- DateBUF = 0
- For I = 1 To UBound(lKyujitu()) '----------祝日のチェック
- If lKyujitu(I) = lDay Then
- FLG = True '----------祝休日該当
- DateBUF = lDay
- End If
- Next I
- If FLG = False Then '----------祝日に該当しない場合、振替日にする
- iCount = iCount + 1
- ReDim Preserve lHurikae(iCount)
- lHurikae(iCount) = lDay
- FLG = False
- DateBUF = 0
- End If
- End If
- Next lDay
- If UBound(lHurikae()) > 0 Then '----------振り替え休日の判定
- For I = 1 To UBound(lHurikae())
- If lHurikae(I) = lDate Then
- ResWeekNum = 1
- End If
- Next I
- End If
- End If
- '----------国民の休日の判定
- If ResWeekNum <> 1 And CurYear > 1987 Then
- iCount = 0 '----------値の初期化
- For I = 1 To UBound(lKyujitu()) - 1
- For J = I + 1 To UBound(lKyujitu())
- If Abs(lKyujitu(J) - lKyujitu(I)) = 2 Then '----------挟まれた日が休日かどうかチェックします
- FLG = False
- For k = 1 To iCount
- If lKyujitu(k) = (lKyujitu(I) + lKyujitu(J)) / 2 Then
- FLG = True
- End If
- Next k
- If FLG = False Then '----------挟まれた日が休日でない場合その日を追加登録します
- iCount = iCount + 1
- ReDim Preserve lKokumin(iCount)
- lKokumin(iCount) = (lKyujitu(I) + lKyujitu(J)) / 2
- End If
- End If
- Next J
- Next I
- If UBound(lKokumin()) > 0 Then '----------国民の休日の判定
- For I = 1 To UBound(lKokumin())
- If lKokumin(I) = lDate Then
- ResWeekNum = 1
- End If
- Next I
- End If
- End If
- '----------慣例になっている休日の判定
- If ResWeekNum <> 1 Then
- ReDim Preserve lKanrei(3)
- lKanrei(1) = DateSerial(CurYear, 1, 2)
- lKanrei(2) = DateSerial(CurYear, 1, 3)
- lKanrei(3) = DateSerial(CurYear, 12, 31)
- For I = 1 To UBound(lKanrei())
- If lKanrei(I) = lDate Then
- ResWeekNum = 1
- End If
- Next I
- End If
- Erase lHurikae()
- Erase lKyujitu()
- Erase lKokumin()
- Erase lKanrei()
- Kyujitu = ResWeekNum
- End Function
Shapeの再帰処理
- Public EndFlg As Boolean
- Public Sub ShapeAct(ByVal Flg As String, ByRef Sh As Worksheet)
- Dim SP As Shape
- EndFlg = False
- For Each SP In Sh.Shapes
- Call ShapeAct2(SP, Flg)
- Next SP
- End Sub
- Private Sub ShapeAct2(ByRef SP As Shape, ByVal Flg As String)
- Dim SP2 As Shape
- If EndFlg Then
- Exit Sub
- End If
- Select Case SP.Type
- Case msoGroup
- For Each SP2 In SP.GroupItems
- Call ShapeAct2(SP2, Flg)
- Next SP2
- Case msoOLEControlObject
- With SP.OLEFormat
- If TypeName(.Object.Object) = "CommadButton" Then
- With .Object.Object
- If .Caption = "編集" Then
- EndFlg = True
- Select Case Flg
- Case "AA"
- If .ForeColor = RGB(0, 0, 255) Then
- .ForeColor = RGB(255, 0, 0)
- Call DeleteShape(SP.Parent)
- End If
- Case "BB"
- If .ForeColor = RGB(0, 0, 255) Then
- .ForeColor = RGB(255, 0, 0)
- Call DeleteShape(SP.Parent)
- Else
- .ForeColor = RGB(0, 0, 255)
- Call CellForm("ボタン")
- End If
- Case Else
- '何もしません
- End Select
- Else
- '何もしません
- End If
- End With
- Else
- '何もしません
- End If
- End With
- Case msoTextBox
- '何もしません
- Case Else
- '何もしません
- End Select
- End Sub
グループ化されたシェイプの処理
- Public Sub DeleteShape(ByRef Sh As Worksheet)
- Dim Shp() As String
- Dim SP As Shape
- Dim objRange As Object
- Dim iCount As Long
- Dim Flg As Boolean
- 'シェイプがなければ抜ける
- If Sh.Shapes.Count = 0 Then
- Exit Sub
- End If
- 'シェイプの数に合わせて配列の添え字を定義
- ReDim Shp(1 To Sh.Shapes.Count)
- 'ターゲットとするシェイプの名前を取得する
- iCount = 0
- For Each SP In Sh.Shapes
- If InStr(1, SP.Name, "SHP") > 0 Then
- iCount = iCount + 1
- Shp(iCount) = Sh.Name
- End If
- Next SP
- '対象がなければ抜ける
- If iCount = 0 Then
- Exit Sub
- End If
- '取得した名前の数に合わせて配列の添え字を修正
- ReDim Preserve Shp(1 To iCount)
- 'シェイプの集合体を取得
- Set objRange = Sh.Shapes.Range(Shp)
- '集合体を一括削除
- If Not objRange Is Nothing Then
- objRange.Select
- objRange.Delete
- Set objRange = Nothing
- End If
- End Sub
アイコンのアクションの引数
- Public Sub DispIcon(ByRef Sh As Worksheet, _
- ByRef Target As Range)
- Dim Shp As Object
- Dim Flg As Boolean
- If Target.Count <> 1 Then
- Exit Sub
- End If
- If Target.Address = Sh.Cells(1, 1).Address Then
- Exit Sub
- End If
- Set Shp = Sh.Shapes.AddPicture(ThisWorkbook.Path & "\INFOML.ICO", _
- False, _
- True, _
- Target.Offset(0, 1).Left + 5, _
- Target.Offset(0, 1).Top + 2, _
- 15, _
- 15)
- With Shp
- .Name = "SHP_ICO"
- .OnAction = "'CellForm ""引数""'"
- .Placement = xlMove
- .Locked = msoFalse
- End With
- End Sub