私はUDFには新しく、どのように機能するのかよく分かりません。私の関数は、新しい行が挿入されない限り正しい情報を返します。最初の使用時にはheadRng
がメモリに保存され、新しい行が挿入されても更新されないようです。これをどうすれば解決できますか?行が挿入されたときにUDFが更新されない
さらに、私の機能は多くの時間ループしているようです。私のコードでは、1000行後に表示されるmsgboxが表示されます。だから私はそれが少なくとも1000回ループしていることを知っています。なぜそれがループしているのか分かりません。 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
を次のようにチェックする別の「サブレンジ」で投げると思います。また、あなたのコードのどこか他の場所から関数を呼び出すか、または式として使用していますか? – Brian
あなたはheadRngとdataRngとして渡すものを示して、十分なコンテキストがあるようにする必要があります。コードはheadRngの周りでループするので、その範囲の定義があなたの問題の原因になりますか? – Dave
@Daveは、使用時の外観を追加したばかりです。 –