VBA工作表。选择“不工作”

VBA工作表。选择“不工作”,vba,excel,Vba,Excel,我正在尝试编写一些代码,将工作表从工作簿复制到其他工作簿中的工作表。将工作表加载到新工作簿后,我希望锁定工作表的第一行,并向其添加筛选器。我可以很好地锁定行,但由于某些原因,我无法向第一行添加筛选器。无论我一直在尝试什么,我总是会出错。以下是我到目前为止得到的结果: Private Sub CommandButton3_Click() 'IMPORT DATA Sheets("Raw Data").Unprotect Application.DisplayAlerts = False Sh

我正在尝试编写一些代码,将工作表从工作簿复制到其他工作簿中的工作表。将工作表加载到新工作簿后,我希望锁定工作表的第一行,并向其添加筛选器。我可以很好地锁定行,但由于某些原因,我无法向第一行添加筛选器。无论我一直在尝试什么,我总是会出错。以下是我到目前为止得到的结果:

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 sub中被选中。出于某种原因,它只是选择了“主”表,我不知道为什么

修订分条款:

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

我现在在
语句中得到了错误,但是
lastRow
lastColumn
现在是正确的。我不知道为什么它会在
lastColumn
With
语句之间切换工作表

以下是正确使用
完成的cose:

Private Sub FilterReport()

Dim RD As Worksheet
Dim lastRow As Long
Dim lastColumn As Long

Set RD = Sheets("CS-CRM Raw Data")

with RD

    lastRow = .Range("A" & .Rows.count).End(xlUp).row 'i guess you forgot the first dot at .rows.count
    lastColumn = .Cells(1, .Columns.count).End(xlToLeft).Column

    With .Range(.Cells(1, 1), .Cells(lastrow, lastColumn)) 'here some dots forgotten from you AGAIN (before .cells)
    'sorry i replaced a 1 by lastrow wiwh makes more sense to me 
        .AutoFilter
    End With

end with

Set RD = Nothing

End Sub

创建对象,然后使用它们,而不是使用
。选择
。请参见“确定”,我创建了一个工作表对象,并将其设置为“原始数据”工作表。这修复了未为“lastRow”和“lastColumn”选择原始数据的问题。但是,当我尝试应用自动筛选时,它仍然希望默认返回“主”工作表。我将发布上面的代码。您尚未完全限定对象;)例如,将
RD.Range(单元格(1,1),单元格(1,lastColumn))
更改为
RD.Range(RD.Cells(1,1),RD.Cells(1,lastColumn))
非常感谢,这很有效。很高兴您能成功:)