Dies ist ein Screenshot meiner Daten. AverageIf Funktion ergibt "#VALUE!"
Dim dBT As Object 'global dictionary
Sub buttonpresscount()
'constants for column positions
Const COL_BLOCK As Long = 1
Const COL_TRIAL As Long = 2
Const COL_ACT As Long = 7
Const COL_AOI As Long = 8
Const COL_RT As Long = 16
Const COL_FT As Long = 17
Dim rng As Range, lastrow As Long, sht As Worksheet
Dim d, r As Long, k, resBT()
Set sht = Worksheets("full test")
lastrow = sht.Cells(Rows.Count, 3).End(xlUp).Row
Set dBT = CreateObject("scripting.dictionary")
Set rng = sht.Range("B7:T" & lastrow)
d = rng.Value 'get the data into an array
ReDim resBT(1 To UBound(d), 1 To 1) 'resize the array which will
' be placed in ColT
'get unique combinations of Block and Trial and pressedcounts for each
For r = 1 To UBound(d, 1)
k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key
dBT(k) = dBT(k) + IIf(d(r, COL_ACT) <> "", 1, 0)
Next r
'populate array with appropriate counts for each row
For r = 1 To UBound(d, 1)
k = d(r, 1) & "|" & d(r, 2) 'create key
resBT(r, 1) = dBT(k) 'get the count
Next r
'place array to sheet
sht.Range("T7").Resize(UBound(resBT, 1), 1) = resBT
'clear dictionary
dBT.RemoveAll
'count AOI entries
For r = 1 To UBound(d, 1)
k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key
If resBT(r, 1) = 1 Then 'only proceed with trials with 1 button press
dBT(k) = dBT(k) + IIf(d(r, COL_AOI) = "AOI Entry", 1, 0) 'get count
Else: dBT(k) = ""
End If
Next r
'populate array with appropriate counts for each row
For r = 1 To UBound(d, 1)
k = d(r, 1) & "|" & d(r, 2) 'create key
resBT(r, 1) = dBT(k) 'get the count
Next r
'place array to sheet
sht.Range("U7").Resize(UBound(resBT, 1), 1) = resBT
Call createsummarytable
Call PopSummaryAOI(dBT)
dBT.RemoveAll
'retrieve and print reaction times to data summary sheet
For r = 1 To UBound(d, 1)
If resBT(r, 1) <> "" Then 'if buttonpresscount = 1 and AOI count exists
k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key
dBT(k) = d(r, COL_RT)
End If
Next r
'Populate array with last row reaction time for each trial
For r = 1 To UBound(d, 1)
k = d(r, 1) & "|" & d(r, 2) 'create key
resBT(r, 1) = dBT(k) 'get the count
Next r
Call PopSummaryRT(dBT)
dBT.RemoveAll
'work out avg fixation time per trial
For r = 1 To UBound(d, 1)
If resBT(r, 1) <> "" Then
k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key
dBT(k) = Application.AverageIf(d(r, COL_FT), (d(r, COL_AOI) = "AOI Entry"))
End If
Next r
'populate array
For r = 1 To UBound(d, 1)
k = d(r, 1) & "|" & d(r, 2) 'create key
resBT(r, 1) = dBT(k) 'get the count
Next r
Call PopSummaryFT(dBT)
End Sub
die obigen Makro Bezug, werden die folgenden Codezeilen gemeint pro dict einen Durchschnitt der Werte in Spalte R arbeiten (key) (sprich: pro Versuch):
For r = 1 To UBound(d, 1)
If resBT(r, 1) <> "" Then
k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key
dBT(k) = Application.AverageIf(d(r, COL_FT), (d(r, COL_AOI) = "AOI Entry"))
End If
Next r
Dies führt dazu, dass #VALUE!
in den relevanten Zellen statt der erwarteten Zahl gedruckt wird.
Was ist der Grund dafür? Was ist der richtige Weg, um diese Formel zu kodieren?
Ihre Linie 'dBT (k) = Application.AverageIf (d (r, COL_FT), (d (r, COL_AOI) = "AOI Entry"))' in der Zelle den Mittelwert des Wertes nimmt in Zeile 'r + 6', Spalte R, wenn dieser Wert 'True' ist (wenn der Wert in Zeile' r + 6', Spalte I, ist "AOI Entry" ') oder' False' (wenn der Wert in Reihe 'r + 6', Spalte I, ist nicht" AOI Entry "'). Das wird immer einen Division-by-Zero-Fehler erzeugen (da Sie keine 'True'- oder' False'-Werte haben), so dass dies zweifellos Ihren '# VALUE'-Fehler erzeugt. In der Regel wird ein Durchschnittswert über mehrere Werte hinweg berechnet - welche Werte versuchen Sie zu mitteln? – YowE3K
Versuchen Sie einfach, ein VBA-Äquivalent einer Formel (in der Zelle T7 zum Beispiel) von '= AVERAGEIFS ($ R: $ R, $ I: $ I," AOI Entry ", $ B: $ B, $ B7) zu generieren , $ C: $ C, $ C7) '? – YowE3K
@ YowE3K Ich möchte den Durchschnitt der Werte in Spalte R, aber nur diejenigen, die in Zeilen sind, die "AOI-Eintrag" in Spalte I haben. Sagen Sie, das Problem ist mit, wie ich das Einschlusskriterium definiert habe? – shecodes