Excel - Написание сложной формулы - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующие числа в диапазоне AI3:AJ41:

34  3
26  3
25  3
24  2
24  2
24  2
24  2
24  2
24  2
24  2
24  2
24  2
22  2
22  2
22  2
22  2
21  2
21  2
21  2
21  2
19  2
19  2
19  2
19  2
19  2
19  2
19  2
19  2
17  2
17  2
17  2
15  2
15  2
15  2
15  2
12  1
12  1
12  1
12  1

Столбец AI содержит значения, в то время как столбец AJ содержит следующую формулу в ячейке AJ3:

=ROUNDUP(AI3/12,0)

, который простирается до AI41.

В ячейке AJ2 У меня есть следующая формула суммы

=SUM(AJ3:AJ41)

, что приводит к 77.

Я хочу записать формулу в ячейку AI2, чтобы получить тот же результат, что и сейчас, в AJ2 без использования столбца (хелпер) AJ, то есть только с использованием значений столбца AI.

Может быть, это может быть макрос VB, если я не знаю ...

Я предоставил ссылку на мой Файл образца для простого копирования / вставки,Спасибо за ваше время и помощь.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Sumproduct

Если вы не хотите использовать формулу массива (слишком ленив, чтобы нажать CTRL SHIFT ENTER), вы можете использовать:

=SUMPRODUCT(ROUNDUP(AI$3:AI$41/12,0))

и нажать ENTER.Результат 77.

Забавно

Я даже не знал, что была функция ROUNDUP, поэтому я использовал ее сначала:

=SUMPRODUCT(IF(MOD(AI3:AI41,12)=0,INT(AI3:AI41/12),INT(AI3:AI41/12)+1))

, но это нене работает без ввода в качестве формулы массива.Это должно служить напоминанием о том, что даже SUMPRODUCT не всегда будет работать как формула «без массива».

Добавление

Если вы хотите применить тот же принцип к диапазону A1:AH1, используйте эту формулу:

=SUMPRODUCT(ROUNDUP($A1:$AH1/12,0))

Результат 87, хотя.

0 голосов
/ 26 ноября 2018

Обновлено 27 ноября

Я все еще в аэропорту и решил сделать эту проблему ударом без VBA / UDF.

Функция Array может получитьты чего хочешь.Введите это в свой рабочий лист с помощью CTL SHIFT ENTER для решения, отличного от vba:

=SUM(ROUNDUP(COUNTIF(A1:AH1,">="&ROW(INDIRECT("A1:A"&MAX(A1:AH1),TRUE)))/12,0))

Вы можете скачать файл XLSM здесь .

Для тех, кто когда-либо пожелал, чтобы они могли выполнять «циклы» VBA в обычной формуле Excel, это довольно хороший пример того, как подходить, так как это, по сути, «циклы» через диапазон с более высоким целым числом каждый разиспользуя функции Row и Indirect. Чип Пирсон отлично справляется с подобными вещами .

ОБНОВЛЕНО 26 ноября

Мне скучно сидеть в аэропорту, поэтому я дам этоеще один ход ... Я думаю, что эта пользовательская функция получит ОП, что они хотят.Поместите это в любое место, и вы получите 77. =UMutCustom2(A1:AH1)

Необходимый код пользовательской функции находится здесь:

Function UMutCustom2(rng As Range) As Double
Dim r As Long

For r = 1 To Application.WorksheetFunction.Max(rng)

    UMutCustom2 = Application.WorksheetFunction.RoundUp(Application.WorksheetFunction.CountIf(rng, ">=" & r) / 12, 0) + UMutCustom2

Next r


End Function

оригинальный ответ

Я включил оба этих примера в файл здесь .

Вероятно, проще всего использовать формулу массива.В ячейку Ai1 поместите эту формулу: =SUM(ROUNDUP(AI3:AI999/12,0))

Однако, после ввода формулы ВЫ ДОЛЖНЫ УДЕРЖИТЬ CTR SHIFT ENTER!

Это создастфигурные скобки вокруг формулы, поэтому при просмотре формулы она должна выглядеть следующим образом: {=SUM(ROUNDUP(AI3:AI999/12,0))} и в моей версии файла сумма равна 77.

(хорошая новость заключается в том, что в 2019 году новый механизм Excel обработаетне требует CTL SHIFT !)

В качестве альтернативы, если вы хотите создать пользовательскую функцию с использованием vba, вы можете использовать эту пользовательскую функцию, которая не требует ввода ctr shift ... вот код VBA длясделать это:

Function UMuTCustomFunc(rng As Range) As Double
    Dim ws As Worksheet, rCell As Range

    Set ws = Sheets(rng.Parent.Name)

    For Each rCell In Intersect(ws.UsedRange, rng).Cells
        UMuTCustomFunc = Application.WorksheetFunction.RoundUp(rCell.Value / 12, 0) + UMuTCustomFunc

    Next rCell

End Function
...