Как сократить код VBA с помощью повторяющейся функции СУММЕСЛИМН? - PullRequest
0 голосов
/ 19 июня 2020

Я записал количество СУММЕСЛИМН в VBA на основе изменения значения в ячейках

Например, ячейка A23 - это раскрывающееся меню с итоговым и UK

If A23 = "Total" Then
Result.Range("A24").Value =     WorkSheetFunction.Sumifs(Range(B:B)),
Range(C:C)), "Year",
Range(D:D)), "Group")

If A23 = "UK" Then
Result.Range("A24").Value = WorkSheetFunction.Sumifs(Range(B:B)),
Range(C:C)), "Year",
Range(D:D)), "Group",
Range(E:E)), "UK")

на основе в приведенном выше примере второй код является повторением первого кода, но с дополнительным диапазоном, включенным для выбора "UK"

Вместо того, чтобы постоянно переписывать его, есть способ сократить код, чтобы я мог просто объедините любой дополнительный диапазон, который я хочу включить?

Итак, в идеале я мог бы иметь что-то вроде:

Test = Result.Range("A24").Value = WorkSheetFunction.Sumifs(Range(B:B)),
Range(C:C)), "Year",
Range(D:D)), "Group"

If A23 = Total Then
A24 = Test)

If A23 = UK Then
A24 = Test &, Range(E:E), "UK")

Возможно ли это, и если да, то как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

(этот ответ опубликован в основном в ответ на второй комментарий с включенным фактическим кодом - хотя похоже, что фактическая операция, которую вы выполняете, немного отличается?)

Итак, как я сказал, вам нужно чтобы немного упростить этот код, сохранив отдельные части в переменных

Dim strFormula as String
Dim rngLIC as Range
Dim rngRegion as Range
Dim rngYear as Range

Set rngLIC = Range(rngHeaders.Find(LIC) , rngHeaders.Find(LIC).End(xlDown))
Set rngRegion = Range(rngHeaders.Find(Year), rngHeaders.Find(Year).End(xlDown))
Set rngYear = Range(rngHeaders.Find(Year), rngHeaders.Find(Year).End(xlDown))

'and I think you'll need to add others for the extra bit you wanted to fix, but you get the pattern

strFormula = "=SUMIFS(" & _
                rngLIC.Address(xlA1) & "," & _
                rngRegion.Address(xlA1) & ", A23," & _
                rngYear.Address(xlA1) & ", ""Year 0"")"

'Then add the replace bit I detailed above if necessary to add bits to the formula

Этот код, надеюсь, должен делать то же самое, что и фрагмент кода, который вы добавили в комментарий. Это помогает? (пожалуйста, проголосуйте, если это так, потому что я пытаюсь построить свою репутацию !!)

0 голосов
/ 19 июня 2020

Не могли бы вы ввести фактическую функцию в ячейки, а не выполнять расчет worksheetfunction в vba? (выполнение расчетов функций рабочего листа фактически не вводит формулу в ячейки, просто возвращается выходное значение)

Возможно, что-то вроде этого:

Dim strFormula as String
strFormula = "=SUMIFS(B:B, C:C, ""Year"", D:D, ""Group"")"
'Thats the basic formula

If Result.Range("A23").Value = "UK" Then
    strFormula = replace(strFormula, ")", "E:E, ""UK"")")
    'that replaces the end bracket with the extra condition
End If

Result.Range("A4").FormulaA1 = strFormula
...