Excel VBA: 基于列的动态变化函数

Excel VBA: Dynamically Changing Function Based on Column

嘿,我正在尝试编写一个 excel 函数,该函数接受用户 select 编辑的范围,并根据要填充的单元格所在的列执行不同的计算。下面的屏幕截图显示了列的设置。

我想将 AA5 设置为“=myFunction($AA1:$AD4)”,然后我想点击并拖动以使用自动填充功能使用相同的“填充 AB5、AC5 和 AD5” =myFunction($AA1:$AD4)" 但是这个 myFunction 将根据自动填充期间填充的单元格执行不同的操作。

我知道如何在子例程中执行此操作,用户将 select 第一个打开单元格 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 它知道单元格与哪一列对齐并根据以下内容执行计算那个,并将其用作 argument/parameter 几乎。它也不会总是 4 行,因此它需要能够容纳不同的行数,但是只要用户 select 的数据类型相同,.Columns 就应该可以使用。

这可能吗?我该怎么做?感谢您提前提供任何帮助。我已经做了很多搜索,我不知道我是否没有找到正确的方法,但我找不到任何真正有帮助的东西。

像这样的事情怎么样?基本上,您可以使用 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

示例视图在这里: