在VBA筛选表中选择前10行可见单元格

在VBA筛选表中选择前10行可见单元格,vba,excel,filtering,extract,Vba,Excel,Filtering,Extract,这是我第一次尝试在使用VBA宏筛选的表格中选择并复制前10行可见数据以及表格标题。我在stackoverflow的链接中使用了代码示例。这个特殊的例子使我能够学习如何在单个列中复制值。我想复制整行或某些列的值,这取决于哪个更容易 Sub LPRDATA() Dim TYEAR As String TYEAR = Range("TYEAR").Value Dim QUARTER As String QUARTER = Range("QUARTER").Value Dim r As

这是我第一次尝试在使用VBA宏筛选的表格中选择并复制前10行可见数据以及表格标题。我在stackoverflow的链接中使用了代码示例。这个特殊的例子使我能够学习如何在单个列中复制值。我想复制整行或某些列的值,这取决于哪个更容易

Sub LPRDATA()


Dim TYEAR    As String
TYEAR = Range("TYEAR").Value
Dim QUARTER    As String
QUARTER = Range("QUARTER").Value
Dim r As Range, rC As Range
Dim j As Long


Sheets("CONTROL").Select
Sheets("DATA").Visible = True
Sheets("CONTROL").Select
Sheets("10").Visible = True
Sheets("DATA").Select
    ActiveWorkbook.Worksheets("DATA").ListObjects("tblData").Sort.SortFields.Clear
     ActiveWorkbook.RefreshAll
     Range("tblData[[#Headers],[Sn '#]]").Select

Range("tblData[[#Headers],[Year]]").Select
Selection.AutoFilter
ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=2, Criteria1:="LPR"
ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=12, Criteria1:=TYEAR
ActiveSheet.ListObjects("tblData").Range.AutoFilter Field:=15, Criteria1:=QUARTER


ActiveWorkbook.Worksheets("DATA").ListObjects("tblData").Sort.SortFields.Add _
    Key:=Range("tblData[[#All],[Score]]"), SortOn:=xlSortOnValues, Order:= _
    xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("DATA").ListObjects("tblData").Sort
    .Header = xlYes
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

