【发布时间】:2016-10-25 13:20:37
【问题描述】:
我有一个带有一张工作表的源工作簿,在应用一些过滤器后,我将数据范围复制粘贴到一个有 2 张工作表的新工作簿中。
复制粘贴后,我在新创建的工作表中移动并删除了一些列。下面的代码可以正常工作,直到将选定的值粘贴到第二张表中。但是,当我希望对第二张表进行修改时,它们是在第一张表上完成的,这会弄乱我的所有数据。
搜索了几个小时后,我无法弄清楚为什么第二张工作表没有正确处理,因此我将不胜感激有关此问题的任何帮助。
Sub ActiveHeadcount()
Dim ActiveHC As Workbook
Dim HCrange As Range
Dim ActiveHCrangedest As Range
Dim lastrow As Integer
Dim getbook As String
With ActiveSheet.UsedRange
.Value = .Value
End With
With Sheet1
.Range("A1:AR1").AutoFilter
.Range("A1:AR1").AutoFilter Field:=8, Criteria1:="Active"
.Range("$A$1:$AR$1").AutoFilter Field:=10, Criteria1:=Array( _
"Apprenticeship", "Fixed term contract", "Permanent",_
"Permanent-Expat","Trainee","="), Operator:=xlFilterValues
End With
Set ActiveHC = Workbooks.Add
Set HCrange = ThisWorkbook.Worksheets_
("Sheet1").Cells.SpecialCells(xlCellTypeVisible)
HCrange.Copy (ActiveHC.Worksheets("Sheet1").Range("A1"))
Columns("B:B").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Columns("AL:AL").Select
Selection.Cut
Range("B1").Select
ActiveSheet.Paste
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
Columns("K:K").Select
Selection.Delete Shift:=xlToLeft
Columns("M:R").Select
Selection.Delete Shift:=xlToLeft
Columns("Q:Q").Select
Selection.Delete Shift:=xlToLeft
Columns("Y:AC").Select
Selection.Delete Shift:=xlToLeft
Columns("AB:AC").Select
Selection.Delete Shift:=xlToLeft
Sheets("Sheet1").Name = "SAP HC " & Format(Date, "ddmmyy")
If ActiveSheet.FilterMode Then
Cells.AutoFilter
End If
With Sheet1
.Range("A1:AR1").AutoFilter
.Range("$A$1:$AR$1").AutoFilter Field:=8, Criteria1:=Array( _
"Active", "Inactive"), Operator:=xlFilterValues
.Range("$A$1:$AR$1").AutoFilter Field:=10, Criteria1:=Array( _
"Contractor", "Subcontractor"), Operator:=xlFilterValues
End With
Set HCrange = ThisWorkbook.Worksheets_
("Sheet1").Cells.SpecialCells(xlCellTypeVisible)
HCrange.Copy (ActiveHC.Worksheets("Sheet2").Range("A1"))
下面的更改发生在 Sheet1 而不是我想要的 Sheet2 中:
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
Columns("AJ:AJ").Select
Selection.Cut
Columns("B:B").Select
Selection.Insert Shift:=xlToRight
下面的代码工作并使用正确的工作表名称保存文件:
Sheets("Sheet2").Name = "Contractors " & Format(Date, "ddmmyy")
ActiveHC.SaveAs Filename:="D:\Macro Finance HC" & "\Global Headcount " _
&Format(Date, "ddmmyy") & ".xlsx"
End Sub
【问题讨论】:
-
如果您未指定您的
Columns语句等适用于哪个工作簿或工作表,Excel 将假定ActiveWorkbook和ActiveSheet。ActiveSheet、Activeworkbook、activate和select通常应在 vba 中避免使用,因为它们速度慢且易于更改,这会导致(如您所见)数据无法到达应有的位置。完全限定每个语句应针对哪个工作簿和工作表进行操作,您会发现在这里实现目标要容易得多 -
感谢您的回复。对属于宏所在工作表的所有元素使用 ThisWoorkbook 属性是否是一种好习惯,或者我应该完全限定所有内容,无论它们是否位于?
-
ThisWorkbook仍然只为您提供宏所属文件的引用,我发现在工作表级别工作通常最容易,例如Dim ws As Worksheet : Set ws = ThisWorkbook.Worksheets("Sheet1")然后在我需要的地方参考ws