【问题标题】:Count number of rows in worksheet计算工作表中的行数
【发布时间】:2015-03-26 21:11:51
【问题描述】:

我想从 Sheet2 代码模块计算 Sheet1 中的行数。

sheet1 代码模块中,以下代码可以正常工作

ctr = Range("B2", Range("B2").End(xlDown)).Count

我在 Sheet2 代码模块中尝试了相同的代码

recct = ThisWorkbook.Sheets("Sheet1").Range("B2", Range("B2").End(xlDown)).Count

我收到run time error 1004 Application -Defined or Defined error

谢谢

【问题讨论】:

  • 感谢 Scott Holtzman 我已经尝试过您的代码,它确实有效。再次感谢。以及所有发表评论的人。
  • 你得到的可能比你预想的要多,灰!但欢迎来到 SO。能这么快学这么多东西真是太好了。鉴于以下所有答案,无论您认为哪个最适合您的需求,请单击其下方的空白复选标记将其标记为已接受。这有助于将来的其他人知道哪个对您最有帮助。

标签: excel vba


【解决方案1】:

错误发生在recct 的第二个范围引用中。因为您引用的是不同的工作表,所以您需要在两个范围引用中告诉 VBA 工作表名称。

试试这个:

With ThisWorkbook.Sheets("Sheet1")    
    recct = .Range("B2", .Range("B2").End(xlDown)).Rows.Count    
End With

或者,这也可以(虽然有点草率)。

recct = ThisWorkbook.Sheets("Sheet1").Range("B2", ThisWorkbook.Sheets("Sheet1").Range("B2").End(xlDown)).Rows.Count

更新

由于围绕工作表上的行数的实际含义进行了很多讨论,因此请使用上面的代码从 B2 开始并直接计算下方的连续单元格的数量

但是,如果您想在 B 列中找到最后一个“真实”使用的单元格(通过真实,我的意思是其中包含数据),请执行以下操作:

With ThisWorkbook.Sheets("Sheet1")

    recct = .Range("B2", .Range("B" & .Rows.Count).End(xlUp)).Rows.Count

End With

【讨论】:

  • 唯一的问题是,如果 B2 之后没有数据,您将得到 1048575 (Excel 2010),它会忽略第一行。
  • @DanielCook -> 这段代码没有问题,因为它解决了用户的问题。当然,使用.End 有一些注意事项,但由于用户提供了代码,我不得不假设他知道他在用它做什么。换句话说,.End(xlDown),如果你现在正在使用的数据集是完全有效的。
  • +1 忽略了您的答案是完全引用 Sheet1 - 您是否编辑了您的初始帖子?
  • @ScottHoltzman 我不同意,我认为这不是 OP 的要求。他们表明了他们想做什么,然后展示了他们尝试了什么。他们没有说他们尝试的是正确的方法。
  • @Scott 我已经求助于Find,因为xlup 变体有几个边界条件由于不处理完整列而加剧(即如果 B2 为空白,整个列为空白等)。见stackoverflow.com/questions/4872512/… :)
【解决方案2】:

你可以使用这个例如:

rowsInThere = Sheets("Sheet1").UsedRange.Rows.Count

这在没有范围的情况下有效。您也可以使用ActiveSheet 作为工作表进行检查,以防您需要更改当前工作表并检查其行数。

【讨论】:

  • 这不能回答问题 - 对于 B2 到 B 列中最后使用的单元格来说是特定的
  • 您可以使用它,但如果在 Range("B2").End(xlDown)UsedRange 中的最后一个单元格之间有空白单元格,您将不会返回您期望的行数!
  • 不,问题是“我想计算 Sheet1 上的行数”,这是一个答案(替代答案,不使用他的方法检查行)。对于 Scott 来说,这取决于表格中的数据,以及 OP 的意图。我已经看到“行数”期间,我把这个作为答案。
  • 另外,UsedRange 最终会拾取没有实际数据但有剩余或无意格式或空字符空格的单元格。它简单易行,但经常失败:)
  • @ScottHoltzman 虽然这可能是真的,但rowsInThere = Sheets("Sheet1").UsedRange.Rows.Count 强制UsedRange 重新计票。所以计数将是准确的。 more here
【解决方案3】:

两件事

  1. 在表外工作时,您需要完全限定您的范围
  2. 始终自下而上测量最后一个单元格,而不是自上而下 - 您可能会有间隙

代码

Sub GetB()
Dim ws As Worksheet
Set ws = Sheets(1)
Dim lngCnt As Long
lngCnt = ws.Range(ws.[b2], ws.Cells(Rows.Count, "b").End(xlUp)).Count
End Sub

更强大

要干净利落地处理所有情况,Find 更容易

Sub GetB()
    Dim ws As Worksheet
    Dim rng1 As Range
    Set ws = Sheets(1)
    Set rng1 = ws.Range("B:B").Find("*", ws.[b1], xlValues, , , xlPrevious)
    If Not rng1 Is Nothing Then
    Select Case rng1.Row
    Case 1
    MsgBox "Only B1 has data", vbCritical
    Case 2
    MsgBox "No used cells past B2"
    Case Else
    MsgBox rng1.Row - 1 & " cells between B2 and B" & rng1.Row
    End Select
    Else
        MsgBox ws.Name & " column B Is blank", vbCritical
    End If
End Sub

【讨论】:

    【解决方案4】:

    不知道这是否会有所帮助,但我一直在我的模块中使用它:

    Dim TR as long, TC as long
    
    TR = [Sheet1!A1].CurrentRegion.Rows.count
    TC = [Sheet1!A1].CurrentRegion.Columns.count
    

    如果我知道如果我正在处理的数据集没有空行或空列,例如从另一个程序中提取或其他东西,那么它很快并且效果很好! 从中我可以指定范围选择或执行 vlookup。

    TR = [Sheet1!A1].CurrentRegion.Rows.count
    [I2] = "=vlookup($C2,'sheet1'!A$2:B$" & TR & ",2,FALSE)"
    

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多