CurrentRegion.Row.Count返回错误的数字

时间:2018-06-14 15:13:01

标签: excel vba excel-vba

我有一个包含问题编号和空白单元格的列。对于一组特定的问题,我需要进行与其他工作簿所需的计算不同的计算。因此,我开始确定该特定范围,因为它在开始或结束位置都没有固定。

在A列上使用简单的循环,我能够匹配我感兴趣的特定区域的第一行中始终包含的文本。

现在,后面的行数是可变的。好处是它总是跟着一排空行。

所以我想利用vtrl等效的ctrl + shift + down Cell(startrow,1).CurrentRegion.Rows.Count

然而,这并没有返回正确的结果,而不是21。 当我按ctrl + shift + down手动时,它会选择正确的单元格集。

我决定玩一下,看起来它需要将两个单元格放在起始单元格上方才能包含在CurrentRegion中,这些单元格也是空白的。

是否有另一种方法可以计算包含来自给定起始单元格的数据的连续单元格的数量,而不会遍历所有单元格?

编辑:一些示例数据:

row# - Cell content
71   - blank
72   - "xx" 'Match for startrow
73   - 1
74   - 2
.......
92   - 20
93   - blank
94   - blank
95   - "xx" 'next block of data.

我有办法找到起始行,所以Range("A72").CurrentRange应该是72到92,即21行。

2 个答案:

答案 0 :(得分:1)

重新阅读这个问题之后,我注意到你的空白区域高于你想要计算的数量,这使得我的拉斯特计数无用。您始终可以找到起始位置,结束位置,并计算两者之间的行数。

仅作为一个例子:

startRow = Range("A1").End(xlDown).Row
lastRow = Range("A" & Rows.Count).End(xlUp).Row

rowCount = (lastRow - startRow) + 1

这从A1向下,直到找到第一个非空单元并将该行号存储在变量startRow中。然后,它完成了我最初的陈述,拉出拉斯特罗并将该值存储在lastRow中。最后,它只计算lastrow和startrow之间的差异。如果第一个值是somesort的标题,并且您不希望它被计算,则删除() + 1,但通常在这种情况下需要获得该范围内行的完整计数。

编辑 -

根据您的评论,您有startRow,并且您对查看工作簿的最后一行不感兴趣 - 而是仅对startRow之后的单元格区域感兴趣。您可能拥有的另一个选项是在整个单元格范围内使用.Find(从您的起始行开始)。例如:

startRow = Range("A1").End(xlDown).Row
lSheetRow = Range("A" & Rows.Count).End(xlUp).Row

With Sheets("Sheet1")
    lastRow = .Range("A" & startRow & ":A" & lSheetRow).Find(What:="", _
        Lookat:=xlPart, _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlDown, _
        MatchCase:=False).Row
End With

RowCount = lastRow - startRow

现在,这样做正是我之前所说的。找到您的起始行(您已经拥有)并将其存储为startRow;然后找到工作表的最后一行(您已经拥有)并将其存储为lastRow。这将是我们所看到的范围。实际上你不必这样做,我只是想把我已经拥有的变量合并。

然后使用您正在执行此操作的工作表(根据工作簿更改命名约定),它将存储一个新变量lastRow,相当于查找我们选择的范围内的第一个空白单元格。在这种情况下,它会在工作表的“开始行”和“最后一行”之间进行搜索。然后,它从新确定的Last Row(或起始行后的第一个空白行)中减去Start Row,并显示有多少连续的数据单元。

我创建了一个新工作簿并将数据输入其中,RowCount变量存储为21。

答案 1 :(得分:0)

我发现了问题所在。当前区域受完全空白行或列限制。虽然我的单元格A71为空B71,但A70也不是A72。因此,根据定义,从A71开始还包括A70和{{1}},因此结果不正确。现在要在起始行上方插入一个空行以进行准确的计算。