【问题标题】:ActiveSheet.UsedRange.Columns.Count - 8 what does it mean?ActiveSheet.UsedRange.Columns.Count - 8 是什么意思?
【发布时间】:2014-02-05 23:15:59
【问题描述】:

ActiveSheet.UsedRange.Columns.Count - 8 在 vba 中是什么意思?

vba 是如何知道 usedRange 的?

【问题讨论】:

  • 这意味着比 UsedRange 中的列少 8 列。它要求 Excel :)。
  • 那么从技术上讲这应该可以工作:ActiveSheet.UsedRange.Rows.Count - 3 但它没有区别吗?
  • 对什么没有影响?
  • 它不会返回 3 行
  • 如果您的数据不是从工作表的左上角开始(即在 A1 中),使用 UsedRange 可能会很棘手。从一张新表开始,在(例如)E5:E10 中输入一些数据。 UsedRange.Rows.Count 是 6,但最后一行数据在第 10 行。因此,使用 Usedrange.RowsUsedrange.Columns 的计数来识别数据实际在 哪里 并不总是安全的工作表。

标签: vba excel


【解决方案1】:

UsedRange 不仅代表非空单元格,还代表没有任何值的格式化单元格。这就是为什么你应该非常警惕。

【讨论】:

    【解决方案2】:

    BernardSaucier 已经给你答案了。我的帖子不是答案,而是解释为什么你不应该使用UsedRange

    UsedRange 高度不可靠,如 HERE 所示

    要找到最后一列有数据,请使用.Find,然后从中减去。

    With Sheets("Sheet1")
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lastCol = .Cells.Find(What:="*", _
                          After:=.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByColumns, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Column
        Else
            lastCol = 1
        End If
    End With
    
    If lastCol > 8 Then
        'Debug.Print ActiveSheet.UsedRange.Columns.Count - 8
    
        'The above becomes
    
        Debug.Print lastCol - 8
    End If
    

    【讨论】:

    • +1....我在我的例子中使用了usedRange,因为 Bernard 做了 - 他的错 :) 可耻的是行为不端 - 我自己也遇到过这个问题并且不使用它 - 会吗?还是修好了?
    • @whytheq:我的个人意见?人们应该忘记有一个词叫usedrange:P
    • 我认为它可能非常强大,可以节省大量 rows.count).end(xltosomeplace).row.etc.etc 类型代码 ....但它需要工作
    【解决方案3】:

    好像你想四处走动。试试这个:

    ActiveSheet.UsedRange.select
    

    结果……

    如果您想将该选择向上移动 3 行,请尝试此操作

    ActiveSheet.UsedRange.offset(-3).select
    

    这样做...

    【讨论】:

      【解决方案4】:

      这是UsedRange (MSDN reference) 的确切定义:

      每个 Worksheet 对象都有一个 UsedRange 属性,该属性返回一个 Range 对象,表示正在使用的工作表的区域。 UsedRange 属性表示由工作表中最左上角和最右下角非空单元格描述的区域,并包括其间的所有单元格。

      所以基本上,这条线的作用是:

      1. .UsedRange -> 在最外面的单元格周围“画”一个框,里面有内容。
      2. .Columns -> 选择这些单元格的整个列
      3. .Count -> 返回与有多少列对应的整数(在此选择中)
      4. - 8 -> 从前一个整数中减去 8。

      我假设 VBA 通过查找具有最低和最高索引值的非空单元格来计算 UsedRange。

      您最有可能遇到错误,因为您的范围内的行数小于 3,因此返回的数字是负数。

      【讨论】:

      • 我已经这样做了,但它没有做负 3:Dim LR As Long,LC As Long LC = ActiveSheet.UsedRange.Columns.Count - 8 LR = ActiveSheet.UsedRange.Rows.Count - 3 Range("A2", Cells(LR, LC)).copy Range("A2").Select
      • 我建议你把这段代码放在你的问题中,并明确你想要做什么。
      • 当然,还可以学习如何使用即时窗口、debug.print、本地窗口等调试 VBA...它将帮助您解决各种问题。
      • @KimGysen,一个充满问题的世界是轻描淡写的。 :p
      • + 1 解释得很好:) 但是这个I assume VBA calculates the UsedRange by finding the non-empty cells with lowest and highest index values. 并不完全正确。 Excel 在计算 UsedRange 时表现不稳定,因此正如我在上面的帖子中所解释的那样,它非常不可靠。
      【解决方案5】:

      我想如果你尝试一下:

      Sub Macro3()
      a = ActiveSheet.UsedRange.Columns.Count - 3
      End Sub  
      

      a 上观看,您会发现它确实有所作为。

      【讨论】:

      • 不确定这对 OP 有什么用处
      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 2021-12-14
      • 2016-05-05
      • 2020-06-05
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多