【问题标题】:Getting last row that contains an item [duplicate]获取包含项目的最后一行[重复]
【发布时间】:2017-08-03 13:16:13
【问题描述】:

我目前在 sheet1 上设置了一个表格(“Table2”)。在 A 列中,我将行号从表中一直列出到 51,而 B 列是空的,要填写。我试图获取 B 列中使用的最后一行不为空。

我尝试过使用Worksheets("Sheet1").Range("B52").End(xlUp).Row,但是即使在 B 列中填写的最后一项是第 3 行,我仍然会给我 51 的答案。

我尝试了最后一行功能,但在表格中使用时似乎不起作用。

【问题讨论】:

  • 你试过我提供的链接中的find方法了吗?
  • @ScottCraner :它在最初的 OP 中并没有明确,但问题是它总是返回表的最后一行(excel 对象),并且从内存中,这种情况没有被处理悉达多的帖子! ;)

标签: vba excel


【解决方案1】:

这是一个good explanation 关于这个:

With Worksheets("Sheet1")
    Debug.Print .Range("B" & .Rows.Count).End(xlUp).Row
End With 'Worksheets("Sheet1")

因为这似乎在 Excel 表格对象 中,请尝试以下操作:

With Worksheets("Sheet1").Range("Table2")
    Debug.Print .Range("B" & .Rows.Count).End(xlUp).Row
End With 'Worksheets("Sheet1").Range("Table2")

【讨论】:

  • 还是 51。这可能是因为单元格 A1-C1 合并了吗?单元格 B2、B3 中有项目,单元格 B4:B52 没有。
  • @Brad :你能添加一张你的工作表的截图吗?也许您需要指定您正在使用哪个工作簿,因为该方法非常可靠(合并单元格除外,数据仅在第一个单元格中,即此处不会检测到 A1-C1)
  • 我认为可能是因为桌子。我已经删除了所有A列,仍然是同样的问题。该表的范围从 A2:C52 命名为“Table2”,但是即使 B 列的大部分为空,它仍然返回表的最后一行。
  • @Brad :是的,我刚刚明白,尝试编辑! ;)
  • 删除“- .Cells(1,1).Row”后,表格范围似乎工作得更好。感谢您与我一起解决这个问题!我真的很感激!
【解决方案2】:

使用 Find 它更可靠的表格:

With Worksheets("Sheet1")
    Debug.Print .Range("B:B").Find(What:="*", _
                      After:=.Range("b1"), _
                      Lookat:=xlPart, _
                      LookIn:=xlFormulas, _
                      SearchOrder:=xlByRows, _
                      SearchDirection:=xlPrevious, _
                      MatchCase:=False).Row
End With


这里是链接中没有涉及到的一个,工作表函数MATCH的使用:

如果 Column 是文本:

With Worksheets("Sheet1")
    Debug.Print Application.WorksheetFunction.Match("ZZZ", .Range("B:B"))
End With

如果列是数字:

With Worksheets("Sheet1")
    Debug.Print Application.WorksheetFunction.Match(1E+99, .Range("B:B"))
End With

【讨论】:

  • 这在您上面链接到的 Sid 的帖子中有所介绍 :)
  • @DavidZemens 是的,我发布的原因是 OP 和 R3uk 似乎都认为它无法与表格一起正常工作。
  • 是的,OP应该显示他或她的代码的另一种情况:)
  • @ScottCraner :确实,我不会那样尝试的!我通常使用我在处理表格时发布的那个。谢谢你的洞察力! ;)
【解决方案3】:

你可以建立一个简单的循环。

Dim lastrow As Long
lastrow = 0
Dim checkrow As Long
For checkrow = 1 To 51
    If Worksheets("Sheet1").Range("B" & checkrow).Value <> "" Then
        lastrow = checkrow
    Else
        'do nothing
    End If
Next checkrow

这将从上到下遍历所有行,每次找到非空值时,都会保存该数字。因此,当循环结束时, lastrow 是保存的最后一行,例如最后一行包含任何值(如果没有行包含值,则它保持 0)。

您可能还想检查您的单元格 B51 是否真的包含任何内容。它可能包含一些空格,并且在未被检测到时看起来是空的。

【讨论】:

  • 有更好的方法可以做到这一点,请查看我的答案中的链接! ;)
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2013-01-07
  • 1970-01-01
  • 2020-09-18
  • 2020-06-08
相关资源
最近更新 更多