Set r = Nothing
Set rC = Nothing
j = 0
Set r = Range("C1", Range("C" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)

For Each rC In r
j = j + 1
If j = 11 Or j = r.Count Then Exit For
Next rC

Range(r(1), rC).SpecialCells(xlCellTypeVisible).Copy
Sheets("10").Select
Range("C7").Select
ActiveSheet.Paste


End Sub

您可以考虑使用一个循环来逐行地查找与您的条件匹配的前十行,而不使用筛选器。 除非您需要过滤器以特定的方式向用户直观地显示数据,否则循环可能更灵活、更易于编码

您也可以考虑将变量存储在变量中,而不是使用复制粘贴——个人而言,当宏擦除剪贴板时,我会发现有点恼人: 对于vba中循环的语法,我通常使用此页来参考:


您可以考虑使用循环来逐行查找与您的条件匹配的前十行,而不使用筛选器。 除非您需要过滤器以特定的方式向用户直观地显示数据,否则循环可能更灵活、更易于编码

您也可以考虑将变量存储在变量中,而不是使用复制粘贴——个人而言,当宏擦除剪贴板时,我会发现有点恼人: 对于vba中循环的语法,我通常使用此页来参考:


为了让这个例子更容易理解,我已经去掉了一些代码

' Sorts a table in Excel.
' Then filters table for first 10 records.
' Then copies/pastes.
Sub Example()
    Dim sourceWS As Worksheet       ' Spreadsheet that contains the table.
    Dim sourceLO As ListObject      ' Table that contains the data.
    Dim targetRange As Range        ' Where to copy data to.

    ' Populate vars.
    Set sourceWS = ActiveSheet
    Set sourceLO = sourceWS.ListObjects("tblData")
    Set targetRange = Range("10!C7")

    ' Sort the table.
    With sourceLO.Sort
        .SortFields.Add Range("tblData[[#All], [Score]]"), xlSortOnValues, xlDescending
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' Limit to first ten rows (update field to select limiting column).
    sourceLO.Range.AutoFilter Field:=1, Criteria1:="10", Operator:=xlTop10Items

    ' Copy currenlty visible cells.
    sourceLO.Range.SpecialCells(xlCellTypeVisible).Copy
    targetRange.PasteSpecial (xlPasteAll)
End Sub
起始行
sourceLO.Range.AutoFilter…
将表格限制为前10个重新记录

起始行
sourceLO.Range.SpecialCells…
仅复制可见行(即前10行)。如果要将复制/粘贴限制到某些列,请使用以下语法:

Range("tblData[Header 1], tblData[Header 2]").SpecialCells(xlCellTypeVisible).Copy

为了让这个例子更容易理解,我去掉了一些代码

' Sorts a table in Excel.
' Then filters table for first 10 records.
' Then copies/pastes.
Sub Example()
    Dim sourceWS As Worksheet       ' Spreadsheet that contains the table.
    Dim sourceLO As ListObject      ' Table that contains the data.
    Dim targetRange As Range        ' Where to copy data to.

    ' Populate vars.
    Set sourceWS = ActiveSheet
    Set sourceLO = sourceWS.ListObjects("tblData")
    Set targetRange = Range("10!C7")

    ' Sort the table.
    With sourceLO.Sort
        .SortFields.Add Range("tblData[[#All], [Score]]"), xlSortOnValues, xlDescending
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' Limit to first ten rows (update field to select limiting column).
    sourceLO.Range.AutoFilter Field:=1, Criteria1:="10", Operator:=xlTop10Items

    ' Copy currenlty visible cells.
    sourceLO.Range.SpecialCells(xlCellTypeVisible).Copy
    targetRange.PasteSpecial (xlPasteAll)
End Sub
起始行
sourceLO.Range.AutoFilter…
将表格限制为前10个重新记录

起始行
sourceLO.Range.SpecialCells…
仅复制可见行(即前10行)。如果要将复制/粘贴限制到某些列,请使用以下语法:

Range("tblData[Header 1], tblData[Header 2]").SpecialCells(xlCellTypeVisible).Copy

你好未测试,但您需要以下内容:
范围(r,r.End(xlDown).End(xlToRight)).SpecialCells(xlCellTypeVisible).复制
。这会将所有可见单元格从r(如果我正确读取了您的代码,则代码位于表的左上行)复制到表的右下角(2.Ends将找到此位置)。一个好的提示是使用。可以使用此选项将手动操作转换为VBA。非常方便。我最初使用的是宏记录器,但它定义了确切的值,例如A1:X345,而不是可见数据的前10行。谢谢,你好。未测试,但您需要以下内容:
范围(r,r.End(xlDown).End(xlToRight)).SpecialCells(xlCellTypeVisible).复制
。这会将所有可见单元格从r(如果我正确读取了您的代码,则代码位于表的左上行)复制到表的右下角(2.Ends将找到此位置)。一个好的提示是使用。可以使用此选项将手动操作转换为VBA。非常方便。我最初使用的是宏记录器,但它定义了确切的值,例如A1:X345,而不是可见数据的前10行。谢谢你,谢谢你,布丽姬特谢谢你,布丽姬特。我理解这种方法。我的目标是找出本年度、本季度该报告类型的前10个得分。不幸的是,我不知道如何在VBA中做到这一点。我尝试使用公式进行计算,但虽然我可以确定前10名的分数,但我无法获得该行的其余部分(即使使用索引和匹配),因为分数中有重复的值。看起来目标数据下面的响应在这种情况下是完美的:)谢谢你Bridget谢谢你Bridget。我理解这种方法。我的目标是找出本年度、本季度该报告类型的前10个得分。不幸的是,我不知道如何在VBA中做到这一点。我尝试使用公式进行计算,但虽然我可以确定前10名的分数,但我无法获得该行的其余部分(即使使用索引和匹配),因为分数中有重复的值。在这种情况下,下面的目标数据的响应似乎是完美的:)