自动填充 Application.Countifs.Formula VBA Excel
Posted
技术标签:
【中文标题】自动填充 Application.Countifs.Formula VBA Excel【英文标题】:Autofill Application.Countifs.Formula VBA Excel 【发布时间】:2013-11-10 22:19:23 【问题描述】:我认为这可能是一个简单的问题,但我似乎无法找到一种方法来自动填充 Application.WorksheetFunction.SumProduct(wsf.CountIf 公式,以便行号会随着公式的下降而改变。
我想从 A 列自动填充 B2 到 LastRow 的这个公式
Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range(**B2 Here**), Doctors, Sheet2.Range(**B2 Here**), wsf.Transpose(Emergency)))
假设 A 列最后使用的行是 6,所以公式应该从 B2 到 B6 自动填充,例如:
B3 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range(**B3 Here**)....
B4 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range(**B4 Here**)....
B5 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range(**B5 Here**)....
B6 = Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range(**B6 Here**)....
我不想使用 .Formula "=SUMPRODUCT(COUNTIFS....." 方法,以便我可以使用数组,因为标准会根据所选的下拉选项而有所不同。
有什么线索吗?
【问题讨论】:
【参考方案1】:AutoFill
可以为您做到这一点。假设您的公式以 B2
开头并且结尾行发生更改,则语法为:
LRow = Sheet1.Cells(Rows.Count,1).End(xlUp).Row
With Range("B2")
.Formula = 'Your formula here.
.AutoFill Destination:=Range("B2:B" & LRow)
End With
另一种选择是使用FillDown
作为AutoFill
几乎总是有怪癖。语法几乎相同:
LRow = Sheet1.Cells(Rows.Count,1).End(xlUp).Row
Sheet1.Range("B2").Formula = 'Your formula here.
Sheet1.Range("B2:B" & LRow).FillDown
如果这有帮助,请告诉我们。
更新:
很像戴夫的回答,这是我对你的公式的看法:
Sub Test()
Dim Sh As Worksheet
Set Sh = ThisWorkbook.Sheets("Sheet1") 'Modify as required.
With Sh
LRow = .Cells(Rows.Count, 1).End(xlUp.Row)
.Range("B2").Formula = "=SUMPRODUCT(COUNTIFS($C$2:$C$16, ""Doctors"", $I$2:$I$16, $B2))"
.Range("B2:B" & LRow).FillDown
End With
End Sub
然而,关键是:如果你只是在做一个COUNTIFS
检查Column C
是否有Doctors
作为值并且Column I
有B2
的值,你应该从您的公式中删除SUMPRODUCT
,因为它不是必需的。 SUMPRODUCT
曾经是检查多个条件的方法,但在 Excel 2007 及更高版本中,它已完全被 COUNTIFS
取代,用于简单的基于多个条件的检查和计数。我的意思是,正确的代码几乎如下:
Sub Test()
Dim Sh As Worksheet
Set Sh = ThisWorkbook.Sheets("Sheet1") 'Modify as required.
With Sh
LRow = .Cells(Rows.Count, 1).End(xlUp.Row)
.Range("B2").Formula = "=COUNTIFS($C$2:$C$16, ""Doctors"", $I$2:$I$16, $B2)"
.Range("B2:B" & LRow).FillDown
End With
End Sub
STILL,进一步的公式取证和评估揭示了一个更棘手的部分:您在B2
及以下输入公式,但您的COUNTIFS
正在检查B2
及以下作为条件也是。这不仅令人困惑,而且容易出错(如果还没有出错的话),因为它会导致循环引用。
此时,我的问题是,您到底要检查和/或计算什么?在我看来,这不仅仅是一个 VBA 问题,因为我相信您对获取数字的内容和方式感到困惑。虽然我们的方法是合理的,并且对于您的问题基本上是完美的,但如果公式不正确,上述内容将毫无用处。 :)
【讨论】:
不错的一个!您可能可以删除Columns("A")
,因为在Cells(Rows.Count,1)
中也引用了列“A” - 例如Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
嘿,戴夫。根据您的评论更改。谢谢!
我已经尝试过此代码:Dim wsf Set wsf = Application.WorksheetFunction LRow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row Sheet1.Range("B2").Formula = "Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet1.Range(""C2:C16""), Doctors, Sheet1.Range(""I2:I16""), Sheet1.Range(""B2"")))" Sheet1.Range("B2:B" & LRow).FillDown
它不起作用我希望 B2 在填写公式时进行更改。我究竟做错了什么? @DaveU 有什么线索吗?
Application.Worksheet...
不在单元格内使用。如果您使用.Formula
属性,则您想要的公式应该与您正确输入到单元格中的公式相同。此外,您不能Dim
函数。 Set wsf = Application.WorksheetFunction
不是有效的声明。请参阅上面我修改后的答案。
@BK201,我觉得有趣的是,其他人也觉得这个公式有些混乱。问题 - 我注意到您从公式文本中删除了工作表引用 (.Name
)。是因为我们假设公式在这种情况下在活动工作表上运行吗?只是问;-)【参考方案2】:
试试这个。
这是我的数据的布局方式:
此代码进入常规模块:
Sub Test(s As String) 'input frpm combo box
Dim Sh As Worksheet, LRow As Long
Set Sh = ThisWorkbook.Sheets("Sheet1") 'Modify as required.
If LCase(s) = "all" Then s = "*"
s = Chr(34) & s & Chr(34) 'bracket with quotes
With Sh
LRow = .Cells(Rows.Count, 1).End(xlUp).Row
.Range("B2").Formula = "=COUNTIFS($C$2:$C$16," & s & ", $I$2:$I$16, $A2)"
.Range("B2:B" & LRow).FillDown
End With
End Sub
此代码进入组合框的工作表模块(本例中为 Sheet1)。
Private Sub ComboBox1_Change()
Test Me.ComboBox1.Value
End Sub
我不确定您的公式结果,但它已正确加载。
【讨论】:
我已修改代码以合并All
- @BK201,感谢您的建议。
如果您满意,您能否检查一下这个问题是否已回答,谢谢。以上是关于自动填充 Application.Countifs.Formula VBA Excel的主要内容,如果未能解决你的问题,请参考以下文章