2016-12-06 3 views
1

사전 개체를 사용하여 값을 정렬하고 카운트 한 다음 시트에 인쇄합니다. 다른 사람이 코드를 작성하는 데 도움이되었으므로 많은 부분이 저에게 요술처럼 보입니다.내 사전이 제대로 작동하지 않습니다.

내 데이터에는 각각 30 개의 블록이 있으며 18 개의 시도가 있습니다. 30 블록 전에 연습 블록이 1 개 있고 30 블록 후에 10 개의 전송 블록이 있습니다. 모든 코드는 전송 블록을 포함하지 않는 데이터 샘플을 사용하여 작성되었지만 다른 데이터 파일을 전송 블록을 포함 할 원본 파일에 복사/붙여 넣으려고합니다.

어떻게 든 내 코드는 연습 블록 (내가 원하는 것)을 무시하는 것을 알고 있지만 데이터를 복사/붙여 넣을 때 전송 블록을 무시합니다. 왜 코드가 이런 식으로 행동하는지 잘 모르겠습니다. 내가 코드를 얻는 방법

enter image description here

:

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 
다음

Here is a screenshot of some of my data:

는 요약 테이블의 스크린 샷입니다 : 여기

은 사전 개체에 대한 코드입니다 여전히 연습 블록을 무시하지만 전송 블록을 분석합니까?

내가 가진 두 번째 문제점은 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 값을 갖습니다.

+0

사전 개체를 사용하면'.Add (Key, Value)'를 사용할 수 있습니다. 귀하의 코드는 일반 배열처럼 취급합니다. [MS ref] (https://msdn.microsoft.com/en-us/library/x4k5wbx4 (v = vs.84) .aspx)를 참조하십시오. – PatricK

+0

원본 데이터와 다른 하위가 없으면 쉽게 이해할 수 있습니다. Dropbox 등을 통해 통합 문서를 공유 할 수 있다면 도움이 될 것입니다. –

+0

원본 데이터와 하위 매크로를 포함하도록 편집했습니다. 그리고 왜 누군가 내 말장난을 편집하겠습니까 ??? – shecodes

답변

1

여기 :

'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 

당신 해제됩니다 dBT(k) 이전에 AOI 데이터 값이있는 경우 (resBT(r, 1) = 1을 테스트하여 사전에서 해당 위치를 비워 둘지 여부를 결정하는 경우) 이것이 바로 요약 데이터에서 "틈"을 만드는 것입니다. 당신의 "전송"시험에 관해서는

, 데이터에이 라벨이 : 당신이하려고 할 때 그래서이 일치하지 않는

Block    Trial 
Transfer Block 2 Trial, 3 

을 : 당신의 요약 시트에

Block    Trial 
Transfer Block 2 Transfer trial, 3 

그것을이 있어요 요약

을 채우는 것은 createsummarytable이 변화를 확인하고 데이터를 채 웁니다 :

,
'print trial number headings 
For j = 1 To 18 
    .Cells((Startrow + 1) + (5 * i), j).Value = IIf(i < 31, _ 
            "Trial, " & j, _ 
            "Transfer trial, " & j) 
Next j 
+0

mg입니다. 그래서 그냥 나를 괴롭히는 'else' 문을 포함 시켰습니다! 그건 망할거야! 분석에 이전 시험을 포함시키는 방법을 설명 할 수 있습니까? – shecodes

+0

"전송"상황에서 어떤 일이 벌어지고 있는지 잘 모르겠습니다. 링크 된 파일에 예제 데이터가 없습니다. 코드는 "Practice"실행을 무시하지 않습니다. 단지 요약 시트에 나열하지 않은 것입니다. –

+0

yer 죄송합니다. 전송 블록이없는 원본 데이터 파일을 보냈습니다. 내 모든 다른 파일에는 파일이 있고, 나는 그 파일을 원래 파일에 복사/붙여 넣기 만하므로 모든 코드 모듈을 35 번 복제 할 필요가 없습니다. [여기에 예제가 있습니다.] (http://www.filedropper.com/dotcountingpp1_1). 전송 블록은 요약 시트에 나열되어 있습니다.또한, AOIententries를 계산하는 코드가 반응 시간 코드와 동일한 'if else' 문을 사용하지만 동일한 이상한 행동을하지 않는다는 것이 흥미 롭습니다. – shecodes

0

에서 일어나는하지만 변경하려고 할 수 있습니다 팔로우하기 매우 어렵 :

'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 

에 :

'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 And Left(resBT(r, 1), 8) <> "Transfer" Then 'only proceed with trials with 1 button press and not from a "Transfer" block 
     dBT(k) = dBT(k) + IIf(d(r, COL_AOI) = "AOI Entry", 1, 0) 'get count 
     Else: dBT(k) = "" 
     End If 
    Next r 
+0

나는 실제로 그것이 전송 블록 (단지 연습 블록이 시작에서)으로 진행되기를 원한다. 그러나 현재 전송 블록이 진행되지 않습니다. 이유는 모르겠다. 나는 따라하기가 어렵다는 것을 알았다. DICT는 COL_BLCOK와 COL_TRIAL을 사용하여 키를 만들었지 만, 어떻게 든 COL_BLOCK의 일부 값을 키하지만 다른 키는 키를 사용하지 않습니다. – shecodes

+0

나는 기억이 안나고 샘플 파일을 가지고 있지 않다. 내가보기로하면 모든 것을 보게 될 것이다. –

+0

@TimWilliams 샘플 파일은 질문 하단의 링크에 있습니다. [여기는 다시] (http://www.filedropper.com/fulltest_2) – shecodes

관련 문제