自动填充 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 IB2 的值,你应该从您的公式中删除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的主要内容,如果未能解决你的问题,请参考以下文章

如何让Excel自动编号及序号自动填充

谷歌自动填充问题???

华为怎么设置验证码自动填充

谷歌浏览器自动填充功能怎么用

如何禁止表单用户名,密码自动填充

excel怎么自动填充颜色