사전 개체를 사용하여 값을 정렬하고 카운트 한 다음 시트에 인쇄합니다. 다른 사람이 코드를 작성하는 데 도움이되었으므로 많은 부분이 저에게 요술처럼 보입니다.내 사전이 제대로 작동하지 않습니다.
내 데이터에는 각각 30 개의 블록이 있으며 18 개의 시도가 있습니다. 30 블록 전에 연습 블록이 1 개 있고 30 블록 후에 10 개의 전송 블록이 있습니다. 모든 코드는 전송 블록을 포함하지 않는 데이터 샘플을 사용하여 작성되었지만 다른 데이터 파일을 전송 블록을 포함 할 원본 파일에 복사/붙여 넣으려고합니다.
어떻게 든 내 코드는 연습 블록 (내가 원하는 것)을 무시하는 것을 알고 있지만 데이터를 복사/붙여 넣을 때 전송 블록을 무시합니다. 왜 코드가 이런 식으로 행동하는지 잘 모르겠습니다. 내가 코드를 얻는 방법
:
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
Dim rng As Range, lastrow As Long, sht As Worksheet
Dim d, r As Long, k, resBT()
Set sht = Worksheets("full test")
lastrow = 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
k = d(r, COL_BLOCK) & "|" & d(r, COL_TRIAL) 'create key
dBT(k) = d(r, COL_RT)
Else: dBT(k) = ""
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)
End Sub
다음
는 요약 테이블의 스크린 샷입니다 : 여기
은 사전 개체에 대한 코드입니다 여전히 연습 블록을 무시하지만 전송 블록을 분석합니까?내가 가진 두 번째 문제점은 AOIentries에 인쇄 된 값이 있더라도 일부 반응 시간 값이 인쇄되지 않는다는 것입니다 (두 번째 스크린 샷을 보면 29 번 블록의 시험 10 참조). 샘플 데이터와 소스 코드뿐만 아니라 submacros보고에 관심이있는 사람들을 위해
, here it is.업데이트 : 나는 요약 테이블에서 누락 된 반응 시간 값에 관해서 패턴을 찾기 위해 노력 해왔다 - 누락 된 RT 값은 누락 된 AOIentries 및 RT 값이있는 블록에만 나타납니다. 즉, 블록에 빈 AOIententries 및 RT pairing이있는 경우 항상 다른 RT 값이 누락됩니다. 블랭크 AOIentries 값이없는 블록에서 누락 된 RT 값은 없습니다. 따라서 특정 블록에 AOIentries 셀을 비워두면 둘 이상의 RT 값이 공백으로 남게되지만 블록의 모든 RT 값이 아닌 해당 블록에서만 비워집니다.
또한 누락 된 RT 값은 항상 AOIentries 값이 제외 된 평가판 직전에 나타나는 평가판에 있습니다 (시험판 프레젠테이션은 각 블록에서 무작위로 지정됩니다). 예 : 평가판 17에 2 번 버튼이있는 경우 평가판 17의 AOIentries 값과 RT 값은 비워 두지 만 평가판 6이 평가판 17 바로 이전 평가판 인 경우 빈 RT 값을 갖습니다.
사전 개체를 사용하면'.Add (Key, Value)'를 사용할 수 있습니다. 귀하의 코드는 일반 배열처럼 취급합니다. [MS ref] (https://msdn.microsoft.com/en-us/library/x4k5wbx4 (v = vs.84) .aspx)를 참조하십시오. – PatricK
원본 데이터와 다른 하위가 없으면 쉽게 이해할 수 있습니다. Dropbox 등을 통해 통합 문서를 공유 할 수 있다면 도움이 될 것입니다. –
원본 데이터와 하위 매크로를 포함하도록 편집했습니다. 그리고 왜 누군가 내 말장난을 편집하겠습니까 ??? – shecodes