Ich bin ziemlich neu zu UDFs und ich bin mir nicht sicher, ganz wie sie funktionieren. Meine Funktion gibt korrekte Informationen zurück, solange keine neuen Zeilen eingefügt werden. Es ist, als ob headRng
bei der ersten Verwendung gespeichert wird und nicht aktualisiert wird, selbst wenn eine neue Zeile eingefügt wird. Wie kann ich das beheben?UDF nicht aktualisiert, wenn Zeilen eingefügt
Zusätzlich. Meine Funktion scheint eine Menge von Schleifen zu sein. In meinem Code wird eine Nachrichtenbox angezeigt, die nach 1000 Zeilen angezeigt wird. Ich weiß also, dass es mindestens 1000 Mal wiederholt wird. Keine Ahnung, warum es schleift. Ich habe vergessen, dass eine andere Arbeitsmappe mit derselben Funktion geöffnet wurde, die die Schleife über 1000 verursachte.
Beispiel dafür, wie es verwendet werden könnte: 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
Sie können von der If-Anweisung loswerden, wenn Sie nicht die msgbox wollen. Rufen Sie die Funktion auch irgendwo anders in Ihrem Code auf oder verwenden Sie sie als Formel? – Brian
Sie müssen angeben, was Sie als headRng und dataRng übergeben, damit genügend Kontext vorhanden ist. Der Code läuft in der Nähe von headRng, sodass die Definition dieses Bereichs wahrscheinlich die Ursache Ihrer Probleme ist? – Dave
@Dave, habe gerade ein Bild hinzugefügt, wie es aussehen würde. –