Arrays 自动写入其他工作表,其中

Arrays 自动写入其他工作表,其中,arrays,excel-formula,excel-2013,Arrays,Excel Formula,Excel 2013,我目前正在使用此模板记录员工休假请求 我添加了数组公式,以给出员工每月休假/无薪休假/病假/迟到等的具体天数 乙二醇 将这些总数合并起来,得到一个年度概览,但我仍然需要查看表格,以获得他们要求的天数的完整列表,并复制数据 是否有一个公式可以输入,以便我可以为每位员工制作一张表格,当H出现在表格1月B8-AF8上时,在第4行中写下表格月份名称以及相应的日期和日期 我试图实现这样的自动功能 我目前无法发布图片,但如果您需要我详细说明,请让我知道。如果我理解正确,您希望每位员工一张?据我所知,没有一

我目前正在使用此模板记录员工休假请求

我添加了数组公式,以给出员工每月休假/无薪休假/病假/迟到等的具体天数 乙二醇

将这些总数合并起来,得到一个年度概览,但我仍然需要查看表格,以获得他们要求的天数的完整列表,并复制数据

是否有一个公式可以输入,以便我可以为每位员工制作一张表格,当H出现在表格1月B8-AF8上时,在第4行中写下表格月份名称以及相应的日期和日期

我试图实现这样的自动功能


我目前无法发布图片,但如果您需要我详细说明,请让我知道。

如果我理解正确,您希望每位员工一张?据我所知,没有一种方法可以在不使用某些代码(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
类型DayOffType
月份作为字符串
作为字符串的星期日
日期作为字符串
键入字符串
端型
类型EmployeeType
名称为字符串
DaysOff()作为DayOffType
长度等于的天数
端型
私有EmployeeData()作为EmployeeType
私人雇员视为长期雇员
次级雇员摘要()
将wb设置为Excel.工作簿
调用ReadSchedule(此工作簿)
设置wb=工作簿。添加
通话记录摘要(wb,“H”)
端接头
子阅读时间表(作为Excel.工作簿的书)
尺寸tbl为Excel.Range
将表名设置为字符串
朦胧的烟雾如弦,星期四如弦
Dim iMonth为整数,iDate为整数
黯淡的员工一样长,iRow一样长,iCol一样长
对于iMonth=1到12
斯蒙特=蒙特纳姆(伊蒙特)
带书本。工作表(斯蒙特)
TableName=“tbl”&sMonth
设置tbl=.ListObjects(TableName).Range
对于iRow=2到tbl.Rows.Count-1
IEEMPLOYEE=GetEmployee(待定单元格(iRow,1))
对于iCol=2到tbl.Columns.Count-1
如果tbl.Cells(iRow,iCol)vbNullString,则
AddDayOff员工,斯蒙特,tbl,伊洛,iCol
如果结束
下一个
下一个
以
下一个
端接头
私有函数GetEmployee(名称为字符串)
我想我会坚持多久
对于i=0到EmployeeCount-1
如果EmployeeData(i).Name=Name,则退出
下一个
如果我>=雇员人数,那么
ReDim保存EmployeeData(EmployeeCount)
EmployeeData(EmployeeCount).Name=Name
EmployeeCount=EmployeeCount+1
如果结束
GetEmployee=i
端函数
Private Sub AddDayOff(员工为长,月为字符串,表为范围,行为长,列为长)
带EmployeeData(员工)
ReDim Preserve.DaysOff(.NumberOfDaysOff)
带.DaysOff(.NumberOfDaysOff)
.Date=表格单元格(1列)
.DayOfWeek=表格单元格(0,列)
.月=月
.Type=表格.单元格(行、列)
以
.NumberOfDaysOff=.NumberOfDaysOff+1
以
端接头
私有子文档摘要(以Excel.工作簿的形式编写,可选缺席类型为String=“H”)
将ws设置为Excel.Worksheet
将单元格设置为Excel.Range
暗我一样长,暗d一样长
设置ws=Book.Worksheets(1)
对于i=0到EmployeeCount-1
与ws
.Name=员工数据(i).Name
.Range(“A1”)=员工数据(i).姓名
设置单元格=.Range(“A2”)
对于d=0的员工数据(i).天数f-1
如果EmployeeData(i).DaysOff(d).Type=缺勤类型,则
单元格=员工数据(i).DaysOff(d).月
单元格偏移量(0,1)=员工数据(i).DaysOff(d).daysofweek
单元格偏移量(0,2)=员工数据(i).DaysOff(d).Date
设置单元格=单元格偏移量(1,0)
如果结束
下一个
以
设置ws=Book.Worksheets.Add(之后:=Book.Worksheets(Book.Worksheets.Count))
下一个
Application.DisplayAlerts=False
ws.Delete
Application.DisplayAlerts=True
端接头
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