天道酬勤,学无止境

在 VBA 过滤表中选择第 10 行可见单元格(Selecting 1st 10 Rows of visible Cells in VBA Filtered Table)

问题

编码和 VBA 新手,这是我第一次尝试选择和复制可见数据第 10 行以及我使用 VBA 宏过滤的表中的表。 我在 stackoverflow 上的这个链接中使用了代码示例。 VBA 在过滤后选择可见单元格。 这个特殊的例子让我学习如何复制单列中的值。 我想复制整个行或某些列的值,具体取决于哪个更容易。

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
回答1

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

' 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...开头的sourceLO.Range.AutoFilter...表限制为前 10 个记录。

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

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

您可以考虑使用循环逐行查找符合条件的前十行,而不使用过滤器。

除非您需要过滤器以特定方式向用户直观地显示数据,否则循环可能更灵活且更易于编码。

您还可以考虑将您的值存储在变量中而不是使用复制粘贴 - 我个人觉得当宏擦除我的剪贴板时有点烦恼:)

我通常使用此页面来参考 vba 中循环的语法:http://www.excel-easy.com/vba/loop.html

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 过滤后VBA选择可见单元格(VBA selecting visible cells after filtering)
    问题 以下代码应用过滤器并在将某些过滤器应用于表后选择 B 列中的前 10 项。 我一直将它用于许多不同的过滤选择,但我遇到了我的过滤器组合之一的问题。 我发现当过滤后 B 列中只有一个项目时,它不会复制那个单元格 - 而是复制整行并且似乎是一个奇怪的选择。 当我手动向此过滤器添加一项(共 2 项)时,它会很好地复制它。 当只有一个项目时,为什么此代码不起作用的任何想法? Sub top10() Dim r As Range, rC As Range Dim j As Long 'Drinks top 10 Worksheets("OLD_Master").Columns("A:H").Select Selection.sort Key1:=Range("H1"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Worksheets("OLD_Master").Range("A:H").AutoFilter Field:=4, Criteria1:=Array( _ "CMI*"), Operator:= _ xlFilterValues Worksheets("OLD
  • Excel VBA筛选/可见单元格(Excel VBA Filtered/Visible Cell)
    问题 假设我有10行数据。 我对数据应用了一些过滤器,行号7和9被过滤或可见。 我想遍历数据(10行),并在空白列(假设列C)中输出字符串“ Is Visible” ,仅适用于Visible行(即Range C7和Range C9)。 回答1 选择要隐藏的前10行中的一些,然后尝试运行此行 Option Explicit Sub CheckIfVisible() Dim i As Integer, x As Integer x = 0 For i = 1 To 10 With Excel.ThisWorkbook.ActiveSheet If .Rows(i).EntireRow.Hidden Then Else .Cells(15 + x, 1) = "Row " & i & "is visible" x = x + 1 End If End With Next i End Sub 这是您要找的循环吗? 也许您可以向我们展示您的Loop,以便我们查看您的问题出在哪里? 回答2 自从我来到这里寻找前段时间以来,这对于将来的Google员工可能是有用的。 如果按每个单元格/行进行操作,则可以直接访问.EntireRow.Hidden bool单元格。 在下面的示例中,这只是一个遍历Selection中每个单元格的ForEach循环,并且仅读取该单元格中的属性,并基于
  • 选择第一个过滤的单元格,然后向下移动到下一个过滤的单元格(Select the first filtered cell then move onto the next filtered cell down)
    问题 我有一个包含联系方式的 Excel 电子表格,例如: A B C D E 1 Select who you would to like to email: * Drop down list * 2 Name: Company: Role: Email Address1: Email Address2: 3 Michael Jackson Jackson 5 Singer MJ@J5.com Michael@J5.com 4 Brian May Queen Guitarist BM@Queen.com Brian@Queen.com 5 Kurt Cobain Nirvana Singer KC@Nirvana.com Kurt@Nirvana.com 6 Freddie Mercury Queen Singer FM@Queen.co.uk Freddie@Queen.com 7 Pat Smear Nirvana Guitarist PS@Foo.com Pat@Foo.com 用户使用D1的下拉列表选择一个电子邮件地址,然后运行一个宏来获取该列中的电子邮件地址。 问题是当用户应用过滤器时,比如所有吉他手,它会选择第一个过滤行( C4 )然后转到下一行而不是下一个过滤行,所以它会转到C5 。 这是代码的改编: Sub SendEmail() Dim objOutlook
  • 如何在任何工作表中找到真正的最后一个单元格(How to find the true Last Cell in any Worksheet)
    问题 这个问题现在得到了优雅的回答,感谢 Chris Neilsen,请参阅下面的答案。 从现在开始,我将使用它。 该解决方案可以可靠地找到工作表中的最后一个单元格,即使单元格被过滤器、组或行的本地隐藏隐藏。 讨论可能对某些人有用,所以我也提供了我自己代码的优化版本。 它演示了如何保存和恢复过滤器,使用@Chis 的想法来查找最后一行,并将隐藏行范围记录在一个简短的 Variant 数组中,最终从中恢复。 探索和测试所讨论的所有建议解决方案的测试工作簿也可在此处下载。 完整的问题和讨论,如更新 这里和其他地方有很多关于在 Excel 工作表中查找最后一个单元格的讨论。 Range.SpecialCells方法有局限性,并不总能找到真正的最后一个单元格。 如果 Worksheet.AutoFilters 处于活动状态,则尤其如此。 下面的代码解决了问题并返回了正确的结果,即使过滤器处于活动状态,单元格被分组和隐藏,或者使用隐藏/取消隐藏隐藏行或列。 然而,方法并不简单。 有人知道一种始终可靠的更好方法吗? “真正的最后一个单元格”被理解为包含数据或公式的最后一行与包含它们的最后一列的交集。 格式化可能会超出它。 致谢并感谢您的好主意:准备和桑乔。 下面的代码在我的 Excel 2010 应用程序中测试和运行,并且需要在 VBIDE 中引用 Scripting.Runtime。
  • VBA从excel中的过滤表中返回第n行号[关闭](VBA to return nth row number from a filtered table in excel [closed])
    问题 关闭。 这个问题需要调试细节。 它目前不接受答案。 想要改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 6年前关闭。 改善这个问题 任何人都可以帮我找到在 excel 表中应用过滤器后第 n 个元素的绝对行数。 例如,我已过滤并具有可见范围的数据元素。 现在,当没有过滤器打开时,此过滤范围内的第 20 (n) 行可能是第 60 行(绝对意义)。 有没有办法使用 VBA 找到绝对行号? 回答1 最简单的方法是特殊细胞。 见下文: Sub test() Dim i As Integer, j As Integer, k As Integer Dim Report As Worksheet Set Report = Excel.ActiveSheet ' Store the current worksheet in a variable (always a good idea) Dim visRng As Range ' Creating a range variable to store our table, excluding any rows that are filtered out. Set visRng = Report.UsedRange.SpecialCells(xlCellTypeVisible) ' Select only rows
  • 过滤数据的行数(Row count on the Filtered data)
    问题 我正在使用下面的代码来获取VBA中已过滤数据行的计数,但是在获取计数时,却显示了运行时错误: “所需对象”。 可以让我知道需要什么更改吗? Set rnData = .UsedRange With rnData .AutoFilter Field:=327, Criteria1:=Mid(provarr(q), 1, 2) .Select .AutoFilter Field:=328, Criteria1:=Mid(provarr(q), 3, 7) .Select .AutoFilter Field:=330, Criteria1:=Mid(provarr(q), 10, 2) .Select .AutoFilter Field:=331, Criteria1:=Mid(provarr(q), 12, 2) .Select Rowz = .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows.count .... End With 回答1 如果您尝试计算已经自动过滤的范围内的行数,如下所示: Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count 它只会计算自动过滤范围的第一个连续可见区域中的行数。 例如,如果自动筛选器范围是第1到10行,并且对第3、5、6
  • VBA:如何在Excel中删除筛选的行?(VBA: How to delete filtered rows in Excel?)
    问题 我有一个包含一些数据的Excel表。 通过使用下一个vba代码,我试图仅过滤某些字段中的空白单元格并删除这些行 ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=7, Criteria1:= _ "=" ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=8, Criteria1:= _ "=" ActiveSheet.Range("$A$1:$I$" & lines).AutoFilter Field:=9, Criteria1:= _ "=" ActiveSheet.UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.rows.Count - 1).rows.Delete ActiveSheet.ShowAllData 仅当我在此列中有空白单元格时,它才有效。 但是我遇到一个问题,当我没有空白单元格时,通过使用上面的代码,我的整个范围都从工作表中删除。 如何避免这个问题? 我应该更改过滤条件还是其他? 回答1 使用SpecialCells仅删除自动过滤后可见的行: ActiveSheet.Range("$A$1:$I$" & lines).SpecialCells _
  • Excel VBA Performance - 1 million rows - Delete rows containing a value, in less than 1 min(Excel VBA Performance - 1 million rows - Delete rows containing a value, in less than 1 min)
    问题 我试图找到一种方法来过滤大型数据并在不到一分钟的时间内删除工作表中的行 目标: 在第1列中查找包含特定文本的所有记录,然后删除整行保持所有单元格格式(颜色,字体,边框,列宽)和公式不变 。 测试数据: : 。 代码的工作方式: 首先关闭所有Excel功能如果工作簿不为空并且第1列中存在要删除的文本值将第1列的使用范围复制到数组向后遍历数组中的每个值找到匹配项时: 将单元格地址附加到格式为"A11,A275,A3900,..."的tmp字符串如果tmp变量的长度接近255个字符使用.Range("A11,A275,A3900,...").EntireRow.Delete Shift:=xlUp删除行.Range("A11,A275,A3900,...").EntireRow.Delete Shift:=xlUp 将tmp重置为空,然后移至下一组行最后,它会重新打开所有Excel功能 。 主要问题是删除操作,总持续时间应少于一分钟。 任何基于代码的解决方案只要在1分钟内执行,就可以接受。 这将范围缩小到了很少的可接受答案。 已经提供的答案也非常简短,易于实现。 一个可以在大约30秒内执行操作,因此至少有一个答案可以提供可接受的解决方案,而其他答案也可能会发现它很有用 。 我的主要初始功能: Sub DeleteRowsWithValuesStrings() Const MAX
  • 选择范围时,VBA运行时错误1004“应用程序定义的错误或对象定义的错误”(VBA Runtime Error 1004 “Application-defined or Object-defined error” when Selecting Range)
    问题 选择范围时出现错误1004“应用程序定义的错误或对象定义的错误”。 我仍然能够选择行(即Rows("21:21").select )并在同一工作簿的其他工作表中选择范围。 我不认为该错误是在代码中。 也许是我不知道的某些设置? 我之前已经使用了完全相同的代码很多次,但是由于某种原因我无法使其在此子代码中起作用(我已经注释了发生错误的位置)... Sub CopySheet1_to_PasteSheet2() Dim CLastFundRow As Integer Dim CFirstBlankRow As Integer 'Finds last row of content Windows("Excel.xlsm").Activate Sheets("Sheet1").Activate Range("C21").Select '>>>Error 1004 "Application-defined or Object-defined error" Occurs Selection.End(xlDown).Select CLastFundRow = ActiveCell.Row 'Finds first row without content CFirstBlankRow = CLastFundRow + 1 'Copy Data Range("A21:C" &
  • Excel VBA冻结窗格不选择(excel vba freeze pane without select)
    问题 我在Excel中有一个VBA脚本,该脚本冻结了Excel工作表的窗格,但是我很好奇,看看是否有可能在不首先选择范围的情况下实现。 现在是通过代码冻结1至7行: ActiveSheet.Range("A8").Select ActiveWindow.FreezePanes = True 有什么建议么? 回答1 使用“视图”►“冻结窗格”►“冻结顶部行”命令记录自己,这就是您获得的.FreezePanes内容。 With ActiveWindow If .FreezePanes Then .FreezePanes = False .SplitColumn = 0 .SplitRow = 1 .FreezePanes = True End With 因此,无论ActiveCell属性是什么,修改.SplitColumn和/或.SplitRow属性都应为您完成。 回答2 冻结窗格有很多错误。 我添加了自己的答案,因此我将在这里找到它,而下次无需重新发明它。 Public Sub FreezePanesAt(rngDataTopLeft As Range) Dim wndCurrent As Window: For Each wndCurrent In rngDataTopLeft.Worksheet.Parent.Windows With wndCurrent
  • 在不使用VBA的情况下突出显示Excel中的活动行/列?(Highlight active row/column in Excel without using VBA?)
    问题 我要实现的是突出显示活动的行或列。 我使用了VBA解决方案,但是每次使用Selection_change事件时,我都失去了撤消工作表中所有更改的机会。 有没有办法在不使用VBA的情况下以某种方式突出显示活动的行/列? 回答1 我认为如果不使用VBA就无法完成此操作,但是可以在不丢失撤消历史记录的情况下完成: 在VBA中,将以下内容添加到您的工作表对象中: Public SelectedRow as Integer Public SelectedCol as Integer Private Sub Worksheet_SelectionChange(ByVal Target as Range) SelectedRow = Target.Row SelectedCol = Target.Column Application.CalculateFull ''// this forces all formulas to update End Sub 创建一个新的VBA模块并添加以下内容: Public function HighlightSelection(ByVal Target as Range) as Boolean HighlightSelection = (Target.Row = Sheet1.SelectedRow) Or _ (Target.Column =
  • Excel - VBA 填充第一个和最后一个值之间的单元格(Excel - VBA fill in cells between 1st and Last value)
    问题 我试图使用 VBA 用左边的值填充行中的所有空白单元格,但我只想填充行中第一个和最后一个值之间的空白单元格(不包括第 1 行和 A 列,它们是标识符)。 一旦到达带有值的最后一列(因为每行都会发生变化),我一直在努力让循环停止,而不是一直运行到工作表上的最后一列。 最初这被标记为重复(当有空白值时自动填充),但这并没有解决提到的问题。 这一直持续到片材结束。 如下图所示,当达到最后一个值时,填充应该停止。 我正在寻找一种解决方案,它可以让我一次对整个工作表执行此操作,即使数据以整个工作表中的不同列结尾。 有 1000 多行,因此为每一行运行可能会非常乏味。 我一直在使用此代码来填充数据(不包括第一行和第一列)。 但这是我不确定如何让它停在行中的最后一个值的地方。 Sub test() With ThisWorkbook.Sheets("Sheet1").Range("A:A") With Range(.Cells(2, 2), .Cells(.Rows.Count, 36).End(xlUp)) With .Offset(0, 1) .Value = .Value On Error Resume Next .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=RC[-1]&""""" On Error GoTo 0 .Value =
  • 通过在 tableview iPhone 错误中选择 tableview 行来添加动态子行?(Adding dynamic sub-rows by selecting tableview row in tableview iPhone errors?)
    问题 我想动态添加行。 我有建筑物名称的表视图列表。 如果有人选择建筑物(didSelectRowAtIndexPath),那么建筑物的各个楼层应该作为子行动态添加。 就像在相应的建筑物列表选择上最大化和最小化子行一样。 我该怎么做呢。 提前致谢... - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // There is only one section. if (tableView == indoortable || tableView == indoortable_iPad) { return 1; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of time zone names. if (tableView == indoortable || tableView == indoortable_iPad) { return [indoorZones count]; } } cellForRowAtIndexPath 方法: - (UITableViewCell *)tableView
  • VBA,Excel - 遍历过滤列中选择的单元格(VBA, Excel - iterating through cells selected in filtered column)
    问题 在包含数据的工作表中,有一列应用了过滤器来限制显示的数据。 用户在列中选择 1 个或多个单元格(不一定是连续的)并执行 VBA 代码。 在 VBA 代码中,我想遍历选定的单元格并对其进行一些操作,但是当仅选择 1 个单元格(在 Excel 术语中处于活动状态)时,Excel 行为会有所不同。 有效的代码: Sub Macro1() If Selection.count = 1 Then counter = 1 Debug.Print Selection.Text Else counter = Selection.SpecialCells(xlCellTypeVisible).count For Each c In Selection.SpecialCells(xlCellTypeVisible) Debug.Print c.Text Next c End If Debug.Print counter End Sub 问题:有没有办法,更优雅和干净的解决方案来做到这一点? 摆脱If-Then? Selection.SpecialCells(xlCellTypeVisible).count 如果只有一个单元格被激活会产生溢出错误(我认为 Excel 将选择扩展到整个工作表) ActiveCell.Select Selection.SpecialCells
  • VBA 代码不会查看隐藏行以添加带有跟踪号的行(VBA-code does not look through hidden rows for adding a row with tracking number)
    问题 我还有一个问题,希望能在您的帮助下解决。 我想做什么。 我使用 Excel 来跟踪我的工作、活动、联系人等。 在这样做的过程中,我发现在名为“活动”的工作表末尾添加行时,我做了很多重复性工作。 我想要做的是: - 按一个按钮并添加一行。 - 用 1 增加 trackingnumber - 插入默认值 代码。 为了自动执行此操作,我发现(复制、粘贴、根据我的需要进行调整)以下代码: Sub AddRowActiviteiten_NewAtEnd() 'Add's a new row at the end of the sheet. Dim wsActiviteiten As Worksheet Set wsActiviteiten = Sheets("Activiteiten") DefType = "Daily" DefStatus = "Open" DefIssue = "*****" DefImpact = "*****" DefPrio = "Laag" MyDate = Date wsActiviteiten.Range("A4").Value = "1" 'Copy the "One Row To Rule Them All" wsActiviteiten.Range("A3:Q3").Copy wsActiviteiten.Range("A" & Rows
  • 生成过滤的动态下拉列表(Generate a filtered, dynamic drop down list)
    问题 我需要两个用于数据验证的动态下拉列表。 第一个包含可供选择的唯一大陆列表,第二个列表是基于所选大陆动态生成的国家/地区子集。 数据没有任何特定的顺序: A B ---+-------------------- 1 | Continent Country 2 | Africa Algeria 3 | Asia China 4 | Africa Ethiopia 5 | Europe France 6 | Europe Germany 7 | Asia India 8 | Europe Italy 9 | Asia Japan 10 | Europe Poland 11 | Africa South Africa 12 | Europe Spain 通过使用隐藏列生成唯一的大陆列表,然后将它们关联为命名范围,我已成功创建了第一个下拉列表。 所以这部分已经完成,但是 如何根据第一个列表中选择的 Continent 关联创建第二个动态生成的过滤列表(最好在列表中没有任何间隙)? 我正在消化的实际数据有数千个数据点,因此性能是一个问题,如果可能的话,我宁愿不使用 VBA。 编辑:通过更多的搜索,我发现了一个有用的链接,它为我提供了这个公式: IFERROR(INDEX($A$2:$A$100,SMALL(IF($B$2:$B$100="Yes", ROW($A$2:$A$100)
  • 使用Excel vba查找并选择B列中的第一个空白单元格(Find and select first blank cell in column B with Excel vba)
    问题 以下代码可以很好地找到给定列(此处为B列)中的第一个空单元格。 但是我需要的是找到该列第一个空白单元格的代码。 Sub macro1() Dim sourceCol As Integer, rowCount As Integer, currentRow As Integer Dim currentRowValue As String sourceCol = 2 'column B has a value of 2 rowCount = Cells(Rows.Count, sourceCol).End(xlUp).Row 'for every row, find the first blank cell and select it For currentRow = 1 To rowCount currentRowValue = Cells(currentRow, sourceCol).Value If IsEmpty(currentRowValue) Or currentRowValue = "" Then Cells(currentRow, sourceCol).Select End If Next End Sub 另外,它应该从第10行开始,而不是从第1行开始。 有人可以重写此代码来做到这一点吗? 回答1 您想要的是这样的东西吗? Sub test() Dim ws As
  • 隐藏最后一行时查找Excel电子表格的最后一行(Finding the last row of an Excel spreadsheet when the last row is hidden)
    问题 我试图在A列中找到最后一行,其中包含带有以下代码的值: LastRow = DataWorksheet.Range("A:A").Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row 在大多数情况下,这都可以正常工作,除非最后几行被过滤掉了。 例如,假设我们有30行数据。 如果1-10行可见,11-20被滤除,21-30可见,则成功找到最后一行:返回30。当所有内容都可见并且21-30行被滤除时,LastRow返回1。 请注意,如果我手动隐藏而不是过滤掉第21-30行,它会告诉我最后一行是20。 是什么赋予了? 如果最后几行被过滤,如何确定最后一行是什么? 编辑:现在好像LastRow正在挑选最后一个未过滤的行,这与它以前的行为有一定的出入。 一旦我能够更好地隔离遇到的错误/不一致,我将更新此帖子。 回答1 这些应该忽略过滤/可见性,并为您提供最后使用的行号: DataWorksheet.UsedRange.Rows.Count -或者- DataWorksheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row 两者都不会在A列中找到最后使用的单元格,但是……这是您所需要的吗? 回答2
  • 删除表中的空白行(Remove blank rows in table)
    问题 我正在尝试运行一个宏,该宏在表列中选择空白单元格并删除整行。 下面的脚本执行除删除部分以外的所有操作,该删除部分会提示以下错误: 运行时错误1004-“ Range类的删除方法失败” 我使用了以下代码: Sub test() Range("Table1[[New]]").Activate Selection.SpecialCells(xlCellTypeBlanks).Select Selection.EntireRow.Delete End Sub 回答1 好问题! 没有表, .EntireRow.Delete始终有效,但在表内部看起来却没有。 这有效: Sub Test() Dim Rng As Range On Error Resume Next Set Rng = Range("Table1[[New]]").SpecialCells(xlCellTypeBlanks) On Error Goto 0 If Not Rng Is Nothing Then Rng.Delete Shift:=xlUp End If End Sub 回答2 实际上,您可以一次完成此操作,但是需要使用ListObject对象及其DataBodyRange和ListColumns属性: Sub ClearBlankCellsInColumnNew() Dim rngBlanks As
  • Excel 单元格有一些不可见的字符(Excel cell having some invisible character)
    问题 我正处于毁坏我的电脑的边缘。 我预期的任务将需要几分钟,我坐在它上面 2 小时。 我试图在两个不同的 Excel 工作表之间进行 vlookup,但它总是返回 #N/A。 所以我拿了一个单元格并开始测试它,我发现问题出在查找工作簿(第二个工作簿)上。 单元格中的值是一串长度为 9 的字母。但是当我使用 =len(A1) 公式时,它显示了 10 个字符。 所以我使用了trim,仍然显示10,然后我使用了这篇文章: 问题通常是一个不间断空格 - CHAR(160) - 特别是来自网络文本源 - CLEAN 无法删除,所以我会比这更进一步,并尝试使用这样的公式来替换任何不间断的空格一个标准的空间 =TRIM(CLEAN(SUBSTITUTE(A1,CHAR(160),""))) Ron de Bruin 在这里发表了一篇关于清理数据技巧的精彩文章 您也可以直接删除 CHAR(160) 而无需解决方法公式 编辑 .... 替换您选择的数据,在 Find What 中按住 ALT 并使用数字小键盘输入 0160 将替换为保留为空白并选择全部替换 它仍然显示 10 个字符,而不是 9 个。请帮助 回答1 这是找出您的角色的简单方法。 将包含 10 个字符的单元格复制到单元格 A1 上的新工作表中。 选择单元格 B1:B10 并单击工作表顶部的公式栏并粘贴此公式: =MID(A1,ROW