【问题标题】:ActiveSheet.UsedRange.Rows.count giving wrong and different result on each run [duplicate]ActiveSheet.UsedRange.Rows.count 在每次运行时给出错误和不同的结果[重复]
【发布时间】:2017-11-24 06:11:54
【问题描述】:

我的工作表有 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 列数。

【问题讨论】:

  • 简短回答:避免使用ActiveSheetUsedRange,它们都不可靠,尤其是结合使用时...
  • 找到 UsedRange 行和列的解决方案是什么?
  • 我不能为this answer 申请信用,但基本上UsedRange 在所有情况下都不可靠。例如,当数据已从范围中清除时,Excel 仍将这些单元格计为“已使用”。链接示例提供了一种确定当前使用范围的方法。

标签: excel vba


【解决方案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

【讨论】:

    【解决方案2】:

    对于 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
    

    【讨论】:

    • 如果 .UsedRange 和/或 .CurrentRegion 没有提供所需的答案,那么通常情况下,数据不会遵循从 A1 开始并向外辐射的熟悉模式。诚然 OP 认为提供数据布局的快速屏幕截图不够重要,但这种解决方案在很多情况下都行不通。
    【解决方案3】:

    给定 列(行)查找最后填充单元格的方法是众所周知的。使用该列(行)最后一个单元格中的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
    

    最后,您可以加入这两个单元格以获得实际填充的区域,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 2018-05-02
      • 2021-08-12
      • 2021-07-12
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多