ActiveSheet.UsedRange.Rows.count在每次运行时给出错误且不同的结果

时间:2017-06-21 11:09:01

标签: excel excel-vba vba

我的工作表有29行和39列。 目前我使用

lrow = ActiveSheet.UsedRange.Rows.count - >获取使用的行数 lColumn = ActiveSheet.UsedRange.Columns.count - >用于获取使用的列数

Excel每次运行时都会给出错误的计数。有时会给出:
行数:29列:784
在其他运行中它给出了 行:32755,列为:784
而在其他运行中,它给出了不同的值。

我检查过29行之后和39列之后没有垃圾数据。也, 在填写数据之前,我将表格清除:ActiveWorkbook.Worksheets("Field Difference").Cells.Delete

我希望ActiveWorkbook.Worksheets("Field Difference").Cells.Delete完全清除工作表并清除工作表上的垃圾数据表。我怎样才能确保工作表中没有垃圾数据。

我明白我们还有其他选项,例如:
ActiveWorkbook.Worksheets("Field Difference").UsedRange.ClearContents - 仅清除内容
ActiveWorkbook.Worksheets("Field Difference").UsedRange.Clear - 清除格式。

请让我知道为什么我的行数和列数的错误值以及出路的原因是什么。我可以使用任何其他可靠方式来计算UsedRange行数和UsedRange列数。

3 个答案:

答案 0 :(得分:3)

对于A栏中的最后一行和列:

Dim sht as Worksheets 
dim lRow as Long 
Set sht = Worksheets("Field Difference")

lRow = sht.Cells(sht.Rows.Count, 1).End(xlUp).Row
lCol = sht.Cells(1, sht.Columns.Count).End(xlToLeft).Column

答案 1 :(得分:1)

工作表布局可能会影响.UsedRange和.CurrentRegion属性。对于确定的“最后一个单元格”,首先按行从A1向后搜索,然后使用毯子通配符按列搜索。

dim lr as long, lc as long

with worksheets("sheet1")
    lr = .cells.find(what:=chr(42), after:=.cells(1), searchdirection:=xlprevious, _
                     lookat:=xlpart, searchorder:=xlbyrows, lookin:=xlformulas).row
    lc = .cells.find(what:=chr(42), after:=.cells(1), searchdirection:=xlprevious, _
                     lookat:=xlpart, searchorder:=xlbycolumns, lookin:=xlformulas).column
    debug.print .cells(lr, lc).address(0, 0)

end with

enter image description here

答案 2 :(得分:1)

查找给定列(行)的最后一个填充单元格的方法是众所周知的。使用该列(行)最后一个单元格中的End(xlUp)End(xlToLeft))。

要获取工作表的实际填充区域的最后一个单元格,您可以使用此自定义函数,它将可靠地为您提供:

Public Function getLastCell(sh As Worksheet) As Range
  Dim lastRow As Long, lastCol As Long
  lastRow = sh.Cells.Find("*", sh.Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious).Row
  lastCol = sh.Cells.Find("*", sh.Cells(1, 1), xlFormulas, xlPart, xlByColumns, xlPrevious).Column

  Set getLastCell = sh.Cells(lastRow, lastCol)
End Function

通过引入最后一个单元格,您可以使用

A1到该单元格获得整个范围
mysheet.Range("A1", getLastCell(mySheet))

有时候您可能有兴趣找到不在A1开头的人口稠密区域。在这种情况下,您可以找到类似的" Topleft"实际填充区域的单元格,使用此自定义函数:

Public Function getFirstCell(sh As Worksheet) As Range
  Dim lastRow As Long, lastCol As Long
  lastRow = sh.Cells.Find("*", sh.Cells(sh.Rows.Count, sh.Columns.Count), xlFormulas, xlPart, xlByRows, xlNext).Row
  lastCol = sh.Cells.Find("*", sh.Cells(sh.Rows.Count, sh.Columns.Count), xlFormulas, xlPart, xlByColumns, xlNext).Column

  Set getFirstCell = sh.Cells(lastRow, lastCol)
End Function

最后,您可以加入两个单元格来获取实际的ppured区域,如下所示:

mysheet.Range(getFirstCell(mySheet), getLastCell(mySheet))