1- '(c) Дмитрий Евдокимов, ред. 01.02.2017 
1+ Attribute  VB_Name = "Turniket" 
2+ '(c) Дмитрий Евдокимов, ред. 27.09.2017 
23
34' Исходные данные: 
45' 1) Этот XLSM-файл с модулем Turniket.bas; 
56' 2) XLS или CSV-файл с турникетов; 
67' 3) TXT-файл с парковки; 
7- ' 4) Присвоить нужный период с Date1 по Date2 ниже. 
88' 
99' Убеждаемся, что есть лист "Отчет" (он будет очищен), а листы "Парковка" и "Турникет" будут удалены и загружены снова 
1010' Меню "Разработчик" - "Макросы" - выбираем единственный макрос TurnOver - "Выполнить" - ждем 
@@ -18,8 +18,12 @@ Option Explicit
1818Option Compare Text 
1919
2020'Фильтр с Date1 по Date2 
21- Const  Date1 As  Date  = #5/1/2017#  'mm/dd/yyyy 
22- Const  Date2 As  Date  = #5/31/2017#  'mm/dd/yyyy 
21+ 'Const Date1 As Date = #9/1/2017# 'mm/dd/yyyy 
22+ 'Const Date2 As Date = #9/30/2017# 'mm/dd/yyyy 
23+ Dim  Date1 As  Date 
24+ Dim  Date2 As  Date 
25+ 26+ Const  AppTitle As  String  = "Турникет" 
2327
2428'Столбцы с турникета 
2529Const  TURNIKET As  String  = "Турникет" 
@@ -49,10 +53,13 @@ Const ColRTotal As Long = 9
4953
5054Sub  TurnOver ()
5155 Dim  SheetFile As  Variant 
52-  Dim  WB As  String 
56+ 57+  Dim  Book1 As  Workbook 
58+  Dim  Book2 As  Workbook 
5359
5460 Dim  Sheet1 As  Worksheet 
5561 Dim  Sheet2 As  Worksheet 
62+ 5663 Dim  Row1 As  Long 
5764 Dim  Row2 As  Long 
5865
@@ -66,9 +73,24 @@ Sub TurnOver()
6673 Dim  nMins As  Long 
6774 Dim  i As  Long 
6875
76+  Dim  Answer As  Variant 
77+  On Error  GoTo  DateError
78+ 79+  Answer = "01."  & Format(DateAdd("m" , -1 , Now), "MM.yyyy" )
80+  Answer = InputBox("Дата начала периода:" , "Турникет" , Answer)
81+  If  Answer = ""  Then  Exit Sub 
82+  Date1 = CDate(Answer)
83+ 84+  Answer = Format(DateAdd("d" , -1 , DateAdd("m" , 1 , Date1)), "dd.MM.yyyy" )
85+  Answer = InputBox("Дата конца периода:" , "Турникет" , Answer)
86+  If  Answer = ""  Then  Exit Sub 
87+  Date2 = CDate(Answer)
88+ 89+  On Error  GoTo  SomeError
90+ 6991 'Очистка отчета 
7092 Application.DisplayStatusBar = True 
71-  WB  = ActiveWorkbook.Name 
93+  Set  Book2  = ActiveWorkbook
7294 Set  Sheet2 = ActiveWorkbook.Worksheets(REPORT)
7395 Sheet2.Cells.Delete
7496 Row2 = 1 
@@ -78,15 +100,18 @@ Step1:
78100
79101 'Ищем данные с турникета 
80102 Application.StatusBar = "Загрузка данных с турникета..." 
81-  ChDir CurDir
103+  ChDrive ActiveWorkbook.Path
104+  ChDir ActiveWorkbook.Path 'CurDir 
82105 SheetFile = Application.GetOpenFilename("Excel (*.xls;*.csv), *.xls;*.csv" , , "Данные с турникета (файл Excel)" )
83-  If  SheetFile = False  Then  GoTo  Step2
106+  If  SheetFile = False  Then  GoTo  CancelError  ' Step2
84107
108+  MsgBox "Сейчас будет запрос на удаление старых данных - удалите их все, чтобы загрузить заново." , vbInformation, AppTitle
85109 For Each  Sheet1 In  Sheets
86110 If  Sheet1.Name = TURNIKET Then  Sheet1.Delete
87111 Next 
88112
89113 Workbooks.Open  Filename:=SheetFile
114+  Set  Book1 = ActiveWorkbook
90115
91116 If  LCase(Right(SheetFile, 4 )) = ".csv"  Then 
92117 Columns("A:A" ).Select
@@ -98,10 +123,14 @@ Step1:
98123 End If 
99124
100125 Sheets(1 ).Select
101-  Sheets(1 ).Copy Before:=Workbooks(WB).Sheets(1 )
102-  Workbooks(WB).Activate
126+  Sheets(1 ).Copy Before:=Book2.Sheets(1 )
127+ 128+  Book2.Activate
103129 Sheets(1 ).Select
104130 Sheets(1 ).Name = TURNIKET
131+ 132+  Book1.Close  SaveChanges:=False 
133+  Set  Book1 = Nothing 
105134
106135TurniketLoaded:
107136 Set  Sheet1 = ActiveWorkbook.Worksheets(TURNIKET)
@@ -145,7 +174,7 @@ Step2:
145174 'Ищем данные с парковки 
146175 Application.StatusBar = "Загрузка данных с парковки..." 
147176 SheetFile = Application.GetOpenFilename("Text (*.txt), *.txt" , , "Данные с парковки (текстовый файл)" )
148-  If  SheetFile = False  Then  GoTo  Step3
177+  If  SheetFile = False  Then  GoTo  CancelError  ' Step3
149178
150179 For Each  Sheet1 In  Sheets
151180 If  Sheet1.Name = PARKING Then  Sheet1.Delete
@@ -156,11 +185,18 @@ Step2:
156185 ConsecutiveDelimiter:=False , Tab:=True , Semicolon:=False , Comma:=False  _ 
157186 , Space:=False , Other:=False , FieldInfo:=Array(Array(1 , 1 ), Array(2 , 1 ), _ 
158187 Array(3 , 1 ), Array(4 , 1 )), TrailingMinusNumbers:=True 
188+  Set  Book1 = ActiveWorkbook
189+ 159190 Sheets(1 ).Select
160-  Sheets(1 ).Copy Before:=Workbooks(WB).Sheets(1 )
191+  Sheets(1 ).Copy Before:=Book2.Sheets(1 )
192+ 193+  Book2.Activate
161194 Sheets(1 ).Select
162195 Sheets(1 ).Name = PARKING
163196
197+  Book1.Close  SaveChanges:=False 
198+  Set  Book1 = Nothing 
199+ 164200ParkingLoaded:
165201 Set  Sheet1 = ActiveWorkbook.Worksheets(PARKING)
166202 Sheet1.Columns("A:D" ).AutoFit
@@ -197,10 +233,10 @@ ParkingLoaded:
197233Step3:
198234 'Сортируем 
199235 Application.StatusBar = "Сортировка по времени... " 
200-  Sheet2.Sort.SortFields.Clear 
201-  Sheet2.Sort. SortFields.Add Key:=Range( "C1" ),  _ 
202-  SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
203-  With  ActiveWorkbook.Worksheets( "Отчет" ).Sort 
236+  With Sheet2.Sort
237+   . SortFields.Clear 
238+  .SortFields.Add Key:=Range( "C1" ),  _ 
239+   SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
204240 .SetRange Range("A1:D"  & Row2 - 1 )
205241 .Header = xlNo
206242 .MatchCase = False 
@@ -214,84 +250,102 @@ Step3:
214250 Row1 = 1 
215251
216252 SName = "" 
217-  Do While  Len(Sheet2.Cells(Row1, ColRName).Text) > 0 
218-  SDate = Sheet2.Cells(Row1, ColRDate)
219-  If  SName <> Sheet2.Cells(Row1, ColRName).Text Then 
220-  SName = Sheet2.Cells(Row1, ColRName).Text
221-  Application.StatusBar = "Поиск времени ухода... "  & SDate & " "  & SName
222-  Sheet2.Cells(Row1, ColRName).Select
223-  DoEvents
224-  End If 
225-  'If Left(SName, ColRName) <> "-" Then 
226-  Row2 = Row1 + 1 
227-  Do While  Sheet2.Cells(Row2, ColRDate).Text = SDate
228-  If  Sheet2.Cells(Row2, ColRName).Text = SName Then 
229-  Sheet2.Cells(Row1, ColRLogout).FormulaR1C1 = Sheet2.Cells(Row2, ColRLogin)
230-  Sheet2.Cells(Row1, ColRObjout) = Sheet2.Cells(Row2, ColRObjin)
231-  nMins = DateDiff("n" , Sheet2.Cells(Row1, ColRLogin), Sheet2.Cells(Row1, ColRLogout)) - 48  'Обед 48 минут 
232-  If  nMins > 0  Then 
233-  Sheet2.Cells(Row1, ColRHours).FormulaR1C1 = "=RC[-2]-RC[-4]-48/60/24"  ' = nMins 
234-  Sheet2.Cells(Row1, ColRMins) = nMins
235-  Sheet2.Cells(Row1, ColRTotal).FormulaR1C1 = "=RC[-1]/60"  ' = nMins \ 60 
253+  With  Sheet2
254+  Do While  Len(.Cells(Row1, ColRName).Text) > 0 
255+  SDate = .Cells(Row1, ColRDate)
256+  If  SName <> .Cells(Row1, ColRName).Text Then 
257+  SName = .Cells(Row1, ColRName).Text
258+  Application.StatusBar = "Поиск времени ухода... "  & SDate & " "  & SName
259+  .Cells(Row1, ColRName).Select
260+  DoEvents
261+  End If 
262+  'If Left(SName, ColRName) <> "-" Then 
263+  Row2 = Row1 + 1 
264+  Do While  .Cells(Row2, ColRDate).Text = SDate
265+  If  .Cells(Row2, ColRName).Text = SName Then 
266+  .Cells(Row1, ColRLogout).FormulaR1C1 = .Cells(Row2, ColRLogin)
267+  .Cells(Row1, ColRObjout) = .Cells(Row2, ColRObjin)
268+  nMins = DateDiff("n" , .Cells(Row1, ColRLogin), .Cells(Row1, ColRLogout)) - 48  'Обед 48 минут 
269+  If  nMins > 0  Then 
270+  .Cells(Row1, ColRHours).FormulaR1C1 = "=RC[-2]-RC[-4]-48/60/24"  ' = nMins 
271+  .Cells(Row1, ColRMins) = nMins
272+  .Cells(Row1, ColRTotal).FormulaR1C1 = "=RC[-1]/60"  ' = nMins \ 60 
273+  End If 
274+  .Rows(Row2).Delete
275+  Else 
276+  Row2 = Row2 + 1 
236277 End If 
237-  'Sheet2.Cells(Row2, ColRName) = "-" & Sheet2.Cells(Row2, 1).Text 
238-  Sheet2.Rows(Row2).Delete
239-  Else 
240-  Row2 = Row2 + 1 
241-  End If 
242-  Loop 
243-  'End If 
244-  Row1 = Row1 + 1 
245-  Loop 
278+  Loop 
279+  'End If 
280+  Row1 = Row1 + 1 
281+  Loop 
282+  End With 
246283
247284 'Финальная красота 
248285 Application.StatusBar = "Сортировка по ФИО... " 
249286 Row1 = Row1 - 1 
250-  Sheet2.Sort.SortFields.Clear
251-  Sheet2.Sort.SortFields.Add Key:=Range( _ 
252-  "A1:A"  & Row1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
253-  xlSortNormal
254-  Sheet2.Sort.SortFields.Add Key:=Range( _ 
255-  "B1:B"  & Row1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
256-  xlSortNormal
257287 With  Sheet2.Sort
288+  .SortFields.Clear
289+  .SortFields.Add Key:=Range( _ 
290+  "A1:A"  & Row1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
291+  xlSortNormal
292+  .SortFields.Add Key:=Range( _ 
293+  "B1:B"  & Row1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
294+  xlSortNormal
258295 .SetRange Range("A1:I"  & Row1)
259-  '.Header = xlYes 
260296 .Header = xlNo
261297 .MatchCase = False 
262298 .Orientation = xlTopToBottom
263299 .SortMethod = xlPinYin
264300 .Apply
265301 End With 
266302
267-  Sheet2.Rows(1 ).Insert
268-  Row2 = 1 
269-  Sheet2.Cells(Row2, ColRName) = "ФИО"  'A 
270-  Sheet2.Cells(Row2, ColRDate) = "Дата"  'B 
271-  Sheet2.Cells(Row2, ColRLogin) = "Приход"  'C 
272-  Sheet2.Cells(Row2, ColRObjin) = "Вход"  'D 
273-  Sheet2.Cells(Row2, ColRLogout) = "Уход"  'E 
274-  Sheet2.Cells(Row2, ColRObjout) = "Выход"  'F 
275-  Sheet2.Cells(Row2, ColRHours) = "Часы"  'G 
276-  Sheet2.Cells(Row2, ColRMins) = "Минуты"  'H 
277-  Sheet2.Cells(Row2, ColRTotal) = "Дробь"  'I 
278- 279-  Sheet2.Rows(Row2).Font.Bold = True 
280-  Sheet2.Columns(ColRName).NumberFormat = "@" 
281-  Sheet2.Columns(ColRLogin).NumberFormat = "h:mm;@" 
282-  Sheet2.Cells(Row2, ColRObjin).NumberFormat = "@" 
283-  Sheet2.Columns(ColRLogout).NumberFormat = "h:mm;@" 
284-  Sheet2.Cells(Row2, ColRObjout).NumberFormat = "@" 
285-  Sheet2.Columns(ColRHours).NumberFormat = "h:mm;@" 
286-  Sheet2.Columns(ColRMins).NumberFormat = "0" 
287-  Sheet2.Columns(ColRTotal).NumberFormat = "0.00" 
288-  Sheet2.Columns("A:I" ).EntireColumn.AutoFit
289- 290-  'Sheet2.Cells("A2").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(5), _ 
291-  Replace:=True, PageBreaks:=False, SummaryBelowData:=True 
292-  'Sheet2.Outline.ShowLevels RowLevels:=2 
303+  With  Sheet2
304+  .Rows(1 ).Insert
305+  Row2 = 1 
306+  .Cells(Row2, ColRName) = "ФИО"  'A 
307+  .Cells(Row2, ColRDate) = "Дата"  'B 
308+  .Cells(Row2, ColRLogin) = "Приход"  'C 
309+  .Cells(Row2, ColRObjin) = "Вход"  'D 
310+  .Cells(Row2, ColRLogout) = "Уход"  'E 
311+  .Cells(Row2, ColRObjout) = "Выход"  'F 
312+  .Cells(Row2, ColRHours) = "Часы"  'G 
313+  .Cells(Row2, ColRMins) = "Минуты"  'H 
314+  .Cells(Row2, ColRTotal) = "Дробь"  'I 
315+ 316+  .Rows(Row2).Font.Bold = True 
317+  .Columns(ColRName).NumberFormat = "@" 
318+  .Columns(ColRLogin).NumberFormat = "h:mm;@" 
319+  .Cells(Row2, ColRObjin).NumberFormat = "@" 
320+  .Columns(ColRLogout).NumberFormat = "h:mm;@" 
321+  .Cells(Row2, ColRObjout).NumberFormat = "@" 
322+  .Columns(ColRHours).NumberFormat = "h:mm;@" 
323+  .Columns(ColRMins).NumberFormat = "0" 
324+  .Columns(ColRTotal).NumberFormat = "0.00" 
325+  .Columns("A:I" ).EntireColumn.AutoFit
326+ 327+  .Cells(2 , 1 ).Subtotal GroupBy:=1 , Function :=xlSum, TotalList:=Array(9 ), _ 
328+  Replace:=True , PageBreaks:=False , SummaryBelowData:=True 
329+  .Outline.ShowLevels RowLevels:=2 
330+  End With 
331+ 332+  MsgBox "Расчет окончен." , vbInformation, AppTitle
293333
334+ ExitSub:
294335 Application.StatusBar = False 
336+  Exit Sub 
337+ 338+ CancelError:
339+  MsgBox "Отказ от ввода данных." , vbExclamation, AppTitle
340+  GoTo  ExitSub
341+ 342+ DateError:
343+  MsgBox "Ошибка ввода даты." , vbCritical, AppTitle
344+  GoTo  ExitSub
345+ 346+ SomeError:
347+  MsgBox "Произошла какая-то ошибка в программе." , vbCritical, AppTitle
348+  GoTo  ExitSub
295349End Sub 
296350
297351Function  FIO (S As  String )
@@ -301,8 +355,6 @@ Function FIO(S As String)
301355 If  UBound(A) = 2  Then 
302356 FIO = A(0 ) & " "  & Left(A(1 ), 1 ) & "."  & Left(A(2 ), 1 ) & "." 
303357 Else 
304-  'MsgBox ("Ошибка в ФИО с парковки") 
305-  'Stop 
306358 FIO = S
307359 End If 
308360End Function 
0 commit comments