Type attendance
starttime As Date
endtime As Date
breakstart As Date
breakend As Date
worktime As Single
note As String
End Type
'以下ユーザーフォーム
Private monthly() As attendance '構造体の配列を宣言
Private Sub CommandButton1_Click() '更新ボタン
Call AttendanceSave
'Call SetAttendance
End Sub
Public Sub AttendanceSave() '保存 セルへの転記
ReDim monthly(1 To 31)
Dim i As Long
For i = 1 To 31
monthly(i).starttime = Cells(i + 1, 3).Value
monthly(i).endtime = Cells(i + 1, 4).Value
monthly(i).breakstart = Cells(i + 1, 5).Value
monthly(i).breakend = Cells(i + 1, 6).Value
monthly(i).worktime = Cells(i + 1, 7).Value
monthly(i).note = Cells(i + 1, 8).Value
Next i
End Sub
Public Sub SetAttendance() '出力
Dim i As Long
Sheets(cmbMonth.Value).Activate
For i = LBound(monthly) To UBound(monthly)
Me.Controls("txtStarttime" & i).Value = monthly(i).starttime
Me.Controls("txtEndtime" & i).Value = monthly(i).endtime
Me.Controls("txtBreakstart" & i).Value = monthly(i).breakstart
Me.Controls("txtBreakend" & i).Value = monthly(i).breakend
Me.Controls("txtWorktime" & i).Value = monthly(i).worktime
Me.Controls("txtNote" & i).Value = monthly(i).note
Next i
End Sub
Private Sub cmbMonth_Change() '月選択プルダウン
Debug.Print cmbMonth.Value
Worksheets(cmbMonth.Value).Select '先に月シートを選択してから
'曜日設定やテキストへの転記をする
SetWeekLabel '曜日設定
Call AttendanceSave '選択したシートデータを構造体配列へ
Call SetAttendance '構造体配列からテキストへ
End Sub
1'ここからフォームモジュール
2Private Sub CommandButton1_Click()
3If TextBox1.Text = "" Then Exit Sub
4Call データ検索
5End Sub
67Private Sub CommandButton2_Click()
8If TextBox1.Text = "" Then Exit Sub
9 Call データ入力
10End Sub
1112Private Sub CommandButton3_Click()
13If TextBox1.Text = "" Then Exit Sub
14Call 修正
15End Sub
1617Private Sub CommandButton5_Click()
18Unload Me
19End Sub
2021Private Sub ListBox1_Click()
22 Call Lisutクリック
23End Sub
2425Private Sub UserForm_Initialize()
26 UserForm1.TextBox1.Text = Date
27 Call データ検索
28 Call Frame1タイトル '取得したシート名を”2021年mm月"で表示
29End Sub
3031'ここから標準モジュール**********
32Sub kidou()
33 UserForm1.Show
34 Worksheets(1).Select
35End Sub
36Sub risut作成()
37'UserForm1.ListBox1に表示させる設計図的なもの
38 Dim i As Long, n As Long
39 Dim myDate As Variant
40 Worksheets(シート名).Select
41 n = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
42 With UserForm1.ListBox1
43 .ColumnHeads = True 'セル(項目)のタイトル表示
44 .BoundColumn = 1 '規定値
45 .ColumnCount = 8 'セル(項目)列の数
46 .ColumnWidths = "50;50;100;100;100;100;100;100;100" 'セル(項目)列のサイズ
47 .RowSource = "A2:H" & n '*List()は時間シリアル表示だったのでRowSource
48 End With
49End Sub
5051Option Explicit
52Public 年月日 As Date '年月日
53Public 月 As Long '月
54Public 日 As Long '日
55Public 曜日 As String '曜日
56Public i As Long
57Public シート名 As String
58Sub sheet選択()
59'年月日からどのシートを表示させるか・・*****
60 年月日 = UserForm1.TextBox1.Text
61 月 = Month(年月日) '月
62 日 = Day(年月日) '日
63 曜日 = Format(年月日, "aaa") '曜日
64 For i = 2 To Sheets.Count
65 If Sheets(i).Name = 月 Then
66 シート名 = Sheets(i).Name
67 End If
68 Next i
69End Sub
7071Option Explicit
72'
73Sub データ検索()
74 Call データ検索1
75 Call [ListBox表示].risut作成
76 Call [リストクリック].Frame1タイトル
77End Sub
78Sub データ検索1()
79'[データ呼び出し](該当シートから呼び込む**************]
80Call [Sheet選択する].sheet選択 '該当シート
81'**********************************************************
82 Dim n As Long
83 Worksheets(シート名).Select
84 n = Cells(Rows.Count, 1).End(xlUp).Row
85 For i = 2 To n
86 If 日 = Cells(i, 1) Then
87 With UserForm1
88 .TextBox2.Text = Cells(i, 3).Text '就業時間
89 .TextBox3.Text = Cells(i, 4).Text '終業時間
90 .TextBox4.Text = Cells(i, 5).Text '休憩時間(始め)
91 .TextBox5.Text = Cells(i, 6).Text '休憩時間(終)
92 .TextBox6.Text = Cells(i, 8).Text '備考欄
93 End With
94 End If
95 Next i
96End Sub
9798Option Explicit
99Dim n As Long, i As Long
100Dim WorkRange As Variant
101Sub データ入力()
102 '入力するシート検索***********
103' 年月日からどのシートを表示させるか
104 Call [Sheet選択する].sheet選択
105 '*******************************
106 Worksheets(シート名).Select
107 n = Cells(Rows.Count, 1).End(xlUp).Row + 1
108 'ここで重複登録をチックする**************
109 For i = 2 To n
110 If 日 = Cells(i, 1).Value Then MsgBox "すでに登録されています": Exit Sub
111 ' ここまで 重複登録をチック**************
112 Next i
113 With UserForm1
114 Cells(n, 1).Value = 日
115 Cells(n, 2).Value = 曜日
116 Cells(n, 3).Value = .TextBox2.Text
117 Cells(n, 4).Value = .TextBox3.Text
118 Cells(n, 5).Value = .TextBox4.Text
119 Cells(n, 6).Value = .TextBox5.Text
120 Cells(n, 8).Value = .TextBox6.Text '備考欄
121 End With
122 '***日付順に並べ替え****
123 Call 日付順
124 '************************
125 '即ListBoxに表示させる為「データ検索」
126 Call [データ呼び出し].データ検索1
127 MsgBox "入力しました"
128129' Worksheets(1).Select
130End Sub
131Sub 日付順()
132'***マクロの記録********
133'日付順に並べ替え
134 Worksheets(シート名).Select
135 n = Cells(Rows.Count, 1).End(xlUp).Row
136 Range(Cells(2, 1), Cells(n, 8)).Select
137 ActiveWorkbook.Worksheets(シート名).Sort.SortFields.Clear
138 ActiveWorkbook.Worksheets(シート名).Sort.SortFields.Add2 Key:=Range(Cells(2, 1), Cells(n, 1)), _
139 SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
140 With ActiveWorkbook.Worksheets(シート名).Sort
141 .SetRange Range(Cells(2, 1), Cells(n, 8))
142 .Header = xlGuess
143 .Apply
144 End With
145 Range("A2").Select
146End Sub
147'
148Option Explicit
149Dim ListNo As Long
150Dim n As Long
151Dim ii As Long
152Dim a As String
153Dim 年 As String
154Sub Lisutクリック()
155 ListNo = UserForm1.ListBox1.ListIndex
156 Worksheets(シート名).Select
157 年月日 = UserForm1.TextBox1.Text
158 年 = Year(年月日)
159 With UserForm1
160 For ii = 1 To 8
161162 If ii = 3 Then
163 a = CDate(.ListBox1.List(ListNo, ii - 1)) '始業時間
164 .TextBox2.Text = Left(a, Len(a) - 3) '"0:00:00"を”0:00”に変換
165 If .TextBox2.Text = "0:00" Then .TextBox2.Text = ""
166 ElseIf ii = 4 Then
167 a = CDate(.ListBox1.List(ListNo, ii - 1)) '終業時間
168 .TextBox3.Text = Left(a, Len(a) - 3)
169 If .TextBox3.Text = "0:00" Then .TextBox3.Text = ""
170 ElseIf ii = 5 Then
171 a = CDate(.ListBox1.List(ListNo, ii - 1)) ''休憩始め
172 .TextBox4.Text = Left(a, Len(a) - 3)
173 If .TextBox4.Text = "0:00" Then .TextBox4.Text = ""
174 ElseIf ii = 6 Then
175 a = CDate(.ListBox1.List(ListNo, ii - 1)) ''休憩終わり
176 .TextBox5.Text = Left(a, Len(a) - 3)
177 If .TextBox5.Text = "0:00" Then .TextBox5.Text = ""
178 ElseIf ii = 8 Then
179 .TextBox6.Text = .ListBox1.List(ListNo, ii - 1) ' '備考欄
180 End If
181 Next ii
182 End With
183End Sub
184Sub Frame1タイトル()
185Dim 年 As String, 年月日 As String, 月 As String
186 年月日 = UserForm1.TextBox1.Text
187 年 = Year(年月日)
188 月 = Month(年月日)
189 With UserForm1.Frame2
190 .Caption = 年 & "年" & 月 & "月"
191 End With
192End Sub
193194Option Explicit
195Sub 修正()
196Dim WorkRange As Variant
197Dim i As Long
198 Dim 日 As String
199 Dim a As Date
200 日 = Day(UserForm1.TextBox1.Text) '日
201' シートのデータを配列に格納(変数=Variant)
202 WorkRange = Worksheets(シート名).UsedRange
203 For i = 2 To UBound(WorkRange)
204 If WorkRange(i, 1) = 日 Then
205 With UserForm1
206 WorkRange(i, 3) = .TextBox2.Text
207 WorkRange(i, 4) = .TextBox3.Text
208 WorkRange(i, 5) = .TextBox4.Text
209 WorkRange(i, 6) = .TextBox5.Text
210 WorkRange(i, 8) = .TextBox6.Text
211 End With
212 End If
213 Next i
214 '変更されたセルをシートに上書き
215 Worksheets(シート名).UsedRange = WorkRange
216End Sub
1Option Explicit
23Private monthly(1 To 31) As attendance
4Private ws As Worksheet
56Private Sub FormToSheet_Click()
7 Set ws = ThisWorkbook.Worksheets(cmbMonth.Value)
89 Dim i
10 For i = 1 To 31
11 monthly(i).starttime = Me.Controls("txtStartTime" & i).Value
12 Next
1314 For i = 1 To 31
15 ws.Cells(i + 1, 3).Value = monthly(i).starttime
16 Next
1718End Sub
1920Private Sub SheetToForm_Click()
21 Set ws = ActiveSheet
22 cmbMonth.Value = ws.Name
2324 Dim i
25 For i = 1 To 31
26 monthly(i).starttime = ws.Cells(i + 1, 3).Value
27 Next
2829 For i = 1 To 31
30 Me.Controls("txtStartTime" & i).Value = Format(monthly(i).starttime, "hh:nn")
31 Next
3233End Sub
34
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/24 12:06