Excel宏将COUNTA添加到新的顶行

时间:2016-07-11 18:50:59

标签: excel excel-vba macros vba

我有一个Excel 2013工作表,其中每列都有一个标题行,然后是" DIRECT"在一些或所有细胞中。列中没有其他数据,只是" DIRECT"或空白。没有列是空白的,它们都有" DIRECT"至少一次。

我正在寻找执行以下操作的宏:

  • 添加新的第一行
  • 忽略原始标题行,但使用" DIRECT"来获取单元格的计数。在他们里面
  • 将该数字放在每列的相应新顶部单元格中
  • 对工作表中的每列进行上述操作
  • 无论最后一列还是数据行都在工作(我必须在几个不同大小的工作表上运行)

我录制了一个接近的宏,但它有两个问题:

  1. 它将COUNTA数据添加到工作簿的最后一行,这是不需要的(填充的列将是几百,而不是数千)
  2. 它引用了特定的单元格范围,因此可以截断具有更多行的工作表的数据
  3. Sub AddColumnCountsRecorded()
    '
    ' AddColumnCounts Macro
    '
    
    '
        Rows("1:1").Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Range("J1").Select
        ActiveCell.FormulaR1C1 = "=COUNTA(R[2]C:R[15]C)"
        Range("J1").Select
        Selection.Copy
        Range(Selection, Selection.End(xlToRight)).Select
        ActiveSheet.Paste
    End Sub
    

    如果有帮助:

    • 专栏" A"可以确定数据可能的最后一行("用户名"列",因此没有空白) - 尽管最后一行也会在不同工作表之间发生变化。

    • 第2行(标题行)可以确定数据的最后一列 - 它没有空白列;在每一列中,至少有一个单元格将包含" DIRECT"。

    有关编辑现有宏或从头编制新宏的任何建议都将非常感谢!

    谢谢!

    更新

    非常感谢Scott,这就是我最终得到的结果 - 这会将非空白单元格数添加到活动工作表中,并在最后一行停止包含数据。我只是直接调用它,没有下面提出的第二部分代码:

    Sub AddColumnCountsRecorded()
    
        With ActiveSheet
    
            .Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    
            Dim lRow As Long, lCol As Long
            lRow = .Range("A" & .Rows.Count).End(xlUp).Row
            lCol = .Cells(2, .Columns.Count).End(xlToLeft).Column
    
            .Range(.Cells(1, 2), .Cells(1, lCol)).FormulaR1C1 = "=COUNTA(R[2]C:R[" & lRow & "]C)"
    
        End With
    
    End Sub
    

1 个答案:

答案 0 :(得分:1)

Give this a shot. I made a separate sub that you can pass the worksheet reference too.

Sub AddColumnCountsRecorded(ws As Worksheet)

    With ws

        .Rows("1:1").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

        Dim lRow As Long, lCol As Long
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        lCol = .Cells(2, .Columns.Count).End(xlToLeft).Column

        .Range(.Cells(1, 2), .Cells(1, lCol)).FormulaR1C1 = "=COUNTA(R[2]C:R[" & lRow & "]C)"

    End With

End Sub

Call it like this:

Sub ColumnCount()

    AddColumnCountsRecorded Worksheets("Sheet1")

End Sub