2016-09-22 16 views
1

2次元配列を設定しましたが、各ブロックの各試行で列Hの塗りつぶされたセルの数を数えたいと思います。その後、各試行の最後の行の横にある塗りつぶしたセルの数を列Tに印刷します。範囲オブジェクトのVBA特殊セルメソッドが失敗しました

問題は、マクロを実行しようとすると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のすべてのセルに表示します。可能な最大行数。

Here is a sample of my data

+0

ねえのような式を使用して達成することができ、行2から開始し、代わりに、しかし、この.Columns("H")

.Range(.Cells(2, "H"), .Cells(.Rows.Count, "H"))を使用機密データですか? – salih0vicX

+0

"を再起動すると、タイトルにエラーメッセージが表示されます。つまり、マクロを再起動して再度実行すると、エラーが発生しますか?列Hに定数があるか、再起動後に(保存せずに)リセットされますか? – arcadeprecinct

+0

@ salih0vicXファイル全体を添付する方法がわかりません。 – shecodes

答えて

1

最も関連の問題は、おそらくあなたはそれの値を2回の値の巨大なバリアント配列を作成し、ループという事実です。

Participantアレイには1048576 * 19 = 19922944の値が含まれています。

これらの値をループして、各値についてループを繰り返すと、19922944 * 19922944 = 396923697627136回の繰り返しが発生します。だからこそ、Excelは反応しません。

ただし、各繰り返しで値...を使用しないでください...?

列Hにその数字Pressedを計算し、その数値を列Tに書き込む場合は、すべて列の値を配列にロードするのはなぜですか?ここで

は私はあなたがそうでなければ、それはあなたがアクティブなシートを意味すると仮定しなければならないので、すべての範囲の前にシートを記述する必要はありませんので、私はWithブロックを使用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に "Pressed"以外の値がないことを前提としています。ヘッダがある場合は、それは個人のいずれかのタイプが含まれていない限り、あなたの嘆願は、/ファイルを添付することができ、また=IF($H7="Pressed",COUNTA(H:H),"")

+0

よく@arcadeprecinctこれは私が今までに望むものに最も近いが、まだそれほどではない。私がアレイをセットアップした理由は、データを30回の18回の試行に分割する必要があり、試行ごとに押された回数を知る必要があるからです。あなたの修正では、今すぐ右の行に番号を印刷していますが、ブロックあたりの試行ごとに押されるのではなく、押された合計数を表示しています。インデックス変数の使用に関する最後のコメントではどういう意味ですか? – shecodes

+0

よくお試しとブロックで何を意味するのか分かりません。私はあなたがforループ(それぞれではない)を使用して、列全体ではなく、一度に18行に自分のコードを適用する必要があると思うforループのステップオプションは便利で、細胞。 – arcadeprecinct

+0

トライアルでは、1つの行が1つのイベントを表し、トライアルのイベント数が予期せず変化するため、各トライアルは多数のデータ行を占有します。私の "fulltest"ファイルのモジュール1では、各試行とブロックを別々にDimingし、For Eachループを使って配列を設定しようとしました。それはうまくいかなかった。私は '(範囲の名前)(ここにコードを挿入)'のようなコードが必要だと思います '(範囲の名前)=セル(、3)のような範囲に名前を付ける必要があります。 ).value = "Trial、1" '。それはどうやって聞こえる? – shecodes

関連する問題