2013-11-10 10 views
0

Я думаю, что это может быть простой вопрос, но я не могу найти способ автозавершить формулу Application.WorksheetFunction.SumProduct (wsf.CountIf, чтобы номер строки изменился как формула идет вниз.Autofill Application.Countifs.Formula VBA Excel

Я хочу автозаполнения эту формулу для B2 до LastRow из Колонка A Application.WorksheetFunction.SumProduct(wsf.CountIfs(Sheet2.Range(**B2 Here**), Doctors, Sheet2.Range(**B2 Here**), wsf.Transpose(Emergency)))

Итак, давайте предположим, что последний используемый строка для столбца А 6, поэтому формула должна автозаполнения с В2 до 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 

Сообщите нам, если это поможет.

UPDATE:

Многое, как ответ Дейва, вот мое взятие на вашей формуле:

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, поскольку я считаю, что вы смущены тем, что и как вы хотите получить ваши цифры. Хотя наш подход является обоснованным и в основном идеален для вашего вопроса, если формула неверна, это бесполезно. :)

+0

Nice one! Вероятно, вы можете удалить «Столбцы» («A»), так как столбец «A» также упоминается в «Ячейках (Rows.Count, 1)» - например, 'Sheet1.Cells (Rows.Count, 1) .End (xlUp) .Row' – DaveU

+0

Эй, Дейв. Изменено согласно вашему комментарию. Благодаря! – Manhattan

+0

Я пробовал этот код: '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 »),« Врачи »,« Лист1. »(« «I2: I16»), Sheet1.Range («« B2 »))) " Sheet1.Range (" B2: B "& LRow) .FillDown' Он не работает. Я хочу, чтобы B2 изменялся по мере заполнения формулы. Что я делаю не так? @DaveU Любые подсказки? – CaptainABC

0

Попробуйте это.

Вот как мои данные выложено:

enter image description here

Этот код идет в обычном модуле:

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 

Этот код идет в модуле листа со списком (Лист1 в данном случае) ,

Private Sub ComboBox1_Change() 
    Test Me.ComboBox1.Value 
End Sub 

Я не уверен в ваших результатах формулы, но загружается правильно.

+0

Я изменил код, чтобы включить 'All'- @ BK201, спасибо за ваше предложение. – DaveU

+0

Если вы удовлетворены, можете ли вы проверить этот вопрос, как ответили, спасибо. – DaveU

Смежные вопросы