【问题标题】:Autofill Application.Countifs.Formula VBA Excel自动填充 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....." 方法,以便我可以使用数组,因为标准会根据所选的下拉选项而有所不同。

有什么线索吗?

【问题讨论】:

    标签: vba excel


    【解决方案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,感谢您的建议。
    • 如果您满意,您能否检查一下这个问题是否已回答,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2013-09-18
    • 2019-03-07
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多