Автоматически писать на другой лист, где

В настоящее время я использую этот шаблон для регистрации запросов сотрудников на отпуск http://office.microsoft.com/en-gb/templates/employee-absence-schedule-TC103987167.aspx

Я добавил формулы массива, чтобы указать определенное количество дней в каждом месяце, когда у сотрудника был отпуск / неоплачиваемый отпуск / больничный / опоздание и т. д., например

=SUM(LEN(B5:AF5)-LEN(SUBSTITUTE(B5:AF5,"H","")))/LEN("H")

и объединил эти итоги, чтобы получить обзор за год, но мне все еще нужно просмотреть листы, чтобы получить полный список дней, которые они запросили, и скопировать данные.

Есть ли формула, которую я могу ввести, чтобы я мог сделать лист для каждого сотрудника, который, когда H появится на листе Январь B8-AF8, напишет название месяца листа и соответствующий день и дату в строке 4.

Я пытаюсь добиться чего-то подобного в качестве автоматической функции?

В настоящее время я не могу размещать изображения, но если вам нужно, чтобы я уточнил, пожалуйста, дайте мне знать.


person user3616592    schedule 08.05.2014    source источник


Ответы (1)


Если я правильно понимаю, вы хотите по 1 листу на сотрудника? Насколько я знаю, нет способа автоматического добавления листов без использования какого-либо кода (VBA или другого). Если бы у вас уже были созданы листы, я уверен, что мы могли бы придумать формулу.

В любом случае, вот некоторый код VBA, который вы можете попробовать... Он создает новую книгу для обобщения данных. Нет никакой проверки ошибок, и предполагается, что вы запускаете ее из предоставленного вами шаблона. Просто добавьте кнопку, которая вызывает EmployeeSummary, и она должна работать.

Type DayOffType
    Month As String
    DayOfWeek As String
    Date As String
    Type As String
End Type

Type EmployeeType
    Name As String
    DaysOff() As DayOffType
    NumberOfDaysOff As Long
End Type

Private EmployeeData() As EmployeeType
Private EmployeeCount As Long

Sub EmployeeSummary()
Dim wb As Excel.Workbook
    Call ReadSchedule(ThisWorkbook)
    Set wb = Workbooks.Add
    Call WriteSummary(wb, "H")
End Sub

Sub ReadSchedule(Book As Excel.Workbook)
Dim tbl As Excel.Range
Dim TableName As String
Dim sMonth As String, sDay As String
Dim iMonth As Integer, iDate As Integer
Dim iEmployee As Long, iRow As Long, iCol As Long

    For iMonth = 1 To 12
        sMonth = MonthName(iMonth)
        With Book.Worksheets(sMonth)
            TableName = "tbl" & sMonth
            Set tbl = .ListObjects(TableName).Range
            For iRow = 2 To tbl.Rows.Count - 1
                iEmployee = GetEmployee(tbl.Cells(iRow, 1))
                For iCol = 2 To tbl.Columns.Count - 1
                    If tbl.Cells(iRow, iCol) <> vbNullString Then
                        AddDayOff iEmployee, sMonth, tbl, iRow, iCol
                    End If
                Next
            Next
        End With
    Next
End Sub

Private Function GetEmployee(Name As String)
Dim i As Long
    For i = 0 To EmployeeCount - 1
        If EmployeeData(i).Name = Name Then Exit For
    Next
    If i >= EmployeeCount Then
        ReDim Preserve EmployeeData(EmployeeCount)
        EmployeeData(EmployeeCount).Name = Name
        EmployeeCount = EmployeeCount + 1
    End If
    GetEmployee = i
End Function

Private Sub AddDayOff(Employee As Long, Month As String, Table As Range, Row As Long, Col As Long)
    With EmployeeData(Employee)
        ReDim Preserve .DaysOff(.NumberOfDaysOff)
        With .DaysOff(.NumberOfDaysOff)
            .Date = Table.Cells(1, Col)
            .DayOfWeek = Table.Cells(0, Col)
            .Month = Month
            .Type = Table.Cells(Row, Col)
        End With
        .NumberOfDaysOff = .NumberOfDaysOff + 1
    End With
End Sub

Private Sub WriteSummary(Book As Excel.Workbook, Optional AbsenceType As String = "H")
Dim ws As Excel.Worksheet
Dim cell As Excel.Range
Dim i As Long, d As Long
    Set ws = Book.Worksheets(1)
    For i = 0 To EmployeeCount - 1
        With ws
            .Name = EmployeeData(i).Name
            .Range("A1") = EmployeeData(i).Name
            Set cell = .Range("A2")
            For d = 0 To EmployeeData(i).NumberOfDaysOff - 1
                If EmployeeData(i).DaysOff(d).Type = AbsenceType Then
                    cell = EmployeeData(i).DaysOff(d).Month
                    cell.Offset(0, 1) = EmployeeData(i).DaysOff(d).DayOfWeek
                    cell.Offset(0, 2) = EmployeeData(i).DaysOff(d).Date
                    Set cell = cell.Offset(1, 0)
                End If
            Next
        End With
        Set ws = Book.Worksheets.Add(after:=Book.Worksheets(Book.Worksheets.Count))
    Next
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
End Sub
person Profex    schedule 02.06.2014