【发布时间】:2015-11-04 18:32:00
【问题描述】:
我正在尝试编写一些代码,将工作表从工作簿复制到不同工作簿中的工作表。将工作表加载到新工作簿后,我想锁定工作表的第一行并为其添加过滤器。我可以很好地锁定该行,但由于某种原因,我无法将过滤器添加到第一行。无论我一直在尝试什么,我都会不断收到错误。到目前为止,这是我最终得到的结果:
Private Sub CommandButton3_Click()
'IMPORT DATA
Sheets("Raw Data").Unprotect
Application.DisplayAlerts = False
Sheets("Raw Data").Delete
Sheets.Add After:=Worksheets(1)
Worksheets(2).Name = "Raw Data"
Application.DisplayAlerts = True
Dim basebook As Workbook
Dim mybook As Workbook
Dim sourceRange As Range
Dim destrange As Range
Dim SourceRcount As Long
Dim lastRow As Long
Dim lastColumn As Long
Dim n As Long
Dim MyPath As String
Dim SaveDriveDir As String
Dim FName As Variant
Dim Path As String
Dim FileName As String
Dim FileType As String
Dim strFName As String
Dim FSO As Scripting.FileSystemObject
Set FSO = New FileSystemObject
SaveDriveDir = CurDir
MyPath = "H:"
ChDrive MyPath
ChDir MyPath
FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xls), *.xls", MultiSelect:=True)
If IsArray(FName) Then
Application.ScreenUpdating = False
Set basebook = ThisWorkbook
For n = LBound(FName) To UBound(FName)
Set mybook = Workbooks.Open(FName(n))
Set sourceRange = mybook.Worksheets(1).Cells
SourceRcount = sourceRange.Rows.count
Set destrange = basebook.Sheets("Raw Data").Cells
sourceRange.Copy destrange
mybook.Close True
Next n
End If
ChDrive SaveDriveDir
ChDir SaveDriveDir
'Locks first row of sheet
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
FilterReport
Sheets("Main").Select
Cells(5, 4).Value = FName
strFName = Cells(5, 4).Value
FileName = FSO.GetFileName(strFName)
Cells(5, 4).Value = FileName
Application.CutCopyMode = False
Application.ScreenUpdating = True
Sheets("Raw Data").Protect
End Sub
Private Sub FilterReport()
Dim lastRow As Long
Dim lastColumn As Long
Worksheets("Raw Data").Activate
Worksheets("Raw Data").Select
lastRow = Range("A" & Rows.count).End(xlUp).row
lastColumn = Cells(1, Columns.count).End(xlToLeft).Column
Range(Cells(1, 1), Cells(1, lastColumn)).Select
Selection.AutoFilter
End Sub
通过一些调试,我发现其中一个问题是“原始数据”表从未在 FilterReport 子中被选中。出于某种原因,它只选择了“主”表,我不知道为什么。
修改后的子:
Private Sub FilterReport()
Dim RD As Worksheet
Dim lastRow As Long
Dim lastColumn As Long
Set RD = Sheets("CS-CRM Raw Data")
lastRow = RD.Range("A" & Rows.count).End(xlUp).row
lastColumn = RD.Cells(1, Columns.count).End(xlToLeft).Column
With RD.Range(Cells(1, 1), Cells(1, lastColumn))
.AutoFilter
End With
End Sub
我现在在 With 语句上遇到错误,但 lastRow 和 lastColumn 现在是正确的。我不知道为什么它会在lastColumn 和With 语句之间切换工作表。
【问题讨论】:
-
创建您的对象,然后使用它们而不是使用
.Select。见THIS -
好的,我已经创建了一个工作表对象并将其设置为等于“原始数据”表。这解决了未为“lastRow”和“lastColumn”选择原始数据的问题。但是,当我尝试应用自动过滤器时,它仍然希望默认回到“主”表。我将在上面发布代码。
-
您还没有完全限定对象;)例如将
RD.Range(Cells(1, 1), Cells(1, lastColumn))更改为RD.Range(RD.Cells(1, 1), RD.Cells(1, lastColumn)) -
非常感谢,成功了。
-
很高兴它为你解决了:)