我的字典不能正常工作

我正在使用字典对象进行sorting和计数值,并将其打印到工作表。 其他人帮我编写代码,这对我来说好像是巫术。

在我的数据中,我有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 

以下是我的一些数据的截图:

以下是汇总表的截图:

在这里输入图像说明

我如何获得代码仍然忽略练习块,但分析传输块?

我遇到的第二个问题是(如果你看看我的第二个截图,在方块29的试验10)即使有一个为AOIentries打印的值,一些反应时间值也不会被打印。

对于那些有兴趣查看示例数据和源代码以及子macros的用户,请点击这里。

更新:我一直在试图find一个关于在汇总表中缺less反应时间值的模式 – 丢失的RT值只出现在有其他缺失的AOIentries和RT值的块中。 也就是说,当一个块有一个空白的AOIentries和RT配对时,总会有另一个RT值丢失。 在没有空白的AOIentries值的块中,没有缺失的RT值。 因此,将一个AOIentries单元格留在特定的块中会导致多个RT值留空,但只会在该块中,而不是该块中的每个RT值。

另外,不应该缺失的RT值总是来自在排除了AOI入口值的试验之前出现的试验(试验呈现在每个块中被随机化)。 例如,如果试验17有两个button,则试验17的AOI入口值和RT值将留空,但如果试验6是试验17之前的试验,则其RT值也将是空白的。

这里:

  '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数据(您正在testingresBT(r, 1) = 1以确定是否在字典中空白该位置)有一个值。 这就是在汇总数据中造成“差距”的原因。

至于你的“转移”试验,在你的数据,你有这个标签:

 Block Trial Transfer Block 2 Transfer trial, 3 

在你的汇总表上是这样的:

 Block Trial Transfer Block 2 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 

很难跟踪正在发生的事情

但你可以尝试改变:

 '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