【问题标题】:Autofill breaks with one record [Excel-VBA]自动填充中断一条记录 [Excel-VBA]
【发布时间】:2014-12-11 20:15:30
【问题描述】:

我的记录从 B8 单元格开始,我需要在 A 列中对它们进行计数,从单元格 A8 开始。

我使用了这个问题“autofill down according to adjacent column”的答案,但是当记录计数为 0 或 1 时我该如何处理?当有 1 条记录时,它会出错。似乎自动填充无法自动填充一个单元格。

我有一些条件测试零和一,但有没有更简洁的方法呢?

LastRow = Cells(Rows.Count, 2).End(xlUp).Row    'Find last row        

If LastRow >= 8 Then                            'If recordcount is 1 or greater
    Range("A8").FormulaR1C1 = "1"               'First number is "1"
        If Not LastRow = 8 Then                 'If not recordcount exactly 1 
           'Enumerate the remaining records with Autofill
            Range("A8").AutoFill Destination:=Range("A8:A" & LastRow), Type:=xlLinearTrend      
        End If
 End If

【问题讨论】:

    标签: vba excel autofill


    【解决方案1】:

    这有两种经过测试的方法来完成您正在尝试做的事情。第一种方法是您已经在使用的方法,删除阻止它工作的元素。第二种是另一种检查方法,因为它可能会为您提供未来项目的想法,该项目具有类似的要求,但不需要使用自动填充。

    测试

    Sub AutoFiller()
    
    Dim LastRow As Long
        LastRow = Cells(Rows.Count, "B").End(xlUp).row    'Find last row
    
        Sheets("Sheet1").Cells(8, 1) = 1                'First number is "1"
        Range("A8").AutoFill Destination:=Range("A8:A" & LastRow), Type:=xlLinearTrend             
    End Sub
    

    使用 LOOP 代替自动填充:

    Sub VBAAutoFill()
    
    Dim LastRow As Long
    Dim count As Long
    
        LastRow = Cells(Rows.Count, 2).End(xlUp).Row 
        count = 1
    
        For lRow = 8 to LastRow
            Sheets("Sheet1").Cells(lRow, 1) = count
            count = count + 1
        Next lRow
    end Sub
    

    EXCEL FUNCTION:计算所有条目,如果您只想知道总共有多少..

    COUNTA(B8:B10000)
    

    编辑笔记:详细说明笔记中的过程,纠正错别字。原始编辑添加了解决方案。

    【讨论】:

      【解决方案2】:

      My records start in cell B8, and I need to count them in Column A, starting in cell A8.

      我的意思是,您实际上是在枚举行。这应该有助于解决您的错误问题,如果它不是您想要的 A 列中的内容,您应该不难做出调整:

       Public Sub GetRangeCount()
      
          Dim bRange As Range
          Set bRange = Range(Range("B8"), Range("B1048575").End(xlUp))
      
          Dim i As Integer
          i = 0
      
          For Each c In bRange
      
              If c.Value <> "" Then
                  i = i + 1
                  c.Offset(0, -1).Value = i
              End If
      
          Next
      
      End Sub
      

      【讨论】:

      • 那行得通。为 B 的最后一行硬编码 1048575 可能是一个坏主意,以防使用稍旧版本的 Excel 的人使用该公式。
      • 你是对的。您的示例更适合更广泛的重用。我可以改变我的,但我们的答案之间唯一真正的区别是ForFor Each 并且我的示例在遇到空白单元格时会跳过枚举......我什至不确定OP想要/需要。
      • 留下你的,让 OP 选择,让未来的读者在变化中找到价值。谁获得信任并不重要,因为我们都同时做到了。此外,将来会有人需要您以稍微不同的方式所做的事情,就像 OP 在其他地方修改了其他人的答案一样。荣誉.. 虽然,我会修改 LastRow,但由于原因,您的答案仍然不同且有效。使用 For Each 和 Offset,并跳过任何空白(不错的添加)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2013-09-18
      • 2019-03-07
      相关资源
      最近更新 更多