Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 试图重做我的工作簿的工作方式_Vba_Excel - Fatal编程技术网

Vba 试图重做我的工作簿的工作方式

Vba 试图重做我的工作簿的工作方式,vba,excel,Vba,Excel,现在,我的工作簿有一张主工作表和30多张独立工作表。所有人员的格式都完全相同,只需提取公司内不同部门的信息。有没有一种方法,结合我用来提取每个部门信息的宏,将一个模板工作表中的所有单独工作表都去掉?我想更改它,以便在为特定部门运行宏时,excel根据模板打开一个新工作表,然后将当前宏提取的信息放入新工作表中。我现在从主工作表中提取的内容如下: Sub DepartmentName() Dim LCopyToRow As Long Dim LCopyToCol As Long

现在,我的工作簿有一张主工作表和30多张独立工作表。所有人员的格式都完全相同,只需提取公司内不同部门的信息。有没有一种方法,结合我用来提取每个部门信息的宏,将一个模板工作表中的所有单独工作表都去掉?我想更改它,以便在为特定部门运行宏时,excel根据模板打开一个新工作表,然后将当前宏提取的信息放入新工作表中。我现在从主工作表中提取的内容如下:

Sub DepartmentName()

    Dim LCopyToRow As Long
    Dim LCopyToCol As Long
    Dim arrColsToCopy
    Dim c As Range, x As Integer

    On Error GoTo Err_Execute


    arrColsToCopy = Array(1, 3, 4, 8, 25, 16, 17, 15) 'which columns to copy ?
    Set c = Sheets("MasterSheet").Range("Y5")  'Start search in Row 5
    LCopyToRow = 10 'Start copying data to row 10 in DepartmentSheet

    While Len(c.Value) > 0

        'If value in column Y ends with "2540", copy to DepartmentSheet        
        If c.Value Like "*2540" Then

            LCopyToCol = 1

            Sheets("DepartmentSheet").Cells(LCopyToRow, LCopyToCol).EntireRow.Insert shift:=x1Down

            For x = LBound(arrColsToCopy) To UBound(arrColsToCopy)

                Sheets("DepartmentSheet").Cells(LCopyToRow, LCopyToCol).Value = _
                               c.EntireRow.Cells(arrColsToCopy(x)).Value

                 LCopyToCol = LCopyToCol + 1

            Next x

            LCopyToRow = LCopyToRow + 1 'next row

        End If

        Set c = c.Offset(1, 0)

    Wend

    'Position on cell A5
    Range("A5").Select

    MsgBox "All matching data has been copied."

    Exit Sub

Err_Execute:
        MsgBox "An error occurred."

End Sub

我想在其中插入一些内容,以便它打开一个模板,然后按照上面的方式发布信息。

EDIT2:删除所有其他部门工作表的选项

Sub Tester()
    CreateDeptReport "2540"       'just recreates the dept sheet
   'CreateDeptReport "2540", True 'also removes all other depts
End Sub


Sub CreateDeptReport(DeptName As String, Optional ClearAllSheets As Boolean = False)

    Const TEMPLATE_SHEET As String = "Report template" 'your dept template
    Const MASTER_SHEET As String = "MasterSheet"

    Dim shtRpt As Excel.Worksheet, shtMaster As Excel.Worksheet
    Dim LCopyToRow As Long
    Dim LCopyToCol As Long
    Dim arrColsToCopy
    Dim c As Range, x As Integer
    Dim sht As Excel.Worksheet

    On Error GoTo Err_Execute

    arrColsToCopy = Array(1, 3, 4, 8, 25, 16, 17, 15) 'which columns to copy ?

    Set shtMaster = ThisWorkbook.Sheets(MASTER_SHEET)
    Set c = shtMaster.Range("Y5")  'Start search in Row 5

    LCopyToRow = 10 'Start copying data to row 10 in DepartmentSheet

    While Len(c.Value) > 0
        'If value in column Y ends with dept name, copy to report sheet
        If c.Value Like "*" & DeptName Then

            'only create the new sheet if any records are found
            If shtRpt Is Nothing Then
                For Each sht In ThisWorkbook.Sheets
                    If sht.Name <> MASTER_SHEET And sht.Name <> _
                                                    TEMPLATE_SHEET Then
                        If ClearAllSheets Or sht.Name = DeptName Then
                            Application.DisplayAlerts = False
                            sht.Delete
                            Application.DisplayAlerts = True
                        End If
                    End If
                Next sht

                ThisWorkbook.Sheets(TEMPLATE_SHEET).Copy after:=shtMaster
                Set shtRpt = ThisWorkbook.Sheets(shtMaster.Index + 1)
                shtRpt.Name = DeptName 'rename new sheet to Dept name
            End If

            LCopyToCol = 1
            shtRpt.Cells(LCopyToRow, LCopyToCol).EntireRow.Insert shift:=xlDown

            For x = LBound(arrColsToCopy) To UBound(arrColsToCopy)

                shtRpt.Cells(LCopyToRow, LCopyToCol).Value = _
                             c.EntireRow.Cells(arrColsToCopy(x)).Value

                 LCopyToCol = LCopyToCol + 1

            Next x

            LCopyToRow = LCopyToRow + 1 'next row
        End If
        Set c = c.Offset(1, 0)
    Wend

    Range("A5").Select 'Position on cell A5
    MsgBox "All matching data has been copied."
    Exit Sub

