【问题标题】:VBA Worksheets.Select Not WorkingVBA 工作表。选择不工作
【发布时间】: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 语句上遇到错误,但 lastRowlastColumn 现在是正确的。我不知道为什么它会在lastColumnWith 语句之间切换工作表。

【问题讨论】:

  • 创建您的对象,然后使用它们而不是使用.Select。见THIS
  • 好的,我已经创建了一个工作表对象并将其设置为等于“原始数据”表。这解决了未为“lastRow”和“lastColumn”选择原始数据的问题。但是,当我尝试应用自动过滤器时,它仍然希望默认回到“主”表。我将在上面发布代码。
  • 您还没有完全限定对象;)例如将RD.Range(Cells(1, 1), Cells(1, lastColumn))更改为RD.Range(RD.Cells(1, 1), RD.Cells(1, lastColumn))
  • 非常感谢,成功了。
  • 很高兴它为你解决了:)

标签: vba excel


【解决方案1】:

这是正确使用with的完整角色:

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

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2022-11-29
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多