代码之家  ›  专栏  ›  技术社区  ›  SilentRevolution

.UsedRange大于预期值

  •  0
  • SilentRevolution  · 技术社区  · 8 年前

    我有一个数据写入的工作表,在发生这种情况之前,首先需要清空它。

    工作表有一个3行厚的标题,位于工作表上 A1:NQY3 但可能延伸到 A1:NVU3

    我选择的清空工作表的方法是:

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    With ws
        .Range(.cells(4, 1), .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Delete
    End With
    

    上述过程工作正常,所有数据、格式和数据验证规则都已取消。当我在空工作表上再次运行该过程时,就会出现问题。然后,该过程将删除第三个标题行,作为 .UsedRange.Rows.Count 应计算为3,要删除的范围将为 .Range(.Cells(4, 1), .Cells(3, 9931)) (NQY为第9931列)

    为了避免这种情况,我添加了一个检查:

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    With ws
        If .UsedRange.Rows.Count = 3 Then Exit Sub
        .Range(.cells(4, 1), .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).Delete
    End With
    

    当我在一张刚刚被第一道工序清空的纸上检查这一点时,我检查了 .UsedRange 评估至,因为程序已步至 .Delete 程序的一部分,而不是 Exit Sub 正如我所料。这个 .UsedRange公司 评估对象 A1:NQY6 而不是预期的 A1:NQY3

    要查找此范围内是否有任何数据不在标题范围内,我运行了:

    For Each cl In .UsedRange
        If Not cl = Empty And cl.Row > 3 Then
            MsgBox "Data found in " & cl.Address & "."
        End If
    Next
    

    当我运行此操作时,没有弹出消息框,向我指示该范围内没有数据。为什么当我根据UsedRange维度删除一个范围时,使用的范围比预期的要大?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Xabier    8 年前

    用下面这样的代码替换您的代码怎么样?这样会删除下面的所有行,包括第4行:

    Sheet1.Rows("4:" & Rows.Count).Delete
    

    我不知道为什么使用的范围会有所不同,我倾向于不依赖它,而是直接删除一些内容,希望这能有所帮助。