Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 范围对象的VBA特殊单元格方法失败_Excel_Vba - Fatal编程技术网

Excel 范围对象的VBA特殊单元格方法失败

Excel 范围对象的VBA特殊单元格方法失败,excel,vba,Excel,Vba,我已经建立了一个二维数组,我想计算每个块中每个试验在H列中填充的细胞数。然后,我想将每个试验的最后一行数据旁边的填充单元格数打印到T列中 我遇到的问题是,当我尝试运行宏时,Excel停止响应,重新启动后,我在标题中收到错误消息 代码如下: Sub dotcountanalysis2() ' create multidimensional array Dim Participant() As Variant Participant = Worksheets("full test").Range(

我已经建立了一个二维数组,我想计算每个块中每个试验在H列中填充的细胞数。然后,我想将每个试验的最后一行数据旁边的填充单元格数打印到T列中


我遇到的问题是,当我尝试运行宏时,Excel停止响应,重新启动后,我在标题中收到错误消息

代码如下:

Sub dotcountanalysis2()
' create multidimensional array
Dim Participant() As Variant

Participant = Worksheets("full test").Range("A7", Range("S:S")).Value

Dim Block As Variant
Block = Columns(2)

Dim Trial As Variant
Trial = Columns(3)

' define column H as boolean variable

Dim Pressed As Boolean
Pressed = True

' begin analysis after practice trials
For Each Block In Participant
    For Each Trial In Participant
    pressedcount = Range("H:H").Cells.SpecialCells(xlCellTypeConstants).Count
        If Cells(, 8) = Pressed Then
        Range("T:T").Value = pressedcount
        End If
    Next Trial
Next Block

End Sub
错误在线:

pressedcount = Range("H:H").Cells.SpecialCells(xlCellTypeConstants).Count
我也不确定我的语法是否正确,以使它在每次试验中都能计数,因为我已经尝试进入代码,它在H列(562)中给出了填充单元格的总数,并在T列的每个单元格中打印出来。我认为它也超过了我拥有的7011行数据,达到了最大可能的行数


最相关的问题可能是您创建了一个巨大的变量值数组,然后在其值之间循环两次

参与者
数组包含1048576*19=19922944个值。(假设工作表中有1048576行)

现在循环这些值,对于每个值,再次循环每个值,给出19922944*19922944=396923697627136次迭代。这就是为什么excel没有响应

但是,在每次迭代中,您甚至不使用值

如果要计算H列中按下的
的数量并将该数量写入T列,为什么要将A列到S列的所有值加载到数组中

下面是我在VBA中要做的

Dim pressedCount As Long
Dim myCell As range
Dim pressedRange As range

With Worksheets("full test")
    pressedCount = Application.WorksheetFunction.CountA(.Columns("H"))
    If pressedCount = 0 Then Exit Sub 'make sure there are cells or else the next line will fail
    Set pressedRange = .Columns("H").SpecialCells(xlCellTypeConstants)
    For Each myCell In pressedRange.Cells 'only loop through the cells containing something
        .Cells(myCell.Row, "T").Value = pressedCount
    Next myCell
End With
我将
块一起使用,因此我不必在每个范围之前写入工作表,因为否则它假定您指的是活动工作表。 注意,这假设H列中除了“按下”之外没有其他值,甚至没有标题。如果有标题,从第2行开始,使用
.Range(.Cells(2,“H”),.Cells(.Rows.Count,“H”)
而不是
.Columns(“H”)


但是,这也可以通过使用类似于
=IF($H7=“Pressed”,COUNTA(H:H),”)

的公式来实现。嘿,除非文件包含任何类型的个人/机密数据,否则请附加该文件。重新启动后,我会在标题中看到错误消息“这是否意味着重新启动并再次运行宏后,会出现错误?”?H列中是否有常量,或者在重新启动(不保存)后是否会重置这些常量?@salih0vicX我不确定如何附加整个文件。@arcadeprecinct当我重新打开宏文件时,会立即弹出错误消息,我不需要重新运行代码。H列中没有任何更改,只是T列中打印了计数。您正在尝试运行396923697627136次迭代,并且在每次迭代中都没有使用当前值。你需要重做循环部分。计算
在循环前按count
,然后循环行。如果要使用数组,请获取H列的数组,直到使用的范围结束,然后遍历它以查找按下的
值。你需要使用一个索引变量,因为你将无法获得每个要写入工作表的
循环在
中的当前位置。嗯@arcadeprecinct这是我到目前为止最接近我想要的,但仍然不是很接近。我之所以设置这个数组,是因为我需要将数据分成30个块,每个块包含18个试验,并且需要知道每个试验的按下计数,它应该只有1-2。经过修改后,它现在正在打印正确行中的数字,但它打印的是总按下次数,而不是每个试块按下的次数。你上次评论使用索引变量是什么意思?excel完全不知道你所说的“试块”是什么意思。我认为您需要使用for循环(不是针对每个循环),并将我的代码一次应用于18行,而不是整个H列。for循环的step选项可能很方便,还可以通过其第一个和最后一个单元格引用一个范围。每个试验占用多行数据,因为一行代表试验中的一个事件,而且审判中的事件数量变化不可预测。在我的“fulltest”文件的模块1中,我尝试通过分别减小每个试验和块并使用For-each循环来设置一个数组。它不起作用。我想我需要类似“for(范围名称)(在此处插入代码)”的代码,并且我必须将范围命名为类似于“(范围名称)=单元格(,3)。value=“Trial,1””。听起来怎么样?