插入行时UDF不更新

我对UDF很新,我不确定它们是如何运作的。 我的函数返回正确的信息,只要不插入新的行。 就好像headRng在首次使用时被保存到内存中,即使插入了新行也不会被更新。 我怎样才能解决这个问题?

另外。 我的function似乎循环了很多次。 在我的代码中,你会看到在1000行之后出现的msgbox。 所以我知道它至less循环1000次。 不知道为什么它循环。 忘了我有另一个工作簿打开这个相同的function,导致了1000+循环。

如何使用它的例子: https : //i.imgur.com/zRQo0SH.png

 Function StraightLineFunc(headRng As Range, dataRng As Range) As Double Application.Volatile True Dim arrCntr As Integer Dim arr() As Variant Dim rowOffset As Integer Dim cntr As Integer Dim stdvTotal As Double stdvTotal = 0 cntr = 0 arrCntr = 1 For Each cell In headRng If cell <> "Response" And cell <> "Open-Ended Response" And cell <> "" Then If cell.Offset(-1, 0) <> "" And cntr > 0 Then stdvTotal = stdvTotal + StdDev(arr) End If If cell.Offset(-1, 0) <> "" Then cntr = cntr + 1 'new grouping heading Erase arr ReDim arr(headRng.Columns.Count) arrCntr = 1 arr(arrCntr) = cell(dataRng.Row - 1, 1).Value arrCntr = arrCntr + 1 Else arr(arrCntr) = cell(dataRng.Row - 1, 1).Value arrCntr = arrCntr + 1 End If End If Next cell stdvTotal = stdvTotal + StdDev(arr) StraightLineFunc = stdvTotal End Function Function StdDev(arr) Dim i As Integer Dim avg As Single, SumSq As Single Dim k1 As Long, k2 As Long Dim n As Long k1 = LBound(arr) k2 = UBound(arr) n = 0 avg = Mean(arr) For i = k1 To k2 If arr(i) = 0 Or arr(i) = "" Then 'do nothing Else n = n + 1 SumSq = SumSq + (arr(i) - avg) ^ 2 End If Next i StdDev = Sqr(SumSq / (n - 1)) End Function Function Mean(arr) Dim Sum As Single Dim i As Integer Dim k1 As Long, k2 As Long Dim n As Long k1 = LBound(arr) k2 = UBound(arr) Sum = 0 n = 0 For i = k1 To k2 If arr(i) = 0 Or arr(i) = "" Then 'do nothing Else n = n + 1 Sum = Sum + arr(i) End If Next i Mean = Sum / n End Function 

作为关于headrng第一个地址纪念,它必须是一个问题,你如何检查子范围 ,依靠一些非空白单元格的存在本身。 所以如果在headrng行和上面的行之间headrng一行headrng行,将会有不同的行为

至于循环1000次,它必须是因为你必须复制一个公式,使用它到行1000,以便Excel即使你只改变一行,Excel计算

而且从你的数据例子中,我认为你应该改变代码如下

 Option Explicit Function StraightLineFunc1(headRng As Range, dataRng As Range) As Double Application.Volatile True Dim arrCntr As Integer Dim arr() As Variant Dim rowOffset As Integer Dim cntr As Integer Dim stdvTotal As Double Dim cell As Range stdvTotal = 0 cntr = 0 arrCntr = 1 For Each cell In headRng If cell <> "Response" And cell <> "Open-Ended Response" And cell <> "" Then If cell.Offset(-1, 0) <> "" And cntr > 0 Then stdvTotal = stdvTotal + WorksheetFunction.StDev(arr) End If If cell.Offset(-1, 0) <> "" Then cntr = cntr + 1 'new grouping heading Erase arr arrCntr = 1 ReDim Preserve arr(1 To arrCntr) arr(arrCntr) = cell(dataRng.Row - 1, 1).Value Else arrCntr = arrCntr + 1 ReDim Preserve arr(1 To arrCntr) arr(arrCntr) = cell(dataRng.Row - 1, 1).Value End If End If Next cell stdvTotal = stdvTotal + WorksheetFunction.StDev(arr) StraightLineFunc1 = stdvTotal End Function 

但是从纪念问题来看,这仍然会受到影响

所以我也会抛出一个不同的“子范围”检查如下

 Function StraightLineFunc2(headRng As Range, dataRng As Range) As Double 'Application.Volatile True Dim stdvTotal As Double Dim j1 As Long, j2 As Long j1 = 1 Do Until InStr("Open-Ended Response", headRng(1, j1)) = 0 And headRng(1, j1) <> "" j1 = j1 + 1 Loop Set headRng = headRng.Offset(, j1 - 1).Resize(, headRng.Columns.Count - j1 + 1) j1 = 1 Do While j1 < headRng.Columns.Count j2 = j1 Do While headRng(1, j2) <> "Response" And j2 <= headRng.Columns.Count j2 = j2 + 1 Loop stdvTotal = stdvTotal + WorksheetFunction.StDev(Range(headRng(1, j1), headRng(1, j2 - 1)).Offset(dataRng.Row - headRng.Row)) j1 = j2 + 1 Loop StraightLineFunc2 = stdvTotal End Function