Err_Execute:
        MsgBox "An error occurred."
End Sub
子测试仪()
CreateDeptReport“2540”只是重新创建部门工作表
'CreateDeptReport“2540”,True'还将删除所有其他部门
端接头
子CreateDeptReport(DeptName为字符串,可选ClearAllSheets为布尔值=False)
Const TEMPLATE\u SHEET As String=“Report TEMPLATE”'您的部门模板
Const MASTER_SHEET As String=“MasterSheet”
将shtRpt设置为Excel.Worksheet,将SHTMMaster设置为Excel.Worksheet
昏暗的灯罩和长的一样
长时间服用缩宫素
暗色反射镜
尺寸c作为范围,x作为整数
以Excel.工作表的形式显示屏幕
错误时转到错误执行
arrColsToCopy=Array(1,3,4,8,25,16,17,15)'要复制哪些列?
Set-shtMaster=ThisWorkbook.Sheets(主工作表)
设置c=shtMaster.Range(“Y5”)'开始第5行中的搜索
LCopyToRow=10'开始将数据复制到部门工作表的第10行
而Len(c.值)>0
'如果Y列中的值以部门名称结尾,请复制到报告表
如果c.值像“*”和DeptName,那么
'仅在找到任何记录时创建新工作表
如果shtRpt不算什么,那么
对于此工作簿中的每个sht。工作表
If sht.Name主控表和sht.Name_
然后是模板纸
如果ClearAllSheets或sht.Name=DeptName,则
Application.DisplayAlerts=False
删去
Application.DisplayAlerts=True
如果结束
如果结束
下一步
ThisWorkbook.Sheets(模板工作表)。在=shtMaster之后复制
设置shtRpt=thishworkbook.Sheets(shtMaster.Index+1)
shtRpt.Name=DeptName'将新工作表重命名为Dept Name
如果结束
LCopyToCol=1
shtRpt.单元格(LCopyToRow,LCopyToCol).EntireRow.Insert shift:=xlDown
对于x=LBound(arrColsToCopy)到UBound(arrColsToCopy)
shtRpt.单元格(LCopyToRow,LCopyToCol)。值=_
c、 EntireRow.Cells(arrColsToCopy(x))值
LCopyToCol=LCopyToCol+1
下一个x
LCopyToRow=LCopyToRow+1'下一行
如果结束
设置c=c.偏移量(1,0)
温德
范围(“A5”)。选择单元格A5上的“位置”
MsgBox“已复制所有匹配数据。”
出口接头
执行错误:
MsgBox“发生错误。”
端接头

EDIT2:删除所有其他部门工作表的选项

Sub Tester()
    CreateDeptReport "2540"       'just recreates the dept sheet
   'CreateDeptReport "2540", True 'also removes all other depts
End Sub


Sub CreateDeptReport(DeptName As String, Optional ClearAllSheets As Boolean = False)

    Const TEMPLATE_SHEET As String = "Report template" 'your dept template
    Const MASTER_SHEET As String = "MasterSheet"

    Dim shtRpt As Excel.Worksheet, shtMaster As Excel.Worksheet
    Dim LCopyToRow As Long
    Dim LCopyToCol As Long
    Dim arrColsToCopy
    Dim c As Range, x As Integer
    Dim sht As Excel.Worksheet

    On Error GoTo Err_Execute

    arrColsToCopy = Array(1, 3, 4, 8, 25, 16, 17, 15) 'which columns to copy ?

    Set shtMaster = ThisWorkbook.Sheets(MASTER_SHEET)
    Set c = shtMaster.Range("Y5")  'Start search in Row 5

    LCopyToRow = 10 'Start copying data to row 10 in DepartmentSheet

    While Len(c.Value) > 0
        'If value in column Y ends with dept name, copy to report sheet
        If c.Value Like "*" & DeptName Then

            'only create the new sheet if any records are found
            If shtRpt Is Nothing Then
                For Each sht In ThisWorkbook.Sheets
                    If sht.Name <> MASTER_SHEET And sht.Name <> _
                                                    TEMPLATE_SHEET Then
                        If ClearAllSheets Or sht.Name = DeptName Then
                            Application.DisplayAlerts = False
                            sht.Delete
                            Application.DisplayAlerts = True
                        End If
                    End If
                Next sht

                ThisWorkbook.Sheets(TEMPLATE_SHEET).Copy after:=shtMaster
                Set shtRpt = ThisWorkbook.Sheets(shtMaster.Index + 1)
                shtRpt.Name = DeptName 'rename new sheet to Dept name
            End If

            LCopyToCol = 1
            shtRpt.Cells(LCopyToRow, LCopyToCol).EntireRow.Insert shift:=xlDown

            For x = LBound(arrColsToCopy) To UBound(arrColsToCopy)

                shtRpt.Cells(LCopyToRow, LCopyToCol).Value = _
                             c.EntireRow.Cells(arrColsToCopy(x)).Value

                 LCopyToCol = LCopyToCol + 1

            Next x

            LCopyToRow = LCopyToRow + 1 'next row
        End If
        Set c = c.Offset(1, 0)
    Wend

    Range("A5").Select 'Position on cell A5
    MsgBox "All matching data has been copied."
    Exit Sub

Err_Execute:
        MsgBox "An error occurred."
End Sub
子测试仪()
CreateDeptReport“2540”只是重新创建部门工作表
'CreateDeptReport“2540”,True'还将删除所有其他部门
端接头
子CreateDeptReport(DeptName为字符串,可选ClearAllSheets为布尔值=False)
Const TEMPLATE\u SHEET As String=“Report TEMPLATE”'您的部门模板
Const MASTER_SHEET As String=“MasterSheet”
将shtRpt设置为Excel.Worksheet,将SHTMMaster设置为Excel.Worksheet
昏暗的灯罩和长的一样
长时间服用缩宫素
暗色反射镜
尺寸c作为范围,x作为整数
以Excel.工作表的形式显示屏幕
错误时转到错误执行
arrColsToCopy=Array(1,3,4,8,25,16,17,15)'要复制哪些列?
Set-shtMaster=ThisWorkbook.Sheets(主工作表)
设置c=shtMaster.Range(“Y5”)'开始第5行中的搜索
LCopyToRow=10'开始将数据复制到部门工作表的第10行
而Len(c.值)>0
'如果Y列中的值以部门名称结尾,请复制到报告表
如果c.值像“*”和DeptName,那么
'仅在找到任何记录时创建新工作表
如果shtRpt不算什么,那么
对于此工作簿中的每个sht。工作表
If sht.Name主控表和sht.Name_
然后是模板纸
如果ClearAllSheets或sht.Name=DeptName,则
Application.DisplayAlerts=False
删去
Application.DisplayAlerts=True
如果结束
如果结束
下一步
ThisWorkbook.Sheets(模板工作表)。在=shtMaster之后复制
设置shtRpt=thishworkbook.Sheets(shtMaster.Index+1)
shtRpt.Name=DeptName'将新工作表重命名为Dept Name
如果结束
LCopyToCol=1
shtRpt.单元格(LCopyToRow,LCopyToCol).EntireRow.Insert shift:=xlDown
对于x=LBound(arrColsToCopy)到UBound(arrColsToCopy)
shtRpt.单元格(LCopyToRow,LCopyToCol)。值=_
c、 EntireRow.Cells(arrColsToCopy(x))值
LCopyToCol=LCopyToCol+1
下一个x
LCopyToRow=LCopyToRow+1'下一行
如果结束
设置c=c.偏移量(1,0)
温德
范围(“A5”)。选择单元格A5上的“位置”
MsgBox“已复制所有匹配数据。”
出口接头
执行错误:
MsgBox“发生错误。”
端接头

此代码应满足您的需要:

Sub Test()
    CreateDepartmentReport ("2540")
End Sub
Sub CreateDepartmentReport(strDepartment)

    Sheets("DepartmentSheet").UsedRange.Offset(10).ClearContents

    With Sheets("MasterSheet").Range("C4", Sheets("MasterSheet").Cells(Rows.Count, "C").End(xlUp))
        .AutoFilter Field:=1, Criteria1:="=*" & strDepartment, Operator:=xlAnd
        .SpecialCells(xlCellTypeVisible).EntireRow.Copy Sheets("DepartmentSheet").[A10]
    End With

    With Sheets("MasterSheet")
        If .AutoFilterMode Then .AutoFilterMode = False
    End With

    Sheets("DepartmentSheet").Range("B:B,E:G,I:X").EntireColumn.Hidden = True

    MsgBox "All matching data has been copied.", vbInformation, "Alert!"

End Sub
注意:不要为了得到一份新的礼物而在你的模板纸上盖帽