Исправление расписания Excel по времени и времени на пользователя и дату

568
NoobPro

У меня есть это:

badly formatted table

что трудно прочитать, «Я» означает время в, а «О» означает время в.

Я хочу преобразовать это так:

this

Я хочу выровнять каждый раз и время его соответствующий идентификатор сотрудника и дату. Спасибо

РЕДАКТИРОВАТЬ

I и O в первой таблице не обязательно чередуются, может быть 3 I, прежде чем появится соответствующий O.

Результатом должно быть: 1. пропущенные значения времени входа и выхода должны отображаться как пустые 2. редактируемые, чтобы пользователь мог заполнить пропущенные значения времени входа и выхода и; 3. т

0
Возможный дубликат [Как объединить значения из нескольких строк в одну строку в Excel?] (Https://superuser.com/questions/395126/how-to-combine-values-from-multiple-rows-into-a- однорядные-в-Excel) Scott 5 лет назад 0
Создайте сводную точку, используйте номер сотрудника и дату в качестве строк, а минимальное и максимальное время для времени в качестве значений времени и времени. PeterH 5 лет назад 0
может ли быть несколько входов на одну и ту же дату? Наоборот несколько выходов на одну и ту же дату? Forward Ed 5 лет назад 0
@ForwardEd, да, и также не может быть нет во времени на определенную дату, но имеет время OUT NoobPro 5 лет назад 0

2 ответа на вопрос

0
Lee Mac

Создайте сводную таблицу из ваших данных со следующей конфигурацией:

стержень

Возможно, вам также понадобится отформатировать значение как время:

формат

И вы также можете отобразить сводную таблицу в табличном формате, чтобы получить желаемый результат:

табличный

Также отключаем отображение промежуточных итогов и итогов:

subtotals

grandtotals

Обратите внимание, что если на одного сотрудника приходится несколько записей In/ Outзаписей в день, будет отображаться только самая последняя запись Inили Outзапись (в силу агрегирования с Max).

Эй, это работает, но мне нужно, чтобы результат был редактируемым. Извините, что сказал это только сейчас, я отредактировал свой пост NoobPro 5 лет назад 0
0
Forward Ed

Ну, я написал некрасивую часть VBA, но она, похоже, работает. Есть место для оптимизации, поскольку я вижу повторный код. В настоящее время это жестко запрограммировано, чтобы поместить в 7-й столбец 2-го ряда.

Option Explicit  Sub I_O_single_line()  Dim rng As Range Dim counter1 As Integer, counter2 As Integer, counter3 As Integer, LastRow As Integer, WriteRow As Integer, HeaderRow As Integer Dim wkb As Workbook Dim sht As Worksheet Dim Arr() As Variant  Set wkb = ActiveWorkbook Set sht = wkb.Worksheets(1)  'Last row of header row information 'set to 0 if no header row  HeaderRow = 1  'initializing the first row that the sorted data will be written to WriteRow = HeaderRow + 1  'Finds the last used row With sht If Application.WorksheetFunction.CountA(.Cells) <> 0 Then LastRow = .Cells.Find(What:="*", _ After:=.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else LastRow = 1 End If End With  'Resize the array to match your data ReDim Arr(LastRow - HeaderRow, 4)  'Copy the contents of the source data into an arr Arr() = Range(Cells(HeaderRow + 1, 1), Cells(LastRow, 4))  'iterate through each row of the source data For counter1 = 1 To (LastRow - HeaderRow) 'first row of data is potentially a special case If counter1 = 1 Then 'Write out ID and Date For counter2 = 1 To 2 Cells(WriteRow, 6 + counter2) = Arr(counter1, counter2) Next counter2 'Write out Time in appropriate column If Arr(counter1, 4) = "I" Then Cells(WriteRow, 6 + 3) = Arr(counter1, 3) ElseIf Arr(counter1, 4) = "O" Then Cells(WriteRow, 6 + 4) = Arr(counter1, 3) WriteRow = WriteRow + 1 End If 'Check to see if ID changed ElseIf Arr(counter1 - 1, 1) = Arr(counter1, 1) Then 'Check to see if Date has changed If Arr(counter1 - 1, 2) = Arr(counter1, 2) Then 'Write out time in appropriate column If Arr(counter1, 4) = "I" Then 'Check if previous entry is a repeat If Arr(counter1 - 1, 4) = Arr(counter1, 4) Then 'Advance Write a new line WriteRow = WriteRow + 1 End If For counter2 = 1 To 3 Cells(WriteRow, 6 + counter2) = Arr(counter1, counter2) Next counter2 ElseIf Arr(counter1, 4) = "O" Then 'Check if previous entry is a repeat If Arr(counter1 - 1, 4) = Arr(counter1, 4) Then 'Write ID and Date For counter2 = 1 To 2 Cells(WriteRow, 6 + counter2) = Arr(counter1, counter2) Next counter2 End If Cells(WriteRow, 6 + 4) = Arr(counter1, 3) WriteRow = WriteRow + 1 End If 'What to do if date has changed Else If Arr(counter1 - 1, 4) = "I" Then WriteRow = WriteRow + 1 End If 'Write ID and Date For counter2 = 1 To 2 Cells(WriteRow, 6 + counter2) = Arr(counter1, counter2) Next counter2 'Write out Time in appropriate column If Arr(counter1, 4) = "I" Then Cells(WriteRow, 6 + 3) = Arr(counter1, 3) ElseIf Arr(counter1, 4) = "O" Then Cells(WriteRow, 6 + 4) = Arr(counter1, 3) WriteRow = WriteRow + 1 End If End If 'What to do if ID has change Else If Arr(counter1 - 1, 4) = "I" Then WriteRow = WriteRow + 1 End If 'Write ID and Date For counter2 = 1 To 2 Cells(WriteRow, 6 + counter2) = Arr(counter1, counter2) Next counter2 'Write out Time in appropriate column If Arr(counter1, 4) = "I" Then Cells(WriteRow, 6 + 3) = Arr(counter1, 3) ElseIf Arr(counter1, 4) = "O" Then Cells(WriteRow, 6 + 4) = Arr(counter1, 3) WriteRow = WriteRow + 1 End If End If Next counter1 End Sub 

enter image description here

Эй, это работает, но I и O в первой таблице не обязательно чередуются. Извините, что сказал это только сейчас, я отредактировал свой пост NoobPro 5 лет назад 0

Похожие вопросы