Excel VBA: динамическое изменение функции на основе столбца - PullRequest
0 голосов
/ 25 июня 2018

Привет, я пытаюсь написать функцию Excel, которая принимает выбранный пользователем диапазон и выполняет различные вычисления, основываясь на столбце, в котором находится ячейка, в которую пополняется строка. На приведенном ниже снимке экрана показана настройка столбцов.

enter image description here

Я хочу установить AA5 равным "= myFunction ($ AA1: $ AD4)", а затем я хочу, чтобы при нажатии и перетаскивании использовалась функция автозаполнения, чтобы заполнить AB5, AC5 и AD5 одним и тем же "= myFunction ($ AA1: $ AD4) "но эта функция myFunction будет выполнять разные действия в зависимости от того, какая ячейка заполняется во время автозаполнения.

Я знаю, как это сделать в подпрограмме, в которой пользователь выбирает первую открытую ячейку AA5, и запрашивается диапазон, который следует использовать для расчетов. Я хотел бы сделать что-то вроде:

Sub CalcCells()
   Dim myRange As Range
   Set myRange = Application.InputBox("Select the cells you want to use...", Type:=8)

   Dim numColumn As Long
   For numColumn = 0 To myRange.Columns.Count - 1
      Select Case numColumn
         Case Is = 0
            ActiveCell.Offset(0, numColumn).Formula = "=SUM(" + myRange.Columns(1) + ")"
         Case Is = 1
            ActiveCell.Offset(0, numColumn).Formula = "=SUMPRODUCT(" + myRange.Columns(1) + "," + myRange.Columns(2) + ")"
         Case Is = 2
            ActiveCell.Offset(0, numColumn).Formula = "=SUMPRODUCT(" + myRange.Columns(1) + "," + myRange.Columns(3) + ")/SUM(" + myRange.Columns(1) + ")"
         Case Is = 3
            ActievCell.Offset(0, numColumn).Formula = "=SUMSQ(" + myRange.Columns(4) + ")"
      End Select
   Next numColumn
End Sub

Так что в основном я хочу сделать именно это, но я хочу, чтобы это была функция, которая, когда я щелкаю и перетаскиваю и автозаполняю AB5: AD5, она знает, к какому столбцу соответствует ячейка, и выполняет вычисления, основанные на этом, и использует это почти как аргумент / параметр. Это также не всегда будет 4 строки, поэтому он должен быть способен приспосабливаться к различным числам строк, но .Columns должна работать с этим, пока пользователь выбирает только один и тот же тип данных.

Возможно ли это и как я могу это сделать? Спасибо за любую помощь заранее. Я много занимался поиском и не знаю, правильно ли я ищу, но не могу найти ничего, что действительно помогло бы.

1 Ответ

0 голосов
/ 26 июня 2018

Как насчет этого?По сути, вы получаете столбец ячейки, в которую вводите формулу с Application.Caller.Column.Затем inputRange.Column дает вам самый левый столбец вашего диапазона ввода.Основываясь на их разнице, вы знаете, какую функцию рабочего листа вы хотите использовать.Если разница равна 0, ваша формула вводится в 1-м столбце, поэтому вы используете Sum.Если разница равна 1, вы используете Sumproduct и т. Д.

Function SummarizeCells(inputRange As Range) As Double

    Dim col As Long
    col = Application.Caller.Column - inputRange.Column

    Select Case col
        Case 0
            SummarizeCells = WorksheetFunction.Sum(inputRange.Columns(1))
        Case 1
            SummarizeCells = WorksheetFunction.SumProduct(inputRange.Columns(1), inputRange.Columns(2))
        Case 2
            SummarizeCells = WorksheetFunction.SumProduct(inputRange.Columns(1), inputRange.Columns(3)) / WorksheetFunction.Sum(inputRange.Columns(1))
        Case 3
            SummarizeCells = WorksheetFunction.SumSq(inputRange.Columns(4))
    End Select

End Function

Пример представления здесь:

Output

...