Excel VBA:基于列的动态更改功能

时间:2018-06-25 20:04:27

标签: excel vba function dynamic subroutine

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

enter image description here

我想将AA5设置为“ = myFunction($ AA1:$ AD4)”,然后单击并拖动以使用自动填充功能使用相同的“ = myFunction”填充AB5,AC5和AD5 ($ 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时,它知道单元格排在哪一列并基于该列执行计算,并使用它几乎是一个参数。它也不总是四行,因此它必须能够容纳变化的行数,但是只要用户选择相同的数据类型,.Columns就可以使用它。

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

1 个答案:

答案 0 :(得分:1)

这样的事情呢?基本上,您将获得使用Application.Caller.Column输入公式的单元格的列。然后inputRange.Column为您提供输入范围的最左列。根据两者的区别,您知道要使用哪个工作表函数。如果差异为0,则您的公式将输入到第一栏中,因此您使用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