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