总计 VBA

Creating a total with VBA

我目前正在尝试在 sheet 的底部创建总计、最小值、最大值和平均值 table。我还希望 "table" 在最后一个填充的单元格下方开始两个单元格。

我正在提取不同数量的数据,可能是一天,也可能多达 100 个。

Sub max()

Dim N As Long

N = Cells(Rows.COUNT, "B").End(xlUp).Row

'Cells(N + 1, "B").Formula = "=MAX(B:B" & N & ")" <-COMMENTED OUT / THIS WORKS

Cells(N + 1, "B").Formula = "=IF(COUNT(B:B)=0,"",MAX(B:B))" & N & ")"

End Sub

这就是我目前所拥有的。我收到 1004 错误,并意识到我没有正确调用变量。我还需要在大约 200 列中执行此操作。我哪里错了?

尝试使用 VBA 创建公式时,如果您想在该公式中使用引号,则必须 "double up":

Cells(N + 1, "B").Formula = "=IF(COUNT(B:B)=0,"""",MAX(B:B))" & N & ")"

您可以使用 Chr(34) 将其附加到公式中。

Cells(N + 1, "B").Formula = "=IF(COUNT(B:B)=0,"& Chr(34) & Chr(34) &",MAX(B:B))" & N & ")"

编辑:更新 non-contiguous tables.

这假设您在工作表的 table 下方或右侧没有任何内容,并且您的 table 从 B13 开始(headers 将是第 12 行) :

Option Explicit

Public Sub BuildStatsTable()
    Dim lngMaxRow As Long
    Dim lngMaxCol As Long
    Dim lngCol As Long
    Dim strRng As String
    Dim rngLastUsed As Range

    Set rngLastUsed = GetLastRange(Cells(13, 2))
    lngMaxCol = rngLastUsed.Column
    lngMaxRow = rngLastUsed.Row

    For lngCol = 2 To lngMaxCol
        strRng = "R13C" & lngCol & ":R" & lngMaxRow & "C" & lngCol

        Cells(lngMaxRow + 2, lngCol).FormulaR1C1 = "=IF(COUNT(" & strRng & ")=0,"""",SUM(" & strRng & "))"
        Cells(lngMaxRow + 3, lngCol).FormulaR1C1 = "=IF(COUNT(" & strRng & ")=0,"""",MIN(" & strRng & "))"
        Cells(lngMaxRow + 4, lngCol).FormulaR1C1 = "=IF(COUNT(" & strRng & ")=0,"""",MAX(" & strRng & "))"
        Cells(lngMaxRow + 5, lngCol).FormulaR1C1 = "=IF(COUNT(" & strRng & ")=0,"""",AVERAGE(" & strRng & "))"
    Next lngCol
End Sub

Private Function GetLastRange(rngTopLeft As Range) As Range
    Dim rngUsed As Range
    Dim lngMaxRow As Long
    Dim lngMaxCol As Long

    Set rngUsed = Range(rngTopLeft, rngTopLeft.SpecialCells(xlCellTypeLastCell))

    lngMaxRow = rngUsed.Find(What:="*", _
                            After:=rngUsed.Cells(1), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Row
    lngMaxCol = rngUsed.Find(What:="*", _
                            After:=rngUsed.Cells(1), _
                            Lookat:=xlPart, _
                            LookIn:=xlFormulas, _
                            SearchOrder:=xlByColumns, _
                            SearchDirection:=xlPrevious, _
                            MatchCase:=False).Column

    Set GetLastRange = Cells(lngMaxRow, lngMaxCol)
End Function