总计 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
我目前正在尝试在 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