이것은 내 데이터의 스크린 샷입니다. 위의 매크로를 참조 AverageIf 함수 결과가 "# 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
는 다음 코드 줄이 DICT 당 열 R (키)의 값의 평균을 해결하기위한 것입니다 (: 시험 당 읽기) :
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
이로 인해 예상되는 숫자가 아닌 #VALUE!
이 관련 셀에 인쇄됩니다.
? 이 수식을 코딩하는 올바른 방법은 무엇입니까? 라인
dBT(k) = Application.AverageIf(d(r, COL_FT), (d(r, COL_AOI) = "AOI Entry"))
와
내 광고 'DBT는 (K) = Application.AverageIf (d는 (R은 COL_FT), (d (R, COL_AOI) = "AOI 항목"))'셀의 값의 평균을 취하고 행'r + 6', 열 I의 값이'''AOI Entry''이면 값이 True이면'r + 6' 행의 열 R에 위치한다. 행'r + 6', 열 I는''AOI Entry ''가 아닙니다. 그것은 항상 'True'나'False' 값이 없으므로 제로 에러에 의한 나눗셈을 생성 할 것이기 때문에 의심 할 여지없이'# VALUE' 오류가 발생합니다. 일반적으로 평균은 하나 이상의 값에 대해 수행됩니다. 어떤 값을 평균하려고합니까? – YowE3K
'= AVERAGEIFS ($ R : $ R, $ I : $ I, "AOI Entry", $ B : $ B, $ B7)의 수식 (예 : 셀 T7)에 해당하는 VBA를 생성하려고합니까? , $ C : $ C, $ C7)'? – YowE3K
@ YowE3K 열 R에 값의 평균을 원하지만 열 I에 "AOI Entry"가있는 행에있는 값만 원합니다. 포함 기준을 정의한 방법에 문제가 있다는 말입니까? – shecodes